当前位置: 首页 > news >正文

014、I2C基础:两线制同步通信、地址、读写时序与总线仲裁

014、I2C基础:两线制同步通信、地址、读写时序与总线仲裁

从一次凌晨三点的I2C死锁说起

去年做一款工业传感器采集板,主控用STM32F407,挂了三片ADXL345加速度计、一片SHT30温湿度、一片24C02 EEPROM。板子跑起来一切正常,但量产了200片之后,售后反馈有十几片在低温-20℃环境下偶尔死机。我远程连过去看日志,发现I2C总线卡死在SCL为低、SDA也为低的状态——典型的I2C总线锁死。复位主控没用,必须断电重启。后来查了三天,发现是某片ADXL345在低温下上电时序异常,拉低了SDA线不放,而我的I2C初始化代码里没有做总线恢复。从那以后,我每个I2C外设初始化前都强制发9个SCL时钟脉冲——这招救了我好几次。

I2C到底是个什么东西

I2C(Inter-Integrated Circuit)是Philips在1982年搞出来的两线制同步串行总线。两根线:SCL(时钟线)和SDA(数据线)。所有设备挂在这两根线上,主设备产生时钟,从设备响应。标准模式100kHz,快速模式400kHz,高速模式3.4MHz——但实际工程中,400kHz以上对PCB走线长度和上拉电阻就很敏感了,我一般量产设计只用到400kHz,除非板子布局非常紧凑。

I2C最核心的设计思想是“开漏输出+上拉电阻”。SCL和SDA都是开漏结构,这意味着任何设备都可以把线拉低,但不能主动拉高。拉高靠外部上拉电阻。这个设计直接决定了I2C的仲裁机制——谁拉得低谁说了算。

地址:7位还是10位,别搞混

I2C地址分7位和10位两种。7位地址范围0x00-0x7F,但0x00是通用呼叫地址,0x01是起始字节,0x02-0x03保留,实际可用0x04-0x77。10位地址格式复杂一些,第一个字节高5位是11110,后面跟地址高2位,第二个字节是地址低8位。

这里踩过坑:很多芯片数据手册给的地址是7位左对齐的,比如写0x68,实际发送时要左移一位变成0xD0。也有芯片直接给8位地址(含读写位),比如0xD0是写地址,0xD1是读地址。我习惯的做法是:看数据手册的“Slave Address”章节,如果写的是7位地址,我就在代码里定义#define ADDR 0x68,然后发送时addr << 1;如果直接给了8位地址,我就定义两个宏ADDR_WRADDR_RD。别这样写:#define ADDR 0xD0然后发送时又左移,那就变成0x1A0了,总线会一直NACK。

读写时序:从START到STOP的每个细节

I2C的时序其实就几个状态:空闲、起始、数据传输、应答、停止。

空闲状态:SCL和SDA都是高电平。这是由外部上拉电阻保证的。

起始条件(START):SCL为高时,SDA从高变低。这个下降沿告诉所有从设备:准备接收地址。注意,起始条件必须在SCL高电平时产生SDA变化,这是I2C协议里唯一允许SDA在SCL高时变化的时刻。

数据传输:每个字节8位,高位在前。SCL低电平时改变SDA数据,SCL高电平时采样SDA。这里有个容易忽略的点:从设备可能会拉低SCL来延长时钟(时钟拉伸),主设备必须检测SCL是否被拉低,不能自顾自地发时钟。很多MCU的硬件I2C外设会自动处理时钟拉伸,但软件模拟I2C时一定要加超时检测。

应答(ACK/NACK):第9个时钟周期,发送方释放SDA(拉高),接收方拉低SDA表示

http://www.jsqmd.com/news/1005951/

相关文章:

  • 2026济南黄金回收安全横评:五大合规门店深度对比,避坑必看 - 商业快讯早知道
  • 2026年上海学员咨询众智商学院PMP和软考中级课程怎么联系?官网400和冯老师微信入口说明 - 众智商学院职业教育
  • OpenAI Codex 配置参考大全:config.toml 与 requirements.toml 全配置详解
  • 3分钟解锁你的QQ音乐收藏:qmc-decoder让你的加密音乐重获自由
  • Poppins字体:免费多语言排版终极指南
  • 嵌入式串行通信接口SCI与SPI:原理、配置与调试实战指南
  • 从libcams.dll到NXOpen:一个NX二次开发者探索刀路编辑API的踩坑与升级之路
  • 2026年6月最新|氢氧焊机厂家推荐哪家靠谱?口碑厂家榜单 + 选购避坑指南 - 商业新知
  • 从仿真到实战:2DPSK系统在MATLAB中的保姆级调试指南(滤波、噪声、误码率全解析)
  • 深入解析恩智浦KV5x微控制器:Cortex-M7内核、低功耗与安全实战
  • 模板驱动型文档自动化:结构化输出与批量生成实战指南
  • 当苹果说“不“时,如何让旧Mac重获新生:OpenCore Legacy Patcher的魔法解密
  • 虎林全屋定制安心之选:千山板材全屋定制,环保耐造适配本地,十余年口碑靠谱 - GrowthUME
  • QGIS批量坡度计算保姆级教程:从DEM数据准备到Z因子设置(含常见错误排查)
  • Windows 11优化终极指南:免费开源工具Win11Debloat强力提升系统性能
  • ZigBee协议栈深度解析:从IEEE 802.15.4数据包到智能灯控命令的完整旅程
  • ArcGIS+PLUS+InVEST三件套实战:手把手教你预测未来30年土地利用变化对生态服务的影响
  • GROMACS后处理避坑指南:从RDF分析到SDF可视化,手把手教你用Travis搞定分子动力学数据
  • Typora自动编号插件终极指南:告别手动编号的完整解决方案
  • MC9328MXL SSI寄存器深度解析:I2S模式配置与数据传输实战
  • 别再只会用Jupyter了!用PyQt5给你的YOLOv8模型做个专属GUI(附完整代码)
  • 别再死记硬背了!Halcon 3D模型数据提取保姆级指南:get_object_model_3d_params()的30+个参数怎么用?
  • 别再只会git pull了!手把手教你用GitKraken图形化界面优雅解决代码冲突(附实战截图)
  • Python处理日期别再只会用datetime了!这5个基础函数搞定90%场景(含闰年判断、月份天数、格式转换)
  • 2026年10款论文降AIGC工具亲测:从90%降至10%的硬核之选
  • 从一次代码审计看DOM型XSS:为什么你的innerHTML总是被安全工具警告?
  • 2026 年千岛湖湖区附近美食推荐:地道鱼宴优选指南 - 谁都没有我好看
  • Oracle 11.2.0.4 Linux x86-64平台2016年10月安全更新整合包(含13个官方子补丁)
  • Zapier 云端无代码 AI 工作流编排自动化平台
  • 从控制点到光滑曲面:Matlab B样条(spmak/spcrv)建模入门,做CAD和动画必看