Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

I²C

I²C(Inter-Integrated Circuit,集成电路间通信总线)是一种常见的 同步串行通信总线,由 Philips 公司在 1980 年代提出,现已成为嵌入式系统中使用最广泛的低速通信接口之一。它采用双线通信方式,支持多主多从结构,常用于主控芯片与传感器、存储器、外围模块之间的通信。I²C 的最大特点是硬件资源需求极少,只需两根信号线即可实现设备间的数据交换。

1. 物理结构

I²C 只需要两条信号线:

  • SCL(Serial Clock Line,时钟线)
  • SDA(Serial Data Line,数据线)

两条线均为 开漏/开集电极 输出,必须通过上拉电阻接到电源(一般为 3.3V 或 5V)。这意味着总线上任意一个器件可以将信号线拉低,但不能主动拉高,保持了“线与”的总线特性,从而实现多主多从的共享通信。

   ┌─────┐
   │ 主机 │
   └─┬─┬─┘
     │ │
SCL──┘ └──SCL
SDA──┐ ┌──SDA
   ┌─┴─┴─┐
   │ 从机 │
   └─────┘
   (其余从机并联在总线上)

2. 帧格式

I²C 的通信以消息为单位,而消息由若干“帧”构成。

一般帧结构

┌─────┬─────────────┬──────────┬─────────┬────┐
│ 起始 │ 从机地址+R/W │ ACK/NACK │ 数据字节 │ 停止│
└─────┴─────────────┴──────────┴─────────┴────┘
  • 起始位 (START):由主机产生,SCL 为高时 SDA 从高到低的跳变。
  • 地址帧:7 位或 10 位地址 + 1 位读/写标志(0=写,1=读)。
  • 应答位 (ACK/NACK):接收方拉低 SDA 表示应答,拉高表示无应答。
  • 数据帧:8 位数据 + 1 位应答。可连续传输多个字节。
  • 停止位 (STOP):由主机产生,SCL 为高时 SDA 从低到高的跳变,表示通信结束。
SDA:  ─────┐   ┌───────┐───────┐───────┐─────
           │ S │Addr+W │  ACK  │  Data │  P
SCL:  ──┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐┌─┘┐──
         ↑起始  ↑地址帧  ↑应答  ↑数据帧  ↑停止

3. 原理

I²C 是一种 同步通信协议。所有数据传输均依赖于时钟信号 SCL 的节奏,SDA 上的数据必须在 SCL 为高电平时稳定,在低电平时允许变化。主机负责产生时钟并控制数据方向,从机根据地址进行响应。由于 SDA 和 SCL 都是“线与”特性,因此即便多个主机同时尝试发起通信,也能通过仲裁机制保证只有一个主机成功获得总线,从而避免冲突。

4. 硬件协议

I²C 的电气特性决定了其灵活性和局限性:

  • 通过上拉电阻实现线与逻辑,总线空闲时为高电平。
  • 总线上可挂接多个设备,数量仅受寻址空间和总线电容限制。
  • 支持 7 位和 10 位两种寻址方式(7 位更常见,最多可挂 112 个有效设备地址)。
  • 总线拓扑通常为“星形+并联”,所有设备 SDA、SCL 并联在一起。

5. 参数

I²C 提供了多个速度等级,以适应不同应用场景:

模式速率上限应用场景
标准模式100 kbps低速传感器、配置寄存器
快速模式400 kbps一般外设通信(EEPROM 等)
快速模式+1 Mbps较高性能外设
高速模式3.4 Mbps显示器、摄像头等高速数据
超高速模式5 Mbps(少见)特殊应用

除了速率,I²C 还需要关注 寻址方式(7/10 位)应答机制(ACK/NACK)总线长度(电容限制通常 < 400 pF) 等参数。