基础通信协议之 IIC (I2C) 详细讲解
原文地址:https://blog.csdn.net/qq_39829913/article/details/104718185
IIC是当今嵌入式应用中最常见的串行通信协议之一。对比OneWire严苛的时序要求,SPI等更多的线缆要求,IIC处于一个折中的位置:不那么多的2根线缆的硬件要求,不那么复杂严苛的时序要求,便可进行多主多从的双向通信,小巧灵活方便,这使它广受欢迎。 |
目录
- 一、简介
- 二、主要特性
- 三、硬件结构
-
- 1. 总线结构
- 2. 总线的拉高和拉低
- 四、工作时序
-
- 1. 数据有效性
- 2. 开始和结束信号
- 3. 重复开始信号
- 4. 字节格式
- 5. 应答信号
- 五、7-bit 设备的数据传输
-
- 1. 主机写-从机收,传输方向不变
- 2. 主机读-从机发,传输方向改变
- 六、10-bit 设备的数据传输
-
- 1. 10-bit 设备的写
- 2. 10-bit 设备的读
一、简介
IIC(Inter-Integrated Circuit)是 IIC Bus 简称,中文叫集成电路总线。它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。
IIC使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。
二、主要特性
- IIC用2根信号线通信:串行数据线 SDA、串行时钟线 SCL;
- IIC总线上所有器件的SDA、SCL引脚输出驱动都为 开漏(OD) 结构,通过外接上拉电阻实现总线上所有节点SDA、SCL信号的线与逻辑关系;
- 总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为由生产厂家制定的设备类型地址,低3位为器件引脚定义地址(由使用者定义);10位地址不常见;
- 任何时刻都只存在简单的主从关系,按数据传输的方向,主机可以是主发送器或主接收器;
- 支持多主机。在总线上存在多个主机时,通过冲突检测和仲裁机制防止多个主机同时发起数据传输时存在的冲突;
- IIC总线上所有器件都具有“自动应答”功能,保证数据传输的正确性; 主机和从机的区别在于对SCL的发送权,只有主机才能发送SCL;
- IIC总线允许挂载最多的设备数量取决于总线上最大电容值,一般为400pf(Hs模式100pf)
- IIC总线不仅广泛应用于电路板级的内部通信,还可以通过I2C总线驱动器进行不同系统间的通信; 支持传输速率包括:
模式 | 速度 |
---|---|
标准模式(Standard Mode) | 100kb/s |
快速模式(Fast Mode) | 400kb/s |
增强快速模式(Fast Mode Plus) | 1Mb/s |
高速模式(High Speed Mode) | 3.4Mb/s |
极速模式(Ultra-FastMode) | 5Mb/s |
三、硬件结构
1. 总线结构
IIC使用两根信号线进行通信,要求两根线都使用 开漏输出接上拉电阻 的配置,以此实现总线上所有节点SDA、SCL信号的 线与 逻辑关系。
Rp电阻的取值有一定的要求,太小会导致灌入电流过大,使’低’数据不稳定,甚至损坏端口;太大会导致信号上升缓慢,使得数据传输出错。在不同应用场景及供电电压下有不同的取值要求。
线与 逻辑使得总线上不会出现数据冲突,实现了总线的仲裁控制。总线的控制权会交给最后一个输出低电平的设备,其它设备(输出高)通过检测总线上的电平状态(状态低),对比与自己输出状态不一致,则自动退出对总线的控制请求,从而防止了总线上的数据冲突。
漏极开路/集电极开路的缺点是对于一个距离长的数据线,信号传输速率得不到有效保证。更长的走线对于输出驱动器表现为更大的容性负载,等效容性负载C和信号线的上拉电阻R构成RC振荡器。RC越大,意味着反射和振荡越强,从而影响总线的信号完整性。这也是I2C规范对总线电容值约束在400pf以内的原因。高速模式对信号完整性的要求更高,协议有定义相关SDA/SCL处理办法,以保证在数据线够长、速率够高时,信号完整性也可以得到满足。
2. 总线的拉高和拉低
下图展示了IIC总线拉低和拉高的过程。
- 拉低:设备的逻辑电路控制FET打开,总线通过导通的FET连接到GND从而被拉低
- 拉高:设备的逻辑电路控制FET关闭,总线通过上拉电阻Rp连接到VDD从而被拉高
四、工作时序
1. 数据有效性
IIC 的数据读取动作都在 SCL为高 时产生,SCL为低时是数据改变的时期,无论SDA如何变化都不影响读取。所以,传输数据的过程中,当SCL为高时,数据应当保持稳定,避免数据的采集出错。
2. 开始和结束信号
开始信号(START/S): SCL为高时,SDA从高到低的跳变产生开始信号
结束信号(STOP/P) : SCL为高时,SDA从低到高的跳变产生结束信号
3. 重复开始信号
重复开始信号(ReSTART/Sr): 在结束时不给出STOP信号,而以一个时钟周期内再次给出开始信号作为替代
4. 字节格式
SDA数据线上的每个字节必须是8位,对于每次传输的字节数没有限制。每个字节(8位)数据传送完后紧跟着应答信号(ACK,第9位)。数据的先后顺序为:高位在前 。
5. 应答信号
协议规定数据传输过程必须包含应答(ACK)。接收器通过应答告知发送的字节已被成功接收,之后发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括用于应答的第9个时钟。发送器在应答时钟周期内释放对SDA总线的控制,这样接收器可以通过将SDA线拉低告知发送器:数据已被成功接收。
应答信号分为两种:
1)当第9位(应答位)为 低电平 时,为 ACK (Acknowledge) 信号
2)当第9位(应答位)为 高电平 时,为 NACK(Not Acknowledge)信号
主机发送数据,从机接收时,ACK信号由从机发出。当在SCL第9位时钟高电平信号期间,如果SDA仍然保持高电平,则主机可以直接产生STOP条件终止以后的传输或者继续ReSTART开始一个新的传输
从机发送数据,主机读取数据时,ACK信号由主机给出。主机响应ACK表示还需要再接收数据,而当主机接收完想要的数据后,通过发送NACK告诉从机读取数据结束、释放总线。随后主机发送STOP命令,将总线释放,结束读操作。
五、7-bit 设备的数据传输
一个完整的7-bit通信过程如图所示:
在START信号后的首字节由7位从机地址和1位读写位组成,结构如下图:
发送完这个字节之后,主机释放SDA总线等待从机给出ACK应答。如果从机给出了ACK应答,表示从机地址正确(有从机响应)并且已知晓是读还是写,便可以开始读写数据。如果从机没有给出ACK应答,则说明接收设备可能没有收到数据(如寻址的设备不存在或是设备正在忙碌)或无法解析收到的数据,如果是这样,则由master来决定如何处理(STOP或ReSTART)。
1. 主机写-从机收,传输方向不变
主机对从机发送数据时,主机对从机发送一个开始字节,然后即可一直发送数据。以示例来讲解,其第一帧数据为要操作的寄存器地址,所以为:“[1-Byte]开始字节(写) + [1-Byte]寄存器地址 + [1-Byte]寄存器数据”。
2. 主机读-从机发,传输方向改变
主机对向从机读取数据时,方式同发送数据有所不同,要多一次通信过程。
主机需要先向从机发送一次信号,告诉从机”我要读取数据“,然后重开一次通信,等待从机主动返回数据。以示例来讲解,发送 “[1-Byte]开始字节(写) + [1-Byte]要读取的寄存器的地址”,之后结束通信,或者重开始,来进入到第二次通信中,先发送 [1-Byte]开始字节(读),然后等待读取从机发送过来的 [1-Byte]数据 即可。
六、10-bit 设备的数据传输
随着IIC设备日益增多,7位的从机地址逐渐不能满足使用,于是从机地址从7位扩充到了10位。7位和10位地址的设备可以共存于同一个I2C总线系统互不冲突,展现了良好的兼容性。
10-bit 地址的IIC设备需要 2-Byte 来传输从设备地址信息,所以采用了这样的设计:第一个字节为 1111 0 + 地址高两位(第10、9bit) + 读写控制位,第二个字节为从设备地址低8位,除此之外与7-bit设备相同。因为 “1111 0xx” 为 IIC 中特地保留的16个特殊指令地址中的一个,所以7-bit设备不会响应该首字节的呼叫,只有10-bit设备会响应,从而实现良好兼容。
1. 10-bit 设备的写
10-bit设备的写过程如下图示例,除地址部分外与7-bit相同。
2. 10-bit 设备的读
10-bit设备的读过程如下图示例,需注意的是,第二次通信过程无需再次发送第2Byte地址。
原文地址:https://blog.csdn.net/qq_39829913/article/details/104718185
更多推荐
所有评论(0)