这是我们组最近无意中发现的一个问题,是在NSS08Kit-R1开发板上玩的时候发现的。说明下,该开发板采用的是freescale的s08系列中的mc9s08ac16单片机,它的i2c接口连接了一个at24c02 eeprom,我们发现如果不断的复位单片机,时不时会导致eeprom在复位重新启动后,再也无法读写。最后定位问题原因是:在SDA处于0状态时,由于受到干扰或者复位,使IIC进入SDA为0,SCL为1的状态,复位后,初始化程序会再次初始化IIC模块,在刚初始化完成IIC就检测到总线状态时忙的状态(IIC1S_BUSY位),因此,即使复位N多次也不能解决总线的问题,因为问题出在从器件eeprom上,在初始化程序加上器件复位操作可以完成复位清总线忙信号。
解决的办法是:每次初始化i2c,不仅仅初始化单片机的i2c控制器,还要初始化从设备eeprom,确保两者均处于正确的初始状态。
大体步骤:
1、初始化连接AT24CXX的WP脚的端口为输出,并且置位该端口,进行写保护。
2、复位AT24CXX,这个步骤包括在SDA为1的时候,从SCL送出9个时钟,随后再给出一个启动信号,完成它的复位工作。
3、MC9S08AC16为主机,写入IICF,操作波特率
4、使能IIC,有选择的禁止或者使能中断
5、IIC1C_TXAK设为不发送应答信号,即置1。
文章评论(0条评论)
登录后参与讨论