I2C 通信协议知识点整理
2026/9/24 11:03:18 网站建设 项目流程

一、I2C 总线概述

I2C(Inter-Integrated Circuit)是一种串行通信总线,使用两根信号线完成设备间的数据通信:

  • SCL:时钟信号线,由主机控制。
  • SDA:数据信号线,用于传输数据。

I2C 采用高位先行(MSB First)的数据传输方式,支持一主多从的通信结构,最多可挂载 127 个从机设备。

二、I2C时序

(一)起始信号与结束信号

起始信号:SCL 时钟信号线为高电平时,SDA 数据信号线由高变低,出现下降沿,表示通信开始。

结束信号:SCL 时钟信号线为高电平时,SDA 数据信号线由低变高,出现上升沿,表示通信结束。

(二)数据传输规则

  • SCL 时钟信号线为高电平时,SDA 数据信号线电平保持稳定,此时接收方采样数据。
  • SCL 时钟信号线为低电平时,SDA 数据信号线电平可以改变,此时发送方发送数据。

(三)应答信号(ACK / NACK)

在第 9 个时钟周期,接收方需要向发送方回复应答信号:

  • ACK:低电平,表示接收成功,继续传输。
  • NACK:高电平,表示接收失败或传输结束。

(四)设备地址与数据流向

1. 起始信号后的第一个字节为设备地址:

  • 高 7 位:设备地址。
  • 低 1 位:数据流向位。

2. 数据流向位含义:

  • 0:主机发送数据给从机(写操作)。
  • 1:从机发送数据给主机(读操作)。

例如设备地址 0x10,二进制为 0001 000,加上读写位后:

  • 写操作:0001 000 0
  • 读操作:0001 000 1

(五)寄存器访问

I2C 设备通过寄存器地址访问内部寄存器,寄存器地址范围通常为 0x00 到 0xFF。

(六)I2C 通信速率

I2C 支持多种通信速率:

  • 100 kHz(标准模式)
  • 400 kHz(快速模式)
  • 1.x MHz(快速模式+)
  • 3.x MHz(高速模式)

三、写时序与读时序

(一)I2C 写时序

  1. 主机发送起始信号 + 设备地址 + 写位,等待从机 ACK 应答。
  2. 主机发送寄存器地址,等待从机 ACK 应答。
  3. 主机向从机发送数据,等待从机 ACK 应答。
  4. 主机发送停止信号。

// 通信前 仲裁丢失标志位清零 + 中断标记位清零

base->I2SR &= ~((1 << IIF) | (1 << IAL));

// 通信前,等待数据传输完毕

while ((base->I2SR & (1 << ICF)) == 0);

// 发送起始信号

base->I2CR |= (1 << MSTA);

// 主机模式:发送模式

base->I2CR |= (1 << MTX);

// 后续检测从机ACK信号

base->I2CR &= ~(1 << TXAK);

// 中断标记位清零

base->I2SR &= ~(1 << IIF);

// 发送设备地址 + 写位

base->I2DR = dev_address << 1;

// 等待从机ACK

while ((base->I2SR & (1 << IIF)) == 0);

// 中断标记位清零

base->I2SR &= ~(1 << IIF);

// 发送寄存器地址

base->I2DR = reg_address;

// 等待从机ACK

while ((base->I2SR & (1 << IIF)) == 0);

(二)I2C 读时序

  1. 主机发送起始信号 + 设备地址 + 写位,等待从机 ACK 应答。
  2. 主机发送寄存器地址,等待从机 ACK 应答。
  3. 主机重新发起起始信号 + 设备地址 + 读位,等待从机 ACK 应答。
  4. 主机接收从机数据,主机回复 ACK 应答。
  5. 当主机接收完最后一个字节数据,向从机回复 NACK 应答。
  6. 主机发送停止信号。

四、I2C 知识点补充

(一)多主机与总线仲裁

I2C 支持多主机结构,当多个主机同时发起通信时,需要通过总线仲裁机制决定谁获得总线控制权。仲裁发生在 SDA 线上,各主机在发送数据的同时持续监测 SDA 电平,一旦发现自身发送的电平与总线实际电平不一致,即退出竞争,由发送高电平的主机让位给发送低电平的主机。仲裁过程不会破坏已传输的数据,也不会产生额外开销。

(二)时钟同步与时钟拉伸

多主机场景下,各主机时钟频率可能存在差异,I2C 通过线与机制实现时钟同步,低电平时间最长的设备决定总线时钟。此外,从机在需要处理数据或未准备好时,可以主动拉低 SCL 线,使主机进入等待状态,这一机制称为时钟拉伸,常用于低速从机与高速主机之间的速率适配。

(三)上拉电阻与电平标准

I2C 总线为开漏输出结构,SCL 和 SDA 线必须外接上拉电阻才能输出高电平。上拉电阻的阻值会影响总线上升时间和通信速率,阻值过大会导致上升沿变缓、限制速率,阻值过小则会增大功耗。常见取值在 1 kΩ 到 10 kΩ 之间,具体需结合总线电容和通信速率综合选择。I2C 还支持 3.3 V 和 5 V 等不同电平标准,可通过电平转换芯片实现不同电压域设备间的通信。

(四)7 位地址与 10 位地址

标准 I2C 使用 7 位设备地址,最多可挂载 127 个从机。当设备数量较多时,可扩展使用10 位地址模式,其首字节前 5 位固定为 11110,后 2 位为地址高 2 位,第二个字节为地址低 8 位,从而支持更多从机设备。

(五)常见应用场景

I2C 广泛应用于嵌入式系统中低速外设的连接,常见设备包括:

  • 传感器:温度、湿度、气压、加速度等传感器。
  • 存储芯片:EEPROM 等非易失性存储器。
  • 显示模块:OLED、LCD 显示屏。
  • 时钟芯片:RTC 实时时钟模块。
  • 扩展芯片:GPIO 扩展、ADC/DAC 转换器等。

(六)I2C 与 SPI 的对比

I2C 与 SPI 是嵌入式中最常用的两种串行总线,二者各有优劣:

  • 引脚数量:I2C 仅需 2 根线(SCL、SDA),SPI 通常需要 4 根线(SCLK、MOSI、MISO、CS)。
  • 通信速率:SPI 速率更高,可达数十 MHz;I2C 标准模式为 100 kHz,高速模式可达 3.x MHz。
  • 多从机寻址:I2C 通过设备地址寻址,SPI 通过片选信号 CS 选择从机。
  • 全双工:SPI 支持全双工通信,I2C 为半双工。
  • 总线占用:I2C 支持多主机仲裁,SPI 通常为单主机结构。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询