1。对I2C写数据的时候,首先发一个停止信号,确保接下来发送新的数据保存至EEPROM。
2。发送起始信号
3。发送EEPROM设备地址
根据对应的EEPROM,规格书,以及线路图,发送地址。
根据线路图A0,A1,A2接地,表示 都是0,最后一位是写操作,则为1。
最终地址 是0XA0 |1
4。发送EEPROM数据地址,8位8位的发。
5。开始发送数据
6.完成之后,发送停止信号 .
如上图,在发送 0XA1的时候,在第九个时序,的下降沿,从机EEPROM会生成一个高电平。
如以此图更清晰,正好是第九个时序的下降沿,会出现这样一个锯齿形的高电平。
因为我的代码在写数据进EEPROM的时候,存在数据出错的问题。
一开始我以为这个锯齿形脉冲,就是从机返回的非应答信号。ACK信号。
所以我以为是我的应答函数出现了问题。
但是怎么改,这个锯齿波一直是在第九个时序的下降出现,然后,我翻阅规格书。
我用的AT24C32D-SSHM-T的EEPROM.,发现它的写时序 中也存在这样一个锯齿波。如下图
这么第一个锯齿波,规格书上也没有详细的说明。接着,我又翻阅其它EEPROM的。
以下是 AT24C02的规格书写时序 :
发现也有这样一个小尖波,如此,我就认为这不是偶尔的事情。随后,我查询资料,发现这样一片文章。
在ACK位有时候会出现一个小脉冲,不过这个脉冲出现在时钟的低电平,不会对IIC时序判决有影响。
为什么会出现这个脉冲呢?
ACK位一般标志着主机和从机对总线控制权的转换:
1、主机为发送端发送地址位,从机为接收端接收地址位;
2、主机发送写信号,需要往从机写数据;
3、从机接收到信号,响应,在这一个bit位,主机释放总线变为接收端,从机变为发送端获取总线控制权。之后再将控制权交还给主机,用于后面的写操作,这个交换的过程存在时间差,主机拉SDA晚了,就有可能出现上面这种情况(理论上讲,前一次交换也可能出现这种现象;如果是读操作,一般就观察不到这种现象了)。
经此,我才确定,我的写时序应该没有什么问题。
第二个有关EEPROM的问题。
我的程序 都已经调试完成,但换上新板子之后,数码管显示 36,(这应该是EEPROM存储单元的随机数)。因为我的程序 是在程序 启动的时候,进入读EEPROM,但因为掉电保护的问题,0-3的单元,调电时间一久,就出现保存不住的情况,所以,我将其换成了226-228,但是这三个单元从来没有进行写操作,出现的现象就是板子上电启动,数码管只显示一个3,这表面上就好像程序 没有运行一样。
随后我将其改回0-3,则恢复正常。
从而得出,如果EEPROM没有写之前 就去读,有可能出现未知的问题。还是先做一次写再说。