news 2026/4/18 7:58:15

I2C通信最全面的讲解:从协议到硬件设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
I2C通信最全面的讲解:从协议到硬件设计

IIC( Inter-Integrated Circuit,or I2C)协议是由飞利浦半导体(现在的恩智浦半导体)开发,并于1982年发布的一种串行、半双工总线,主要用于近距离,低速的芯片之间的通信;I2C总线由两根双向的信号线,一根数据线SDA(serial data)用于收发数据,一根时钟线SCL(serial clock)L用于通信双方时钟的同步;I2C总线硬件结构简单,成本较低,因此在各领域得到了广泛的应用。

主要特性:

特性

说明

物理线路

2根:串行数据线(SDA) + 串行时钟线(SCL)

通信方向

半双工

拓扑结构

多主机、多从机总线

寻址方式

软件地址寻址(7位或10位地址)

速率模式

标准模式(100kbps)、快速模式(400kbps)、高速模式(3.4Mbps)、超快速模式(5Mbps)

输出类型

开漏输出,需外接上拉电阻

显著特点

硬件连接简单、成本低、支持多主仲裁和时钟同步、有应答机制

典型应用

连接传感器、存储器(如EEPROM)、显示屏、实时时钟(RTC)、GPIO扩展芯片等

工作原理与流程:

I²C总线通信时,所有设备都并联在两条线上。每个设备有唯一地址。通信由主机发起,它控制时钟线SCL的节奏。数据在数据线SDA上传输。

一次完整的I²C数据传输,就像一次有序的对话,通常包含以下几个环节:

1. 起始条件 (Start Condition):当SCL为高电平时,SDA线从高电平跳变到低电平。这个下降沿告知所有从机:总线繁忙,注意收听地址。

2. 地址帧 + 读写位 (Address Frame + R/W Bit):主机发送一个7位或10位的从机地址,紧跟着一位数据方向位(读/写位)。0表示主机要向从机写入数据,1表示主机要向从机读取数据。

3. 应答位 (ACK/NACK Bit):接收地址的从机,如果识别到自己的地址,应在接下来的一个时钟脉冲通过将SDA拉低来发送一个应答(ACK) 信号。如果未识别(或无法响应),则SDA保持高电平,即非应答(NACK) 。

4. 数据帧 (Data Frames):地址得到应答后,开始传输数据。每个数据帧为8位,同样在每个字节后都紧跟一个应答位(ACK/NACK)以确认接收成功。数据传输时,高位(MSB)在前。

5. 停止条件 (Stop Condition):当所有数据传输完毕,主机产生停止条件。当SCL为高电平时,SDA线从低电平跳变到高电平。这个上升沿表示通信结束,总线恢复空闲。

空闲状态:I2C空闲时SCL、SDA均为高。

数据有效性:

I2C通信中一个至关重要的规则是:

SCL为高电平期间,SDA上的数据必须保持稳定(不允许变化),以便接收方(无论是主设备还是从设备)能够准确采样

SCL为低电平期间,SDA线上的数据才允许发生变化,为下一个比特的传输做好准备

从机地址:

7bit 地址模式下,I2C 协议规定地址字节的高7 位是从机的地址,最低位为0,表示写入从机,最低位为1,表示读取从机。

10bit 地址模式下,地址由两个字节组成,写从机时,I2C 协议规定:第一个字节发送11110XX0,高5 位固定为11110,bit2,bit1 是10bit 地址中的高2 位,bit0 是方向位,值为0,表示方向为写;第二个字节是10bit 地址的低8 位。读从机时,I2C 规定:先发写的地址(两个字节),再发读的地址(读的地址只需要发送一个字节)。具体流程如下:先发写的地址,第一个字节发送11110XX0,高5位固定为11110,bit2、bit1 是10bit 地址的高2 位,bit0 是方向位,值为0,表示方向为写,第二个字节是10bit 地址的低8 位;再发读的地址,发送11110XX1,bit2、bit1 是10bit 地址中的高2 位,bit0 是方向位,值为1,表示方向为读。

总线仲裁:

I²C支持多主机操作。总线仲裁是为了解决多设备同时竞争中线控制权的问题,通过一定的裸机来决定哪个设备能够获得最终的总线控制权。主机在发送每一位后都会检测SDA线上的实际电平。如果发现自己发送的是1(释放总线),而SDA线却是低电平(被另一个主机拉低),则该主机仲裁失败,退出竞争并转为从机模式。仲裁从地址帧的高位开始比较,最终能完整发送地址的主机赢得仲裁。

时钟同步机制允许多个主机在SCL线上产生自己的时钟时,通过“线与”逻辑共同决定最终的时钟周期,从而实现同步。

(I²C 设备的 SDA 和 SCL 引脚均为开漏输出,只要有一个设备输出低电平,总线就被拉低;只有当所有设备都输出高电平(释放总线)时,总线才为高。这是仲裁的物理基础。)

警惕总线死锁:如果某个设备(尤其是从设备)异常(如程序跑飞、电源故障)并持续拉低 SDA 线,会导致整个总线挂起,所有通信中断。解决方法包括:

  • 软件复位:主设备产生多个 SCL 时钟脉冲(如9个),尝试“唤醒”卡住的从设备

  • 硬件复位:必要时复位整个系统或故障设备

上拉电阻选择:

I²C总线采用开漏输出,这意味着设备只能将总线拉低(输出低电平),而不能直接驱动为高电平。总线的高电平状态需要依靠上拉电阻(Rp) 拉到电源电压(VDD)。Rp的值需要仔细计算,过大或过小都会导致通信失败。I2C总线上为什么需要接上拉

1. 计算最小值 Rp(min):Rp不能太小,否则当器件试图将总线拉低时,所需的灌电流(Iol) 会过大,可能超过器件的额定值,导致低电平电压(Vol)抬高甚至损坏端口。公式为:

Rp(min) = (VDD - Vol(max)) / Iol

其中 Vol(max) 是协议允许的最大低电平电压(通常为0.4V或0.3VDD),Iol 是器件的灌电流能力(数据手册提供)

2. 计算最大值 Rp(max):Rp也不能太大,否则总线上的负载电容(Cb) 通过Rp充电的上升时间(tr) 会过长,导致信号边沿过于缓慢,在高波特率下可能无法在时钟周期内达到可靠的高电平。公式为:

Rp(max) = tr / (0.8473 * Cb)

其中 tr 是I²C模式允许的最大上升时间(数据手册或协议规范),Cb 是总线总电容。

3. 权衡与选择:在Rp(min)和Rp(max)之间选择一个标称值。较小的Rp(如1.5kΩ)能提供更快的上升边沿,适合更高速度,但功耗更大;较大的Rp(如4.7kΩ或10kΩ)功耗更小,但会限制最高通信速率。

PCB布局与布线规范

  • SDA和SCL信号线应平行等长走线,线宽通常建议0.2-0.3mm,间距大于线宽以减少串扰。优先走在表层并尽量缩短总长度。

  • 减少分支:设备应尽量集中布局,避免总线出现过长分支(Stub),以减少信号反射

  • 上拉电阻位置:上拉电阻通常应放置在主控制器附近



版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:44:25

5 分钟快速入门 Gitlab CI/CD

🚀 快速掌握 GitLab CI/CD:自动化你的开发流程 GitLab CI/CD 是一个功能强大的工具,它内置于 GitLab 中,用于自动化你的软件构建、测试和部署流程。如果你希望提升开发效率、减少人为错误并实现持续集成/持续部署(CI/…

作者头像 李华
网站建设 2026/4/18 5:34:49

毕业论文选题AI推荐:9大工具+热门方向合集

毕业论文选题AI推荐:9大工具热门方向合集 �� 核心AI工具对比速览 工具名称 核心功能 适用场景 生成速度 特色优势 aibiye 初稿生成/降重/格式优化 全学科通用 20-30分钟 支持理工科图表公式自动插入 aicheck 选题推荐/查重/AIGC检…

作者头像 李华
网站建设 2026/4/16 18:42:21

Java毕业设计做不出来可以找代做吗?

这是一个非常敏感且重要的问题,我需要给你最负责任、最真诚的回答。直接答案:强烈不建议,风险极高,有百害而无一利。我理解你现在可能感到焦虑和无助,但寻找代做是一条会让你陷入更大麻烦的危险捷径。让我详细分析一下…

作者头像 李华
网站建设 2026/4/15 8:50:13

javet 的使用

第一版使用的是j2v8,但是已经不维护了,部署到liunx后报错 J2V8 native library not loaded ,之后切换到这个库了 https://github.com/caoccao/Javenode 引入依赖 <!-- Core (Must-have) --><dependency><groupId>com.caoccao.javet</groupId><art…

作者头像 李华
网站建设 2026/4/16 15:44:22

Stop-motion-OBJ:Blender网格序列动画导入终极指南

Stop-motion-OBJ&#xff1a;Blender网格序列动画导入终极指南 【免费下载链接】Stop-motion-OBJ A Blender add-on for importing a sequence of OBJ meshes as frames 项目地址: https://gitcode.com/gh_mirrors/st/Stop-motion-OBJ Stop-motion-OBJ是一款功能强大的B…

作者头像 李华