深入理解 I2C 协议
1. 引言I2CInter-Integrated Circuit集成电路总线是一种由飞利浦公司现恩智浦半导体在 1980 年代开发的同步、多主从、串行、半双工通信总线协议。它以其简洁的硬件接口仅需两根线、支持多设备连接以及灵活的通信速率等优点在嵌入式系统、传感器网络、EEPROM、实时时钟RTC等场景中得到了广泛应用。本文将深入剖析 I2C 协议的工作原理、通信时序、寻址方式并通过实战代码示例帮助读者全面掌握这一经典总线协议。2. I2C 总线物理层与信号I2C 总线仅由两根双向开漏Open-Drain线构成SDASerial Data Line串行数据线用于传输数据。SCLSerial Clock Line串行时钟线由主设备产生用于同步数据位传输。由于采用开漏输出总线需要外接上拉电阻通常为 4.7 kΩ 或 10 kΩ至电源电压VCC。这种设计允许多个设备“线与”Wire-AND任何设备都可以将总线拉低输出 0而释放总线输出 1则依靠上拉电阻将电平拉高。总线电平逻辑低电平0电压接近 GND。逻辑高电平1电压接近 VCC由外部上拉电阻决定。3. I2C 协议通信时序详解一次完整的 I2C 数据传输遵循严格的时序由主设备Master发起和控制。3.1 起始START与停止STOP条件起始条件S在 SCL 为高电平期间SDA 线上产生一个由高到低的下降沿。这标志着一次传输的开始并唤醒总线上所有从设备。停止条件P在 SCL 为高电平期间SDA 线上产生一个由低到高的上升沿。这标志着一次传输的结束总线进入空闲状态。3.2 数据传输与应答数据传输以字节8 位为单位高位MSB先发。每个字节传输后接收方必须发送一个应答ACK或非应答NACK位。数据位传输主设备在 SCL 低电平时改变 SDA 数据在 SCL 高电平时SDA 数据必须保持稳定供接收方采样。应答位ACK/NACK在第 9 个时钟脉冲即字节传输后的第一个时钟期间发送方释放 SDA 线输出高。接收方若成功接收该字节则在此周期内将 SDA 拉低作为应答ACK若接收失败或希望终止传输则保持 SDA 为高作为非应答NACK。主设备在发送数据后需要检测从设备的 ACK从设备在接收主设备发送的数据后也需要发送 ACK。4. I2C 设备寻址I2C 采用 7 位或 10 位地址寻址。7 位地址是最常用的模式可寻址 112 个设备地址 0x00 到 0x07 和 0x78 到 0x7F 为保留地址。7 位地址帧格式主设备在起始条件后立即发送一个字节。这个字节的高 7 位是从设备地址最低位LSB是读写位R/W#。0表示主设备将要向从设备写入数据Write。1表示主设备将要从从设备读取数据Read。例如向地址为 0x50二进制 1010000的设备写入数据主设备发送的地址字节为0xA01010000 0 10100000。从地址为 0x50 的设备读取数据主设备发送的地址字节为0xA11010000 1 10100001。5. 典型通信流程示例5.1 主设备向从设备写入数据主设备发送起始条件S。主设备发送从设备地址 写位0。从设备返回应答ACK。主设备发送数据字节 1。从设备返回应答ACK。…重复步骤 4-5发送更多数据主设备发送停止条件P。5.2 主设备从从设备读取数据主设备发送起始条件S。主设备发送从设备地址 读位1。从设备返回应答ACK。从设备发送数据字节 1。主设备返回应答ACK若还需读或非应答NACK若读取结束。…重复步骤 4-5读取更多数据主设备发送停止条件P。5.3 复合格式写入后读取常用于先发送寄存器地址再读取该地址数据的传感器。主设备发送起始条件S。主设备发送从设备地址 写位0。从设备 ACK。主设备发送寄存器地址字节。从设备 ACK。主设备发送重复起始条件Sr即不发送停止条件直接发起新的起始条件。主设备发送从设备地址 读位1。从设备 ACK。从设备发送数据主设备 ACK/NACK。主设备发送停止条件P。5.4 I2C 通信时序图为了更直观地理解 I2C 协议的时序下面用时序图展示一个主设备向从设备写入一个字节数据地址数据的完整过程时序图说明IDLE空闲状态从 Stop 到 Start 的状态此时 SCL 和 SDA 均为高电平。BUSY忙状态从 Start 到 Stop 的状态表示总线正在进行数据传输。Start起始条件SCL 为高电平时SDA 由高电平变成低电平标志传输开始。Stop停止条件SCL 为高电平时SDA 由低电平变成高电平标志传输结束。ACK应答接收信息的设备驱动 SDA 为低电平告知发送设备接收数据正常。S-TSlave-Transmitter从设备发送信息主设备接收信息。M-TMaster-Transmitter主设备发送信息从设备接收信息。该图清晰地展示了 I2C 协议中起始、停止、数据位传输和应答位的严格时序关系是理解和调试 I2C 通信的重要参考。时序图详细讲解上图展示了一个典型的 I2C 主设备向从设备写入一个字节数据的完整时序过程。我们可以从左到右结合时间轴和信号线变化来理解空闲状态 (IDLE)在传输开始前SCL时钟线和 SDA数据线均被上拉电阻拉至高电平逻辑1总线处于空闲、可用的状态。起始条件 (Start Condition, S)主设备在 SCL 为高电平期间将 SDA 线从高电平拉低产生一个下降沿。这个独特的信号组合SCL高SDA由高变低被总线上所有从设备识别为一次传输的开始并唤醒它们准备接收地址。地址帧传输 (Address Frame)起始条件后主设备开始发送第一个字节。这个字节包含7位从设备地址图中以 A6, A5, …, A0 表示和1位读写控制位R/W#。对于写操作该位为0。数据有效性在 SCL 为低电平期间主设备可以改变 SDA 线上的数据位置高或拉低。当 SCL 变为高电平时SDA 上的数据必须保持稳定此时从设备会采样 SDA 线上的值。每个数据位都遵循这个“低变高稳”的规则。位顺序数据传输是高位MSB先发即先发送地址的最高位 A6。应答位 (Acknowledge Bit, ACK)在发送完8位7位地址1位读写位后主设备会在第9个时钟周期释放 SDA 线即输出高电平由上拉电阻拉高并将总线控制权暂时交给目标从设备。如果总线上存在地址匹配的从设备它会在第9个时钟周期内将 SDA 线主动拉低作为应答信号ACK告知主设备“地址已识别准备就绪”。如果地址不匹配或从设备故障SDA 线将保持高电平即非应答NACK主设备应终止传输。数据帧传输 (Data Frame)收到从设备的 ACK 后主设备继续发送数据字节。图中示例发送了一个8位数据D7, D6, …, D0。数据位的传输和应答机制与地址帧完全相同。再次应答 (ACK for Data)从设备成功接收数据字节后同样在第9个时钟周期将 SDA 拉低发出 ACK 信号。停止条件 (Stop Condition, P)数据传输结束后主设备需要释放总线。停止条件的定义为在 SCL 为高电平期间SDA 线产生一个由低到高的上升沿。此后SCL 和 SDA 均恢复高电平总线再次进入空闲状态等待下一次起始条件。关键点总结主从角色在整个写操作中SCL 时钟始终由主设备产生和控制。SDA 数据线主要由主设备驱动但在两个应答位第9个时钟期间由接收方从设备驱动。同步与采样数据的变化发生在 SCL 为低时数据的采样发生在 SCL 为高时这保证了信号的同步和稳定。握手机制每个字节后的 ACK/NACK 位是重要的握手机制确保了通信的可靠性。没有收到 ACK 通常意味着通信失败。总线状态Start和Stop条件严格定义了总线“忙”BUSY周期的开始与结束。在Start之后、Stop之前总线处于占用状态。通过这张时序图可以清晰地看到 I2C 协议如何通过简单的两根线实现包括寻址、数据传输和确认在内的完整通信流程这也是其成为嵌入式系统经典总线协议的原因之一。若想观看更详细的视频讲解可前往 B 站视频I2C 通信协议详解。7. I2C 协议高级特性与注意事项7.1 时钟拉伸Clock Stretching从设备可以通过在应答位或数据位期间将 SCL 线拉低并保持来暂停主设备的时钟从而为自己争取更多的处理时间。主设备必须检测并等待 SCL 被从设备释放后才能继续。这是 I2C 支持不同速度设备共存的关键机制。7.2 总线仲裁Arbitration当多个主设备同时尝试启动传输时会进行仲裁。仲裁机制基于“线与”特性只要有一个设备输出 0总线就是 0。主设备在发送地址或数据时会同时监听 SDA 线。如果发现自己发送的是 1但检测到总线为 0则说明有其他主设备赢得了总线该设备应立即退出竞争转为从设备监听模式。7.3 通信速率标准模式Standard-mode100 kbit/s快速模式Fast-mode400 kbit/s快速模式Fast-mode Plus1 Mbit/s高速模式High-speed mode3.4 Mbit/s通信速率由主设备的 SCL 频率决定所有设备必须支持主设备设定的速率或更低速率。7.4 注意事项上拉电阻阻值需根据总线电容和电源电压计算选择通常在 4.7 kΩ 到 10 kΩ 之间。阻值过大会导致上升沿过慢通信不可靠阻值过小会导致功耗增加。总线电容总线总电容线缆电容设备引脚电容不能超过 400 pF标准模式否则信号完整性会变差。地址冲突设计系统时需注意从设备地址不能冲突许多设备可通过外部引脚配置部分地址位。8. 总结I2C 协议以其极简的硬件连接和灵活的软件控制成为嵌入式系统内部芯片间通信Inter-IC Communication的事实标准。掌握其起始/停止条件、数据/应答时序、7/10 位寻址以及复合传输格式是进行嵌入式开发和硬件调试的基础。在实际应用中还需结合具体器件的时序要求和电气特性并善用逻辑分析仪等工具进行调试才能构建稳定可靠的 I2C 通信系统。

