最近使用bk2461无线单片机, 由于单片机内部没有掉电不丢失存储空间,需要外挂一个eeprom,使用i2c通信。找了原厂要了i2c的demo程序,但是搞了几天才搞定,现在把遇到的问题列出了。
1. gpio初始化
scl , sda 设置为输出,不开漏 (这个需要根据实际电路选择,如果没有接上拉电阻,则GPIO必须设置为上拉。如果接了上拉电阻,则GPIO可以设置为上拉,也可以设置为开漏)
2. start 需要将scl sda 置1
void IIC_Start(void)
{
//if(NVR_RW_ENABLE_Word!=ENABLE_NVR_RW)
//return;
SDA_DIR_OUT();
SDA=1;
delay(1);
SCL=1;
delay(1);
SDA=0;
delay(1);
SCL=0;
}
3. write eeprom完之后需要间隔一段时间之后才能read, 间隔时间设置为10ms左右(我在测试i2c代码的时候,是先往eeprom中写入一段数据,然后再读取数据,判断是否是正确的。但是我在读和写直接没有时间间隔,导致一直读取到错误的数据)
4. 延时是可变的 delay(1)~delay(10),这个根据单片机的晶振调整,我的单片机是16M
void delay(uint8 dly){
while(dly-->0);
}
5. 在read eeprom过程中,在写完device addr和reg addr之后,和在写下一个device的时候,可以发送停止信号,也可以不发送停止信号
if(_TxByte(devAddr<<1))return(0);
//regAaddr
if(_TxByte(regAaddr))return(0);
I2C_STP(); //这里的停止可要可不要
delay(10);
I2C_SB();
//devAddr
if(_TxByte((devAddr<<1)|1))return(0);
6, 在读写eeprom时候,需要将最好将定时中断关掉,在有些场合下有可能会影响读写时序,从而导致读写失败