微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用Proteus学习51单片机之I2C(IIC)总线

用Proteus学习51单片机之I2C(IIC)总线

时间:11-19 来源:互联网 点击:
在学习单片机的过程中,我常有这样的烦恼:随随便便一个芯片,少则占用三五个IO口,一般的就占用8个,稍微想用多一点芯片吧,老觉得IO口不够用。学串口的时候觉得串口是个好东西,连两条线就够了,现在学到I2C,觉得这也是一个非常好的东西,也是两条线,还能给每个总线上的设备设立地址,简直就是一个小网络了。

I2C总线使用两条线,一条是时钟线,称为SCL,一条是数据线,称为SDA,各个设备就并在总线上,每一个总线上的设备都有一个自己的地址,主机在操作设备的时候,都会先发送一个地址码,告诉被操作机,接下来的命令由它接收。

接下来说一下I2C总线的数据有效性。I2C总线进行数据传送时,要求SCL为高电平时,SDA上的数据必需保持稳定,换言之,当SCL为高电平时,SDA的电平不能变换,只有当SCL为低电平时,SDA的电平才能变。

I2C总线通信时,需要遵照一定的协议,以下为一次通信过程:

  1. 由主机发送起始信号,启动I2C总线。时序为,在SCL为高电平期间,SDA出现一个下降沿。
  2. 主机发送寻址信号,即告诉特定的设备,接下来的命令是发给它的。地址分为7位和10位,以7位为例,高7位为设备地址,最低位表示读或写,1表示读,0表示写。
  3. 应答信号,I2C协议规定,每传送一个字节数据(包括地址及命令)后,都要有一个接收设备返回的应答信号,以确定信号是否被接收设备正确接收到了。其时序为,在SCL信号为高电平期间,接收设备把SDA电平拉低。
  4. 数据传输,当主机发送发址并收到应答后,就可以发送数据了,但是发送数据只能每次发送一位,并且每发送一位后都需要收到接收机的应答。或主机为接收设备时,主机对最后一个字节不应答,表示向发送设备说,数据传送结束。
  5. 发送停止信号,在全部数据传送完毕后,主机发送停止信号,时序为,在SCL为高电平期间,SDA上产生一个上升沿。

    前面讲到,I2C协议要求数据的发送,要求SCL为低电平时,SDA才能变换,看一下上面的时序,可以看到,命令都是SCL为高电平时对SDA的操作,而发送数据则是SCL为低电平时对SDA操作。

    这次拿来做实验的是AT24C02存储芯片,在Proteus里面,它叫24C02C(或者24C02B),是一个2K bit的I2C总线的EEPROM存储器,换成电脑上常用的KB也就是256KB,EEPROM表示它保存了以后不用加电池,也能保持数据完好。实验的做法是,先把数据保存到芯片中,然后再读出来,显示到1602液晶上。

    上面介绍了I2C总线的协议格式,即发送一个命令的格式,但是对于每一个设备来说,要操作它,是需要很多命令的,AT24C02的操作则主要是读和写,它分为页读写(即一次读写一大片)和字读写(一次读写一个字节)两种方式,初学么,只使用字读写方式,下面记录一下读写的时序。

    首先是写数据,时序如下:

    1.发送启动信号

    2.发送一个控制字(即芯片的地址)——等待应答

    3.发送要写的芯片内存储单元地址——等待应答

    4.发送要写入的数据——等待应答

    5.停止信号

    接下来是读数据的时序:

    1.发送启动信号

    2.发送一个控制字(即芯片的地址,最低位为0即写操作)——等待应答

    3.发送要读取的芯片内存储单元地址——等待应答

    4.再发送一个地址信号(同第2步,但是最低位为1,即读操作)——等待应答

    5.按每次一位,读取数据

    6.停止信号

    I2C协议看起来相对复杂,但是在单片机里面实现,其实就是用两个IO口,来模拟SCL和SDA的电平变化。以启动I2C为例(在SCL为高电平时,SDA发送一个下降沿),代码如下:

    SDA = 1;//把SDA先置高电平,待会好出现下降沿

    delay();

    SCL = 1;//SCL要晚于SDA设置,否则容易和其他命令混淆

    delay();

    SDA=0;//电平从1到0,出现一个下降沿

    delay();

    ---------------------------------------------------------------------

    Proteus电路图如下,记得要在总线的两条线上,接上拉电阻(10K即可)

    结果如下:

    这里还得说一下I2C DEBUGGER这个虚拟仪器,真的是挺好用的,把它接在总线上后,它会把每一个命令都显示出来,并把操作属于哪一种操作都标识出来,以我往芯片存一个字符“H”为例:

    它把每一步都标的清清楚楚,特别说明一下的是,几个字符是有特殊意义的,如:

    S表是I2C总线-“开始”
    A---应答
    p---停止
    Sr--重启动

    所以第一行S A0 A 01 A 48 A p表示的意思是:启动I2C总线,发送数据A0(其实是芯片的地址),芯片应答,发送数据01(就是写入的地址),芯片应答,发送数据48(就是保存的数据),芯片应答,结束。看看,是否和前面说的流程一致?

    程序这里不贴了,下载里都有,

    Copyright © 2017-2020 微波EDA网 版权所有

    网站地图

    Top