学习51单片机IIC控制24C02的过程
在大学时代,遇到一个练手项目,项目需要掉电保存数据。掉电怎么保存数据,都没电了(请原谅我当时是这么小白)
我们90以后的人,都有个特点,没事有事爱找度娘。一查,24C02,一看百度百科,好家伙,还真的可以掉电保存数据,好吧,突然感觉项目有突破点了,起码我找到要去做什么了。
看了一下24C02的资料,发现是通过IIC控制进行读写的。对于通信方式,我只知道IO高低电平,串口,AD,IIC又是什么鬼?(请原谅我当时是这么小白)
没办法,我们90后的人,都有一个特点,没事有事爱找度娘。什么是IIC?一查,哦,原来就是2个IO,一个叫做SDAI的IO做数据传递,另一个叫做SCL的IO做时序控制。什么嘛,吓我一跳,原来这么简单。
那IIC到底这么通信呢?没办法,我们90后的人,都有一个特点,没事有事爱找度娘。一查,原来一个完整的IIC通信就5个控制时序,start,send,ack,receive,stop,加上一个注意点:空闲时,二个IO都为高电平。
(1) start :就是在 SCL 高电平的时候,SDA由高拉低
(2)send : 在SCL低电平的时候,SDA准备好数据,然后SCL拉高,此时从机读取SDA的电平,这样就成功传递一个bit 的数据,连续8次,完成一个byte的数据。
(3)ack:应答信号,不管是send动作,还是receive动作,在完成8个脉冲之后,第九个脉冲就是作为ack应答信号,应答时,在SCL低电平时,SDA准备好数据(低电平为应答,高电平为不应答),然后SCL拉高,读取SDA信号,如果为低电平,说明通信成功。
(4)receive :在SCL低电平的时候,从机SDA准备好数据,然后SCL拉高,此时主机读取SDA的电平,这样就成功传递一个bit 的数据,连续8次,完成一个byte的数据。
注意(2)(3)(4),都是在SCL低电平的时候,SDA准备好数据,SCL高电平的时候,读取SDA的数据。换句话来说,SCL拉低,我们在SDA上面更新一个bit的数据,SCL拉高,我们在SDA上面读取一个bit的数据
(5)stop :就是在SCL高电平的时候,SDA由低拉高 。 和start刚刚相反。
完了。
说这么多废话,最重要编程。我不废话了,提供完整的C51单片机IIC读写24C02的程序,还有仿真。
仿真图如下 :
仿真图
说明一下,24C02的地址硬设为0xA0。右上角,是一个示波器,用来看IIC的波形的。右下角是IIC分析仪,用来看一次完整的IIC通信的数据和时序。
程序如下,飞飞自己写的
仿真结果 :
仿真结果
最后是绿灯的,说明写入数据,和读取数据都没问题
看一下波形:
IIC波形
你们可能不知道,我有强迫症。以前用别人写的模拟IIC程序, 看到SCL的波形,高电平和低电平一大一小,非常不习惯。你看我这波形,高低电平的时间,几乎是1:1,波形看着好舒服。
看一下IIC分析仪的数据:
看中间二行,上面的是在FE的地址,写入数据FE, 下面的是在00地址,读取到数据00。