内置集成电路 (I2C) 总线是一种单端、多主控双线总线,适合在半双工模式下进行高效的内部集成电路通信。该总线使用漏极开路技术,因此通过电阻器连接到 VDD 时就需要两根信号线,分别为串行数据 (SDA) 线和串行时钟线 (SCL),如图 1 所示。
图 1 I2C 总线
将线路拉低至接地认为是逻辑 0,而使线路浮置则为逻辑 1。通常将这用作通道接入方式。当 SCL 为低电平时,必将发生逻辑状态变化;当 SSL 为高电平时,若发生变化则认为是 START 和 STOP 条件。尽管系统允许提供更高或更低的电压,但典型的电源电压为 3.3V 和 5V。
I2C 通信采用 7 位地址空间(具有 16 个预留地址),因此在同一总线上,理论上最多可以和 112 个节点通信。但实际上,节点数会受到总线上规定的总体总电容 (400 pF) 限制,从而将通信距离限制为几米。规定的信号传输速率为 100 kbit/s(标准模式)、400 kbit/s(快速模式)、1 Mbit/s(快速模式Plus,FM+)和 3.4 Mbit/s(高速模式)。
总线上的节点有主从之分。主节点负责发布时钟和从节点地址,并且还开始和结束数据处理。从节点负责接收时钟和地址,并响应来自主节点的请求。图 2 显示了主从节点之间典型的数据传送示例。
图 2 完整的数据传输时序图
主节点通过创建一个 START 条件发布一个数据处理,紧接着发布希望与其进行通信的从节点的 7 位地址。随后发送一个信号读写位,表示主节点是否愿意写入到从节点 (0) 或者自从节点读取 (1)。接下来,主节点将释放 SDA 线,以允许从节点对数据接收作出应答。
在第 9 个 SCL 时钟脉冲的整个高电平期间,从节点通过将 SDA 拉至低电平以回应一个应答位 (ACK),之后主节点一直处于传输或接收模式(根据发送的读写位而定),而从节点则一直处于对应的互补模式(分别为接收或传输)。
发送地址和 8 位数据字节时首先发送最高位 (MSB)。当 SCL 为高电平时,通过 SDA 由高电平向低电平跳变来指示 START 位。而当 SCL 为高电平时,则通过 SDA 由低电平向高电平跳变来产生 STOP 条件。
当主节点写入到从节点时,它会在从节点发送 ACK 位时重复发送一个字节。在这种情况下,主节点将处于主传输模式,而从节点则处于从接收模式。当主节点自从节点读取时,它会重复接收自从节点的字节,同时对每个字节的接收作出应答 (ACK),但最后一个字节除外,请参见图 3。这种情况下,主节点将处于主接收模式,而从节点则处于从传输模式。
主节点将以 STOP 位结束传输,或者可能为进行下一步传输而发送另一个 START 位以保持总线控制。
图 3 数据传输期间传输/接收模式的变化情况
当写入到从节点时,主节点将主要以传输模式运行,并且只有自从节点接收应答时才会更改为接收模式。
当自从节点读取时,主节点将以传输模式启动,然后在发送 READ 请求(读写位=1)到从节点后会更改为接收模式。从节点将一直处于对应的互补模式,直至结束该任务。
请注意,主节点将通过在最后接收的字节后面跟随一个无应答 (NACK) 来结束读取序列。此步骤会复位从状态机,并允许主节点发送 STOP 命令。
作者简介
Thomas Kugelstadt 现任 TI 高级系统工程师,主要负责定义新型高性能模拟产品以及探测和调节工业系统中低电平模拟信号的完整系统解决方案的开发工作。
在 TI 工作的 20 年间,他曾被派往欧洲、亚洲以及美国担任过各种国际应用职位。 Thomas 毕业于法兰克福应用技术大学 (Frankfurt University of Applied Science),一毕业就成为一名见习工程师 (Graduate Engineer)。 |