xmayyang 发表于 2013-6-25 22:30:48

UBOOT i2c_init函数

TQ2440         UBOOT1.1.6    cpu/arm920t/s3c24x0/i2c.c
I2C初始化函数,我删除了与2440无关的部分
void i2c_init (int speed, int slaveadd)
{
        S3C24X0_I2C *const i2c = S3C24X0_GetBase_I2C ();
        S3C24X0_GPIO *const gpio = S3C24X0_GetBase_GPIO ();
        ulong freq, pres = 16, div;
        int i, status;

        /* wait for some time to give previous transfer a chance to finish */

        i = I2C_TIMEOUT * 1000;
        status = i2c->IICSTAT;
        while ((i > 0) && (status & I2CSTAT_BSY)) {
                udelay (1000);
                status = i2c->IICSTAT;
                i--;
        }
         此处应该是判断I2C总线忙的情况,问题:GetI2CSDA () == 0这个判断怎么理解,是判断SDA是否是高电平吗
        if ((status & I2CSTAT_BSY) || GetI2CSDA () == 0) {
                ulong old_gpecon = gpio->GPECON;

                /* bus still busy probably by (most) previously interrupted transfer */
                /* set I2CSDA and I2CSCL (GPE15, GPE14) to GPIO */
                 此处是把GPE15,14重新设置为输入、输出,为什么这么做
                gpio->GPECON = (gpio->GPECON & ~0xF0000000) | 0x10000000;

                /* toggle I2CSCL until bus idle */
             SetI2CSCL (0)作用是什么,是拉高SCL的意思吗
                SetI2CSCL (0);
                udelay (1000);
                i = 10;
                while ((i > 0) && (GetI2CSDA () != 1)) {
                        SetI2CSCL (1);
                        udelay (1000);
                        SetI2CSCL (0);
                        udelay (1000);
                        i--;
                }
                SetI2CSCL (1);
                udelay (1000);

                /* restore pin functions */
                gpio->GPECON = old_gpecon;
        }
       /****
               ......省略无关代码......
      *****/
}

亚瑟王 发表于 2013-6-26 09:33:41

建议将GetI2CSDA和SetI2CSCL函数阅读之后再看这个函数。
瞄了一下这个代码应该不是用的I2C接口,而是用GPIO模拟I2C的代码。

xmayyang 发表于 2013-6-26 11:05:55

GPIO模拟I2C是什么东东?为什么要用GPIO模拟I2C。难道2440没有I2C总线吗?
页: [1]
查看完整版本: UBOOT i2c_init函数