Explicación detallada del protocolo IIC (I2C)

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乘积必须更小。

Supongo que te gusta

Origin blog.csdn.net/freestep96/article/details/128559772
Recomendado
Clasificación