【I²C总线通信协议总结】
I²C总线通信协议
(1)I²C概述
I²C(Inter-Intergrated Circuit)集成电路总线,该总线是由飞利浦公司在1980年代初设计出来的。主要是用来连接整体电路,是一种多向控制总线,也就是说多个器件可以连接到同一总线结构下,同时每个器件都可以作为实施数据传输的控制源。
I²C属于半双工同步串行通信方式。
(2)I²C硬件拓扑结构
I²C总线一般有两根线,一个是双向传输的数据线(SDA),另一个是时钟线(SCL),所有接到I²C总线设备上的串行数据线SDA都接到总线的数据线SDA上,各设备的时钟线SCL都接到总线的时钟线SCL上。硬件连接如下图1所示,数据线SDA与时钟线SCL都通过一个上拉电阻连接到电源,初始电平都为高电平,处于空闲状态。每个连接到I²C总线的元器件都有唯一的地址。
(3)I²C协议
I²C总线在数据传输过程中时钟线SCL始终由主机控制,数据传输期间共有三种信号产生:开始信号,停止信号和应答信号。简单概况如下:
①数据有效性
在时钟线SCL高电平期间内,数据线SDA上的数据必须保持稳定,数据线SDA的数据仅允许在时钟线SCL为低电平时改变,如下图2所示。
②开始信号
当时钟线SCL处于高电平期间,数据线SDA产生由高电平向低电平的跳变,如下图3所示。
③停止信号
当时钟线SCL处于高电平期间,数据线SDA产生由低电平向高电平的跳变,如下图3所示。
④应答信号
总线上的接收器每收到一个字节(8bit)就产生一个应答信号ACK。接收器拉低数据线SDA表示应答,并在应答脉冲期间保持稳定的低电平。若主器件作为接收器时,必须发送数据传输结束的信号给发送器,即它在接收最后一个字节数据的应答脉冲期间不会产生应答信号(NACK,不拉低数据线SDA),如下图4所示。
⑤数据帧格式
I²C总线传输的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在开始进行数据传输时,主机发出开始信号后,先传输一个器件地址(共7位,前4位是固定,后3位由硬件决定,即同一设备上可接8个同一器件)以及一位读/写位("0"表示主机发送数据W,"1"表示主机接收数据R),再传输一个字节地址(8位,用来选择从器件内部的第几个字节读/写),最后传输数据。每次数据传输总是由主机发出停止信号而结束。
1)主机向从机发送数据(以E²PROM为例)
1、主机发送起始信号;
2、主机发送从器件地址以及读/写位("0"),主机释放总线,等待从器件应答;
3、主机发送需写入的内部寄存器地址,等待从器件应答;
4.、主机发送数据
5、主机发送停止信号
6、E²PROM收到停止信号之后,内部进入写周期,大概需要5ms,此期间之内任何操作都不会被E²PROM响应(因此以这种方式的多次写入,需要插入一个延时,否则会导致失败);
注:阴影部分由主机向从机传送,无阴影部分表示从机向主机传送。A表示应答信号(低电平),Ā表示非应答信号(高电平);START表示起始信号,STOP表示停止信号。
2)主机向从机读取数据(以E²PROM为例)
1、主机发送起始信号;
2、主机发送从器件地址以及读/写位("0"),主机释放总线,等待从器件应答;
3、主机发送需写入的内部寄存器地址,等待从器件应答;
4、主机再次发送起始信号,即Restart;
5、主机发送从器件地址以及读/写位("1"),主机释放总线,等待从器件应答;
6、主机读取数据。主机在接收到最后一个字节数据后,不会发出应答ACK信号,于是从器件释放数据线SDA,以允许主机发送停止信号;
7、主机发送停止信号