嵌入式通信协议札记(二):I2C

一.I2C通信协议简介

1.物理层

嵌入式通信协议札记(二):I2C
I2C物理层有以下特点:

  • I2C是支持多设备的总线,支持多个通讯主机、多个通讯从机
  • I2C使用两条总线线路,SDA(双向串行数据线)、(SCL)串行时钟线
  • 每个连接到总线的设备都有一个独立的地址,主机利用地址进行不同设备的访问
  • 多个主机同时使用总线时,为防止数据冲突会通过仲裁的方式决定哪个设备占用总线
  • 具有三种传输模式:标准模式(100k/s)、快速模式(400k/s)、高速模式(3.4M/s)
  • 总线通过上拉电阻接到电源,当I2C设备空闲时输出高阻态,当所有设备都空闲、都输出高阻态时,由上拉电阻将总线拉到高电平

2.协议层

协议层定义了通讯的起始信号、停止信号、数据有效性、响应、仲裁、时钟同步、地址广播等环节。

(1) I2C基本读写过程

嵌入式通信协议札记(二):I2C

  • 起始位产生后,所有从机就开始等待主机接下来广播的从机地址位(SLAVE_ADDRESS,可以是7位或10位)。当选中某个设备地址后其他未被选中的设备将会忽略之后的数据信号。
  • 传输方向选择位:该位为0时,主机向从机写数据;该位为1时,主机从从机读数据。
  • 应答位:从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。
  • 数据位:每次数据传输都以字节(8 位)为单位,每次传输的字节数不受限制 ,每发送完一个数据,都会等待应答信号(ACK)。
  • 复合格式:该传输过程有两次起始信号(S)。在第一次传输中,主机通过SLAVE_ADDRESS 找到从设备后,发送从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS
    );在第二次的传输中,对该地址进行读或写。第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

(2)起始位与停止位

起始位:当 SCL 是高电平时 ,SDA 从高电平向低电平切换
停止位:当 SCL 是高电平时 ,SDA 由低电平向高电平切换
起始和停止信号一般由主机产生。
嵌入式通信协议札记(二):I2C

(3)数据有效性

I2C 使用 SDA 信号线来传输数据,使用 SCL信号线进行数据同步。
SDA 数据线在 SCL的每个时钟周期传输一位数据
当SCL为高电平的时 SDA表示的数据有效;当 SCL为低电平时SDA的数据无效,SDA进行电平切换,为下次数据传输做好准备。
嵌入式通信协议札记(二):I2C

(4)数据传输响应时序

嵌入式通信协议札记(二):I2C
传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。