当前位置: 首页 > 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.rkmt.cn/news/1517734.html

相关文章:

  • 2026年上海学员咨询众智商学院PMP和软考中级课程怎么联系?官网400和冯老师微信入口说明 - 众智商学院职业教育
  • 深入解析恩智浦KV5x微控制器:Cortex-M7内核、低功耗与安全实战
  • 当苹果说“不“时,如何让旧Mac重获新生:OpenCore Legacy Patcher的魔法解密
  • QGIS批量坡度计算保姆级教程:从DEM数据准备到Z因子设置(含常见错误排查)
  • Python处理日期别再只会用datetime了!这5个基础函数搞定90%场景(含闰年判断、月份天数、格式转换)
  • 2026 年千岛湖湖区附近美食推荐:地道鱼宴优选指南 - 谁都没有我好看
  • 别再只会git pull了!手把手教你用GitKraken图形化界面优雅解决代码冲突(附实战截图)
  • 别再只会用Jupyter了!用PyQt5给你的YOLOv8模型做个专属GUI(附完整代码)
  • 数术工坊・八卷全书(番外・实战升华副卷)【终极典藏定稿|完整无删减】
  • 从控制点到光滑曲面:Matlab B样条(spmak/spcrv)建模入门,做CAD和动画必看
  • 找东莞市GEO服务开发服务商,真实合作体验到底咋样? - GrowthUME
  • 从LSTM到Mamba:为什么说双向状态空间模型是处理视觉序列的“潜力股”?
  • 3分钟实现优雅Markdown阅读体验:为什么你需要这款Chrome扩展?
  • 3个魔法公式:如何让SketchUp创意无缝跃入3D打印世界?
  • 跨平台架构设计深度解析:Lumafly Hollow Knight Mod管理器技术实现
  • 2026年,靠谱秀山配眼镜,高度近视配镜攻略来啦! - 资讯快报
  • 前端开发必看:你的innerHTML用对了吗?从一次DOM XSS漏洞排查说起
  • 终极音乐解锁指南:3分钟让你的加密音频重获自由 [特殊字符]
  • 图解人工智能(57)人工智能应用-围棋国手
  • 【2026年6月】拷贝纸 包装纸 白板纸厂家推荐指南 - 多才菠萝
  • 2026 年 6 月北京装修高人气预约榜发布 本地实力口碑装企盘点 - 装修新知
  • Delphi 11.1.5下开箱即用的EhLib 10.0.031完整安装包(含设计时组件与CHM帮助)
  • 魔兽争霸3终极优化指南:让经典游戏在现代电脑上焕发新生
  • 终极Win11优化指南:如何用Win11Debloat一键清理系统,释放50%内存
  • 武汉黄金回收哪家规矩 五区商圈持证门店逐家探 2026六月出手不吃亏 - 昌福黄金回收
  • 别再死记公式了!用Matlab和Multisim手把手教你设计一个63.6kHz的RC低通滤波器
  • 图解人工智能(58)人工智能应用-围棋国手
  • 如何让桌面宠物成为你的数字伙伴:DyberPet终极指南
  • UDS 0x31服务:requestRoutineResults的“问诊”之道
  • F2明星同款清单