物理层
- 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
- 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。
- 数据线即用来表示数据,时钟线用于数据收发同步。
- 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之 间的访问。
- 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
- 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。
标准模式 | 传输速率为 100kbit/s |
---|---|
快速模式 | 为 400kbit/s |
高速模式 | 可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。 |
协议层
| | 代表 主机传输到从机 | | :—-: | —- | | | 代表 从机传输到 主机 | | S | 传输开始信号 | | R/W | 传输方向选择位,1 为读,0 为写 | | | 应答(ACK)或非应答(NACK)信号 | | P | 停止传输信号 | | SLAVE_ADDRESS | 从机地址 |
通讯起始信号和停止信号
- 起始信号:
- 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。
- 停止信号:
- 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。
起始和停止信号一般由主机产生
数据有效性
SDA 数据线在 SCL 的每个时钟周期传输一位数据。
- 有效数据
- 传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。
- 无效数据
设备地址:第7位或10位,一般使用7位地址。
数据方向:第8位或11位,位为“1”时表示主机由从机读数据,位为“0”时表示主机向从机写数据
**
响应
I2C 的数据和地址传输都带响应。
响应包括“应答(ACK)”和“非应答(NACK)”两种信号。
- ACK
- 作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后, 若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下 一个数据;
- NACK
- 若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。
传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接 收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
IIC