|
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;
}
/****
......省略无关代码......
*****/
}
|
|