相关新闻

Ruoyi框架MyBatis-Plus代码生成器深度优化实践

Ruoyi框架MyBatis-Plus代码生成器深度优化实践

1. 项目概述ruoyi作为国内流行的开源后台管理系统框架,其前后端分离版本在企业级应用开发中广受欢迎。在实际项目开发中,代码生成器是提升开发效率的利器,但默认生成的MyBatis-Plus代码格式往往需要二次调整才能符合团队规范。本文将分享如何…

2026/10/7 0:52:47 阅读更多 →
IL1RAP在炎症与肿瘤中的关键作用及靶向治疗进展

IL1RAP在炎症与肿瘤中的关键作用及靶向治疗进展

1. 炎症细胞因子共受体IL1RAP的生物学意义IL1RAP(Interleukin-1 Receptor Accessory Protein)作为IL-1受体家族的关键共受体分子,在先天免疫和炎症反应中扮演着不可替代的角色。这个约66kDa的跨膜蛋白通过与IL-1RI或IL-1Rrp2等受体形成复合物…

2026/10/3 18:27:30 阅读更多 →
智能音乐解放方案:打破平台壁垒的跨平台播放革命

智能音乐解放方案:打破平台壁垒的跨平台播放革命

智能音乐解放方案:打破平台壁垒的跨平台播放革命 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…

