这两天在看I2C,为了加深印象,准备用51软件模拟I2C的时序,折腾了一天,终于算是成功了,把我遇到的一些问题写出来吧。

最先遇到的问题是AT24C02的操作时序,AT24C02内部有一个指针,指向储存空间的某一个字节,另外AT24C系列支持页操作,对于AT24C02一个页是8字节,也就是说地址的高5位是页地址,在同一次写入中,页地址不变,低3位地址一次增加,当增加到7之后再加1就变成0了,而由于页地址不变,相当于指针回到了页首,如果继续写那前面的内容会被覆盖。写数据的时序,先是I2C的开始信号,发送设备地址,之后写入希望写入的数据地址,然后依次写入数据。当然,可以只写一个字节的数据。

对于读取,是不存在页的概念的,时序是先发送启动信号,然后发送设备地址(注意,是写设备的时候的地址,也就是说最低位是1),接着发送数据地址,完了之后重新发送一次启动信号,接着就可以读取了,读取完一个字节的数据后要发送一个ACK,对于最后一个字节的数据要发送一个NACK来告诉AT24C数据已经接收完毕,之后发送结束信号断开连接即可。也可以只接收一个数据,这时候一个ACK都没有,第一次接收好直接发送一个NACK。