物理层

image.png

  1. 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
  2. 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。
  3. 数据线即用来表示数据,时钟线用于数据收发同步。
  4. 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之 间的访问。
  5. 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲都输出高阻态时,由上拉电阻把总线拉成高电平。
  6. 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
  7. 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制
标准模式 传输速率为 100kbit/s
快速模式 为 400kbit/s
高速模式 可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。

协议层

IIC - 图2| image.png | 代表 主机传输到从机 | | :—-: | —- | | image.png | 代表 从机传输到 主机 | | S | 传输开始信号 | | R/W | 传输方向选择位,1 为读,0 为写 | | image.png | 应答(ACK)或非应答(NACK)信号 | | P | 停止传输信号 | | SLAVE_ADDRESS | 从机地址 |

通讯起始信号和停止信号

  • 起始信号:
    • 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。
  • 停止信号:
    • 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

起始和停止信号一般由主机产生

image.png


数据有效性

SDA 数据线在 SCL 的每个时钟周期传输一位数据

  • 有效数据
    • 传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。
  • 无效数据
    • 当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据 做好准备。

      地址及数据方向

      I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送 设备地址(SLAVE_ADDRESS)来查找从机。

image.png
设备地址:第7位或10位,一般使用7位地址。
数据方向:第8位或11位,位为“1”时表示主机由从机读数据,位为“0”时表示主机向从机写数据
**

响应

I2C 的数据和地址传输都带响应。
响应包括“应答(ACK)”和“非应答(NACK)”两种信号。

  • ACK
    • 作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后, 若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下 一个数据;
  • NACK
    • 若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接 收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
IIC
image.png