当前位置: 首页 > 工具软件 > bk-ci > 使用案例 >

bk2461 使用i2c驱动eeprom at24c02

钮巴英
2023-12-01

    最近使用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时候,需要将最好将定时中断关掉,在有些场合下有可能会影响读写时序,从而导致读写失败

 

 类似资料: