I2C总线协议详细介绍

I2C(Inter-Integrated Circuit,内部集成电路)总线是一种由飞利浦半导体公司(现NXP)在20世纪80年代设计的简单、高效的双线制串行通信总线。它被广泛用于微控制器与各种外设(如传感器、存储器、数模转换器等)之间的短距离通信。

  • Inter-:之间、内部(更准确地说是"内部互联"的意思)

  • Integrated Circuit:集成电路

  • Circuit:电路

完整的 Inter-Integrated Circuit 意为"内部集成电路互联",也就是芯片与芯片之间在同一块电路板上进行通信的协议,这也正是 I²C 总线得名的由来。

🔌 物理层与电气特性

I2C总线仅使用两条双向信号线即可实现多设备通信,极大地节省了PCB的布线空间和芯片引脚。

  • 两条信号线

    • SDA(串行数据线):用于在主设备(Master)和从设备(Slave)之间传输数据。

    • SCL(串行时钟线):由主设备产生的时钟信号,用于同步数据传输。

  • 工作模式 :I2C是一种半双工通信总线,意味着在同一时刻,数据只能在SDA线上单向传输。

  • 开漏输出与上拉电阻 :SDA和SCL线均采用开漏输出结构。这意味着线路本身只能将电平拉低,而无法主动输出高电平。因此,两条线必须通过上拉电阻(Rp)连接到正电源(VDD),以保证在空闲状态时保持高电平。上拉电阻的阻值选择很重要,阻值过大影响信号上升时间,过小则功耗过大。

  • 逻辑电平:逻辑"0"通过将线路拉低至接地来实现,逻辑"1"则通过释放线路使其浮空至高电平(由上拉电阻拉高)来实现。I2C支持不同的电源电压,如5V、3.3V或1.8V。

  • 设备寻址:总线上的每个从设备都有一个唯一的7位或10位地址。主设备通过发送目标地址来选择通信对象,无需额外的片选信号线。

⚙️ 协议层与通信时序

I2C通信由主设备发起和终止,遵循一套严格的时序规则。

1. 起始与停止条件

这是所有I2C通信的起始和终止标志:

  • 起始条件:当SCL为高电平时,SDA线从高电平向低电平切换(下降沿)。总线被标记为"忙"。

  • 停止条件:当SCL为高电平时,SDA线从低电平向高电平切换(上升沿)。总线被释放,重新回到"空闲"状态。

  • 重复起始条件:在主设备不释放总线控制权的情况下,发起另一次起始条件,用于改变数据传输方向或寻址另一个从设备。

2. 数据有效性

在SCL为高电平期间,SDA线上的数据必须保持稳定。只有当SCL为低电平时,SDA线的电平状态才能改变。唯一的例外是起始和停止条件。

3. 字节格式与应答机制

  • 数据传输:数据以字节(8位)为单位传输,首先传输最高有效位(MSB)。每次传输的字节数没有限制。

  • 应答位 :每个字节传输完成后(即第9个SCL时钟周期),发送方会释放SDA线,由接收方控制。接收方需将SDA线拉低以产生一个应答位 ,表示"ACK";若SDA保持高电平,则为非应答,表示"NACK"。

    • ACK:接收器在第9个时钟周期将SDA拉低,表示成功收到一个字节。

    • NACK:接收器在第9个时钟周期释放SDA(保持高电平)。可能原因包括:总线上无对应地址的设备、接收器忙无法接收数据、或主设备作为读取方时,在读完最后一个字节后发出NACK以通知从设备停止发送。

4. 典型的数据传输流程
完整的一次写/读操作遵循以下步骤:

  • 写数据流程

    1. 主设备发送起始条件。

    2. 主设备发送7位从设备地址 + 1位写标志位(0)。

    3. 被寻址的从设备返回ACK。

    4. 主设备发送8位数据(如寄存器地址或实际数据),从设备每接收一个字节便返回一个ACK。

    5. 主设备发送停止条件,结束通信。

  • 读数据流程(随机读):

    1. 主设备发送起始条件。

    2. 主设备发送从设备地址 + 写标志位(0),从设备ACK。

    3. 主设备发送要读取的寄存器地址,从设备ACK。

    4. 主设备再次发送重复起始条件

    5. 主设备发送从设备地址 + 读标志位(1),从设备ACK。

    6. 从设备向主设备发送数据。主设备为每个收到的字节返回ACK,但在接收最后一个字节后返回NACK。

    7. 主设备发送停止条件,结束通信。

📊 传输速率与模式

I2C协议经过多年发展,定义了多种速率模式以适应不同需求,所有模式均向下兼容。

模式 传输速率 主要特点
标准模式 100 kbit/s 最基础的模式,最初定义
快速模式 400 kbit/s 1992年引入,大幅提升速度
快速模式+ 1 Mbit/s 2007年引入,用于需要更高速率的设备
高速模式 3.4 Mbit/s 1998年引入,需要特殊的时序和电平
超快速模式 5 Mbit/s 2012年引入,为单向、无ACK的高速传输设计

💡 高级特性与应用

  • 多主模式与仲裁:I2C支持多个主设备连接在同一条总线上。当两个主设备同时发起通信时,会通过"线逻辑与"进行仲裁:一个主设备发送"1"而另一个发送"0"时,发送"0"的设备会将SDA线拉低,发送"1"的设备检测到SDA并非高电平,就会退出竞争。此机制保证了数据传输不丢失。

  • 时钟延展:当从设备处理速度跟不上主设备时,它可以在主设备释放SCL后,主动将SCL线拉低,强制主设备进入等待状态,直到从设备处理完毕并释放SCL。需要注意,并非所有主设备都支持此功能。

  • 10位寻址:除了标准的7位地址,I2C还支持10位寻址,可与7位地址设备共存于同一总线,从而连接最多1008个节点,突破了112个节点的限制。

I2C凭借其简洁高效的架构,已成为嵌入式系统中不可或缺的通信标准。

相关推荐
SDAU20052 小时前
Arduino编程CH552
c语言·开发语言·单片机
快乐的划水a2 小时前
单片机仿Linux驱动开发(一)
linux·驱动开发·单片机
实在太懒于是不想取名2 小时前
STM32N6的开发日记(5):数字摄像头接口像素流水线DCMIPP让MCU拥有高性能摄像头资源
stm32·单片机·嵌入式硬件
天涯铭3 小时前
深入浅出:单片机I/O模式与上拉电阻
单片机·上拉电阻·gpio输出
iCxhust3 小时前
8088汇编测试程序 (MASM/TASM) — 显示 “HELLO 8088!“ + “LCD1602 OK“
汇编·单片机·嵌入式硬件·51单片机·微机原理
Bryce_Zhou3 小时前
STM32U5A9J-DK 介绍
stm32·单片机·嵌入式硬件
Bryce_Zhou3 小时前
stm32cubex创建freertos
单片机
快乐的划水a3 小时前
单片机仿Linux驱动开发(三)
linux·驱动开发·单片机
lzx186488437023 小时前
锂电池11V升23V 1.2A恒流升压DC-DC转换芯片_AH1102
嵌入式硬件·集成测试·硬件工程·ic