1. Introducción
IIC, a saber, I²C, nombre completo Inter-Integrated Circuit, literalmente significa entre circuitos integrados, en realidad es la abreviatura de I²C Bus, por lo que el chino debería llamarse bus de circuito integrado, es un bus de comunicación en serie, que utiliza arquitectura multi-maestro-esclavo , desarrollado por Philips en la década de 1980 para permitir que las placas base, los sistemas integrados o los teléfonos móviles conecten periféricos de baja velocidad.
Más microcomputadora integrada/de un solo chip/lenguaje c/contenido de linux: explicación detallada del protocolo IIC (I2C)
2. Conexión de hardware I2C
El método de conexión de I2C en el hardware es el siguiente. El chip de control principal conduce a dos líneas SCL (SCK) línea de reloj y línea de datos SDA . Muchos dispositivos I2C se pueden conectar a un bus I2C. Las dos líneas SDA y SCL deben ser conectado Una resistencia pull-up, comúnmente utilizada, es de 4,7 K, generalmente entre 4,7 k y 10 k.
SCL y SDA son altos cuando el bus está inactivo.
La velocidad del bus IIC puede alcanzar 100 Kb/s en modo estándar, 400 Kb/s en modo rápido y 3,4 Mb/s en modo de alta velocidad.
3. Señal I2C
La unidad de transmisión de datos en el protocolo I2C es byte, que es de 8 bits. Pero se usan 9 relojes: los primeros 8 relojes se usan para transmitir 8 datos y el noveno reloj se usa para transmitir la señal de respuesta. Al transmitir, el bit más significativo (MSB) se transmite primero.
Señal de inicio (S): cuando SCL está en un nivel alto, SDA salta de un nivel alto a un nivel bajo y comienza a transmitir datos.
Señal final (P): cuando SCL está en un nivel alto, SDA pasa de un nivel bajo a un nivel alto, finalizando la transmisión de datos.
Señal de respuesta (ACK): después de recibir datos de 8 bits, el receptor baja SDA en el noveno ciclo de reloj
Los datos transmitidos en SDA deben ser estables durante el nivel alto de SCL, y los datos en SDA solo pueden cambiar durante el nivel bajo de SCL
Las señales del protocolo I2C son las siguientes:
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乘积必须更小。