2026/10/4 0:45:09 阅读更多 →

最新新闻

EEAT 编年史:从 2005 的评分员文档到 2026 的 AI 概览

EEAT 编年史:从 2005 的评分员文档到 2026 的 AI 概览

一句话结论:EEAT 不是排名因子,也没有「EEAT 分数」。 它出自 Google 给外部评估员用的《搜索质量评估员指南》(Quality Rater Guidelines,下文简称 QRG)。搞不清这一点,你写的所有「EEAT 优化」都是空中楼…

2026/10/7 15:20:31 阅读更多 →
C++多继承

C++多继承

文章目录C多继承复杂菱形继承及菱形虚拟继承单继承、多继承、菱形继承菱形虚拟继承虚拟继承原理继承的总结和反思继承 vs 组合C多继承 复杂菱形继承及菱形虚拟继承 单继承、多继承、菱形继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承&a…

2026/10/7 15:20:31 阅读更多 →
运维干货:远程备份数据库怎么搭?不暴露端口、可监控的完整方案

运维干货:远程备份数据库怎么搭?不暴露端口、可监控的完整方案

一、先明确一件事:你要备份的是"导出文件",不是"数据库目录" 讨论远程备份数据库时,不少运维容易陷入两个误区:一是直接将数据库端口映射至公网,再依靠远程连接进行拉取;二是在脚本中直…

2026/10/7 15:20:31 阅读更多 →
嵌入式显示驱动移植:MIPI-DSI Panel驱动与DRM框架实战

嵌入式显示驱动移植:MIPI-DSI Panel驱动与DRM框架实战

1. 屏幕点亮这件事,到底在折腾什么一块屏幕从“黑砖”到“出画面”,中间隔着的不是一根线,而是一整套显示子系统的协同工作。很多刚接触嵌入式显示驱动的朋友,拿到一块新屏,第一反应是“接上线不就行了”,结…

2026/10/7 15:20:31 阅读更多 →
构建边缘节点OS:内核裁剪、网络调优与缓存实战

构建边缘节点OS:内核裁剪、网络调优与缓存实战

1. cloudflare-os 是什么,以及我为什么要折腾它先说结论:cloudflare-os 并不是你跑到官网就能直接下载的发行版镜像,它更像 Cloudflare 边缘网络这座大厦的骨架。很多人一提到 Cloudflare,脑子里只有 CDN、WAF、DNS 这些产品名&am…

2026/10/7 15:20:31 阅读更多 →
2026私域拓客避坑指南

2026私域拓客避坑指南

问:企业营销会不会封号?批量加人软件合规吗?答:2026年行业数据显示违规操作封号率极高。核心结论是禁用云端自动加好友工具,企微获客需合规运营以防封号。理由在于平台风控全面升级,违规工具不仅导致封号&a…

2026/10/7 15:19:30 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →