8.1 I2C总线概述
1. I2C总线介绍
I2C总线(Inter IC Bus)由PHILIPS 公司推出,是近年来微电子通信控制领域广泛采用的一种新型总线标准,它是同步通信的一种特殊形式,具有接口线少、控制简单、器件封装形式小、通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,所有与I2C兼容的器件都具有标准的接口,通过地址来识别通信对象,使它们可以经由I2C总线互相直接通信。
I2C总线由数据线 SDA 和时钟线 SCL两条线构成通信线路,既可发送数据,也可接收数据。在 CPU与被控IC之间、IC与IC之间都可进行双向传送,最高传送速率为400kbps,各种被控器件均并联在总线上,但每个器件都有唯一的地址。在信息传输过程中,I2C总线上并联的每一个器件既是被控器(或主控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU 发出的控制信号分为地址码和数据码两部分:地址码用来选址,即接通需要控制的电路;数据码是通信的内容,这样各IC控制电路虽然挂在同一条总线上,却彼此独立。
2. I2C总线硬件结构图
下图为I2C总线系统的硬件结构图,其中,SCL是时钟线,SDA是数据线。总线上各器件都采用漏极开路结构与总线相连,因此SCL和SDA 均需接上拉电阻,总线在空闲状态下均保持高电平,连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的 SDA 及 SCL 都是线“与”关系。
I2C总线支持多主和主从两种工作方式,通常为主从工作方式。在主从工作方式中,系统中只有一个主器件(单片机),其他器件都是具有I2C总线的外围从器件。在主从工作方式中,主器件启动数据的发送(发出启动信号),产生时钟信号,发出停止信号。
3. I2C总线通信格式
下图为I2C总线上进行一次数据传输的通信格式:
4. 数据位的有效性规定
I2C总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有时钟信号为低电平期间,数据信号的高电平或低电平才允许变化:
5. 发送启动(始)信号
在利用I2C总线进行一次数据传输时,首先由主机发出启动信号,启动I2C总线,在SCL为高电平期间,SDA出现下降沿(原书写错)为启动信号,此时,具有I2C总线接口的从器件会检测到该信号,启动时序如下图所示:
6. 发送寻址信号
主机发送启动信号后,再发出寻址信号。器件地址有7位和10位两种,这里只介绍7位地址寻址方式。寻址字节的位定义如下图所示,寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用以表明主机与从器件的数据传送方向。方向位为0,表明主机接下来对从器件进行写操作;方向位为1,表明主机接下来对从器件进行读操作:
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据 R/W位将自己确定为发送器或接收器。
从机的地址由固定部分和可编程部分组成。在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该IC总线系统中。
7. 应答信号
I2C总线协议规定,每传送一个字节数据(含地址及命令字)后,都要有一个应信号,以确定数据传送是否被对方收到。应答信号由接收设备产生,在SCL信号为高电平期间,接收设备将 SDA 拉为低电平,表示数据传输正确,产生应答,时序图如下图所示。
8. 数据传输
主机发送寻址信号并得到从器件应答后,便可以进行数据传输,每次一个字节,但每次都应在得到应答信号后再进行下一字节的传送。
9. 非应答信号
当主机为接收设备时,主机对最后一个字节不应答,以向发送设备表示数据传送结束。
10. 发送停止信号
在全部数据传送完毕后,主机发送停止信号,记在SCL为高电平期间,SDA上产生一上升沿信号,停止时序图如下图所示:
8.2 单片机模拟I2C
目前市场上很多单片机都已经具有硬件I2C总线控制单元,这类单片机在工作时,总线状态由硬件监测,无须用户介入,操作非常方便。但是还有许多单片机并不具有I2C总线接口,如51单片机,但可以在单片机应用系统中通过软件模拟I2C总线的工作时序,在使用时,只需正确调用各个函数就能方便地扩展I2C总线接口器件。在总线的一次数据传送过程中,可以有以下几种组合方式: