1、概述
IIC,即Inter-Integrated Circuit(集成电路总线),它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点。
I2C 总线 包括一条数据线(SDA)和一条时钟线(SCL)。协议允许总线接入多个器件,并支持多主工作。总线中的器件既可以作为主控器也可以作为被控器,既可以是 发送器也可以是接收器。总线按照一定的通信协议进行数据交换。在每次数据交换开始,作为主控器的器件需要通过总线竞争获得主控权,并启动一次数据交换。系 统中各个器件都具有唯一的地址,各器件之间通过寻址确定数据接收方。
2、I2C总线的系统结构
一个典型的I2C总线标准的IC器件,其内部不仅有I2C接口电路,还可将内部各单元电路划分成若干相对独立的模块,它只有二根信 号线,一根是双向的数据线SDA,另一根是时钟线SCL。CPU可以通过指令对各功能模块进行控制。各种被控制电路均并联在这条总线上,但就像电话机一样 只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I 2 C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器)。CPU发出的控制信号分为地址码和控制量(数据)两部分,地址码用来选址, 即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。I2C总 线接口电路如下图1所示。
图1 I2C总线接口电路
I2C 总线的器件分为主器件和从器件。主器件的功能是启动在总线上传送数据,并产生时钟脉冲,以允许与被寻址的器件进行数据传送。 被寻址的器件,称为从器件。一般来讲,任何器件均可以成为从器件,只有微控制器才能称为主器件。主、从器件对偶出现,工作在接收还是发送数据方式,由器件 的功能和数据传送方向所决定。
I2C总线允许连接多个微控制器,显然不能同时存在两个主器件,先控制总线的器件成为主器件,这就是总线竞争。在竞争过程中数据不会被破坏、丢失。数据只能在主、从器件中传送,结束后,主、从器件将释放总线,退出主、从器件角色。
3、IIC总线的数据传输
按IIC总线约定,起始信号表明一次数据传送的开始,其后为寻址字节,寻址字节由高7位地址和一位方向位组成,方向位表明主控器与被控器数据的传送方向,方向位为 "0" 表示 写,为 "1"表示读。
在IIC总线上传送的每一个字节均为8位,但每启动一次IIC总线,其后的数据传输字节数是没有限制的。每传送一个字节后都必须跟随一个应答位,并且首先发送的数据位为最高位,在全部数据传送结束后主控器发送终止信号
<1>主控器的写操作
主控器向被寻址的被控器发送N个数据字节,整个传输过程数据传送方向不变。其数据传送格式如下:
A:应答信号
S: 起始信号
P: 停止信号
SLAW:寻址字节(写)
DATA1 ~ DATAN :写入被控器的数据
<2>主控器的读操作
主控器从被控器中读出N个字节的操作,整个传输过程中除寻址字节外,都是被控器发送,主控器接收的过程
SLAR:寻址字节(读)
主控器发送停止信号前应发送非应答位,向被控器表明读操作结束。
<3>主控器的读写操作
在一次数据传输过程中需要改变传送的操作,这时起始信号和寻址字节都会重复一次,但两次读写方向正好相反
从上述数据传送格式可以看出以下几点:
1)、任何方式起始、停止、寻址字节都是由主控器发送,传送方向则遵循寻址字节中方向位的规定
2)、寻址字节只表明器件地址及传送方向,器件内部的数据字节的N个数据地址是由第一个数据字节地址进行加减得到
3)、每个字节传送都必须有应答信号(A 或 ~A) 相随
4)、iic总线被控器在接收到起始信号后都必须复位它们的总线逻辑,以便对将要开始的被控器地址的传送进行预处理
4、协议
1.空闲状态
I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。
2.起始位与停止位的定义:
- 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。
- 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。
3.ACK
发送器每发送一个字节,就在时钟脉冲9期 间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般 表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。
如下图逻辑分析仪的采样结果:释放总线后,如果没有应答信号,sda应该一直持续为高电平,但是如图中蓝色虚线部分所示,它被拉低为低电平,证明收到了应答信号。 这里面给我们的两个信息是:1)接收器在SCL的上升沿到来之前的低电平期间拉低SDA;2)应答信号一直保持到SCL的下降沿结束;正如前文红色标识所指出的那样。
4.数据的有效性:
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 我的理解:虽然只要求在高电平期间保持稳定,但是要有一个提前量,也就是数据在SCL的上升沿到来之前就需准备好,因为在前面I2C总线之(一)---概述一文中已经指出,数据是在SCL的上升沿打入到器件(EEPROM)中的。
5.数据的传送:
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。