1.简介
IIC,即I²C,全称 Inter-Integrated Circuit,字面上的意思是集成电路之间,它其实是I²C Bus简称,所以中文应该叫 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。
2. I2C 硬件连接
I2C 在硬件上的接法如下所示,主控芯片引出两条线 SCL(SCK)时钟线,SDA 数据线,在一条I2C 总线上可以接很多 I2C 设备,SDA和SCL这两根线必须要接一个上拉电阻,常用是4.7K,一般在4.7k-10k之间。
总线空闲的时候SCL和SDA处于高电平。
IIC总线标准模式下速度可以达到100Kb/s,快速模式下可以达到400Kb/s,高速模式可达3.4Mb/s。
3. I2C 信号
I2C 协议中数据传输的单位是字节,也就是 8 位。但是要用到 9 个时钟:前面 8 个时钟用来传输 8 数据,第 9 个时钟用来传输回应信号。传输时,先传输最高位(MSB)。
开始信号( S): SCL 为高电平时, SDA 山高电平向低电平跳变,开始传送数据。
结束信号( P): SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
响应信号(ACK):接收器在接收到 8 位数据后,在第 9 个时钟周期,拉低 SDA
SDA 上传输的数据必须在 SCL 为高电平期间保持稳定, SDA 上的数据只能在SCL 为低电平期间变化
I2C 协议信号如下:
4. IIC 传输数据的格式
4.1写操作
1)主芯片要发出一个 start 信号
2)然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
3)从设备回应(用来确定这个设备是否存在),然后就可以传输数据
4)主设备发送一个字节数据给从设备,并等待回应
5)每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
6) 数据发送完之后,主芯片就会发送一个停止信号。
7)下图:白色背景表示"主→从",灰色背景表示"从→主"
4.2读操作
1)主芯片要发出一个 start 信号
2)然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写, 0 表示写, 1 表示读)
3)从设备回应(用来确定这个设备是否存在),然后就可以传输数据
4)从设备发送一个字节数据给主设备,并等待回应
5)每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
6)数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
5. 协议细节
5.1如何在 SDA 上实现双向传输?
主芯片通过一根 SDA 线既可以把数据发给从设备,也可以从 SDA 上读取数据,连接 SDA 线的引脚里面必然有两个引脚(发送引脚/接受引脚)。
5.2内部原理
设备的 SDA 中有一个三极管,使用开极/开漏电路(三极管是开极, CMOS管是开漏,作用一样),如下图:
真值表如下:
从真值表和电路图我们可以知道:
当某一个芯片不想影响 SDA 线时,那就不驱动这个三极管
想让 SDA 输出高电平,双方都不驱动三极管(SDA 通过上拉电阻变为高电平)
想让 SDA 输出低电平,就驱动三极管
5.3为何 SCL 也要使用上拉电阻?
在第 9 个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL 拉低。
当 SCL 为低电平时候,大家都不应该使用 IIC 总线,只有当 SCL 从低电平变为高电平的时候, IIC 总线才能被使用。
当它就绪后,就可以不再驱动三极管,这是上拉电阻把 SCL 变为高电平,其他设备就可以继续使用 I2C 总线了。
5.4 I2C总线最多可以挂多少个设备
I2C是7位地址,2^7=128,但是地址0x00不用,那就是127个地址,所以理论上可以挂127个从器件。
尽管I2C协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。
管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。
实际设计中经验值大概是不超过8个器件。
规定电容大小的原因:I2C的OD(漏极开路)要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。