硬件学习之I2C

硬件学习之I2C

I2C(Inter-Intergrated Circuit)总线是PHLIPS公司推出的,有两根信号线(时钟线SCL、数据线SDA)组成的串行总线,用于控制器与外围设备的互连。通过I2C总线,可以配置、读取外围设备的工作参数,总线上的每个设备都有唯一的地址标识。
它最主要的优点是其简单性和有效性,由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。I2C总线的另一个优点是它支持多主控Multi-Mastering,其中任何能够进行发送和接收的设备都可以成为主总线。
1. 通信速率
I2C总线上数据的传输有三种模式,相应有三种通信速率:
数据传输标准模式:100Kbit/S;
数据传输快速模式:400 Kbit/S;
数据传输高速模式:3.4Mbit/S。

2. 协议简介
2.1 数据有效性

数据传送时,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化。
硬件学习之I2C

2.2 空闲状态
I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
2.3 起始条件与停止条件
如下图所示为I2C信号的起始条件和停止条件示意图,起始条件和停止条件一般由主机产生。总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。如果产生重复起始(Sr)条件而不产生停止条件,总线会一直处于忙的状态。此时的起始条件(S)和重复起始(Sr)条件在功能上是一样。因此在本文档的剩余部分符号S将作为一个通用的术语既表示起始条件又表示重复起始条件,除非有特别声明的 Sr。
 起始条件:当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件;
 停止条件:当SCL线是高电平时,SDA线由低电平向高电平切换,这个情况表示停止条件。
硬件学习之I2C

2.4 ACK信号
发送器每发送一个字节,就在时钟脉冲期间释放数据线,由接收器反馈一个应答信号。当应答信号为低电平时,规定为有效应答位(ACK简称应答位),标识接收器已经成功地接收到该字节;应答信号为高电平时,规定为非应答位(NACK),一般标识接收器接收该字节没有成功。
2.5 字节格式
I2C总线传输数据是按照字节传输的,并且带有应答位。发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位(ACK,即一帧共有9位)。首先传输的是数据的最高位(MSB),如果从机要完成其他一些功能后(例如一个内部中断服务函数)才能接受或发送下一个完整的数据字节可以使时钟线SCL保持低电平迫使主机进入等待状态,当从机转备好接受下一个字节并释放时钟线SCL后,数据继续传输,传输示意图如下图所示。
硬件学习之I2C

由于某种原因导致从机不对主机寻址信号应答时(如从机正进行实时性的工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线数据传输。当主机接收数据时,它收到最后一个数据字节够,必须向从机发送一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。
2.6 数据帧格式

2.6.1 7位地址格式

主机在起始条件(S)后,发送一个从机地址,这个地址共有7位,紧接的第8位是数据方向位(R/W),0标识发送(写),1标识请求数据(读)。数据传输一般由主机产生的停止位(P)终止。但是,如果主机仍希望在总线上进行数据通讯,它可以产生重复起始条件(Sr)和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。
可能的数据传输格式有:
 “主机发送器”发送到“从机接收器”,传输的方向不改变,传输图如下图所示。
硬件学习之I2C
 在第一个字节后,主机立即读取从机,如下图所示。在第一次响应时,“主机发送器”变成“主机接收器”,“从机接收器”变成“从机发送器”,第一次的响应从机产生,最后发送了一个不响应信号(Ā)的主机产生停止条件,传输示意图如下图所示。
硬件学习之I2C

 复合格式(如下图所示),传输改变方向的时候,起始条件和从机地址都会被重复。但读/写位取反,如果“主机接收器”发起一个重复起始条件,它之前应该发送了一个不响应信号(Ā)。
硬件学习之I2C

2.6.2 10位地址格式
10位从机地址是由起始条件(S)或者重复起始条件(Sr)的头两个字节组成。第一个字节的头7位1111 0XX的组合,其中最后两位(XX)是10位地址的两个最高位(MSB);第一个字节的第8位是读/写位决定了报文的方向(0:表示主机将写信息到选中的从机中,1:表示主机将向从机读信息)。

2.6.3 接口电路

硬件学习之I2C

3. 应用总结
3.1 信号线加上拉电阻
I2C的信号线SCL、SDA属于漏极开路或集电极开路,因为 I2C协议规定 I2C总线空闲时,SCL和 SDA都必须为高电平,而且数据的传输速率也和上拉电阻有关系,所以为了通信的可靠性,在使用 I2C时SCL和SDA都接上外部上拉电阻。

上拉电阻计算:

如果上拉阻值过小,VDD灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值Vol=0.4V);如果灌入端口的电流过大,还可能损坏端口。一般标准模式和快速模式下灌电流不超过3mA,快速模式+及以上灌电流不超过20mA。所以Rp最小值计算公式为:

Rmin={Vdd-0.4V}/3mA
Rmax=(T/0.874) *Cbus, T为上升沿时间,Cbus为总线电容。

3.2 协议逻辑电平转换
通信协议为了保证通信可靠性,设备之间通信信号的电平要匹配,两个设备之间电平不同,通过使用双向电平转换器可以将电源电压和逻辑电平不同的问题解决。
每条总线线路的电平转换器是相同的,而且由一个分立的N通道增强型MOS-FET管串行数据线SDA的TR1和串行时钟线SCL的TR2组成。
硬件学习之I2C
**3.3 从机个数
7位数据格式的I2C总线,从机地址由7位组成,理论上可以挂接127个不同地址的I2C设备,0号"设备"作为群呼地址。
通常D7-D3位为芯片厂商已经定于好的地址位,如AT24C系列的EEPROM利用八位地址为寻址,其中高四位(第7~第4位)为固定的“1010”。
D0位为R/W位,D3-D1才能作为用户自定义的地址位,因此同一个I2C总线最多可挂载8个相同型号的设备。

例如:控制器向从设备地址为0xA2,寄存器地址为0x04的寄存器写入数据0x55,则SDA上的数据依次为,起始位S–>0xA2–>ACK位–>0x04–>ACK位–>0x55–>ACK位–>停止位P

3.4 总线仲裁
当信号线被多个主机设备驱动时,信号线最终的逻辑状态为这些主设备输出逻辑线与后的结果,即仅当所有的主设备都驱动信号线为高电平时,信号线才能表现出高电平逻辑,假设其中一个主设备输出低电平,则信号线为低电平逻辑。即I2C总线的仲裁是在SCL为高电平时,通过比较SDA的逻辑状态来完成的。