2026/3/28 22:46:37
网站建设
项目流程
山东建设厅网站是什么,游戏开服网,手机端开发工具,网站关键词在哪里看嵌入式开发中#xff0c;I2C 通信有两组 “生死顺序”#xff0c;无论是应答配置还是通信收尾#xff0c;顺序一乱直接导致通信崩盘、总线锁死#xff0c;还难排查#xff01;今天把两组核心代码 致命原因一次性说透#xff0c;直接抄作业不踩坑#x1f525;第一组I2C 通信有两组 “生死顺序”无论是应答配置还是通信收尾顺序一乱直接导致通信崩盘、总线锁死还难排查今天把两组核心代码 致命原因一次性说透直接抄作业不踩坑第一组多字节 / 单字节应答配置读取阶段✅正确写法顺序是灵魂if (num 1) // 多字节读取 { I2C_AutoNackByte(i2c_no, num); // 第一步配置触发NACK的字节数 I2C_AutoNackCmd(i2c_no, ENABLE); // 第二步使能自动NACK功能 } else // 单字节读取 { I2C_AutoNackCmd(i2c_no, DISABLE); // 第一步禁用自动NACK I2C_AckCmd(i2c_no, DISABLE); // 第二步手动禁用ACK发NACK }❌错误写法颠倒顺序 配置失效 / 冲突// 多字节错误先使能→后配置 if (num 1) { I2C_AutoNackCmd(i2c_no, ENABLE); // 先开功能参数还没设 I2C_AutoNackByte(i2c_no, num); } // 单字节错误先禁ACK→后禁自动NACK else { I2C_AckCmd(i2c_no, DISABLE); // 两种应答模式冲突 I2C_AutoNackCmd(i2c_no, DISABLE); }致命原因多字节颠倒先使能后配置硬件会按默认值0 / 随机数执行可能第 1 字节就发 NACK从机直接停发部分 MCU 使能后锁定配置后续参数白写单字节颠倒自动 NACK 与手动 ACK 互斥同时操作导致 SDA 电平混乱NACK 信号畸形从机无法识别→总线卡死第二组通信收尾STOPACK 恢复✅正确写法顺序不能乱I2C_GenerateSTOP(i2c_no); // 第一步生成停止信号终止通信 I2C_AckCmd(i2c_no, ENABLE); // 第二步启用ACK为下次通信准备❌错误写法颠倒顺序 总线卡死I2C_AckCmd(i2c_no, ENABLE); // 先启ACK干扰通信状态 I2C_GenerateSTOP(i2c_no); // STOP信号畸形从机无法识别致命原因STOP 信号必须在 “通信中、总线占用” 时发送时序是 “SCL 高电平时 SDA 从低变高”先启 ACK 会提前拉低 SDAACK 是低电平导致 STOP 时序畸形从机没收到终止信号→持续占用总线部分 MCU 通信中锁定配置先启 ACK 可能失效下次通信默认发 NACK→从机无应答核心底层逻辑记牢不踩坑所有 I2C 配置遵循 “先配置→后使能”“先状态操作→后配置操作”状态操作发 START/STOP必须在通信中执行配置操作改 ACK / 字节数只能在总线空闲时执行两种应答模式自动 NACK / 手动 ACK不能同时生效避免逻辑冲突。避坑总结读取配置多字节 “先 AutoNackByte→后 Enable”单字节 “先禁 AutoNack→后禁 ACK”通信收尾“先 GenerateSTOP→后 Enable ACK”顺序错 通信崩这两组代码直接抄进驱动嵌入式开发少走 80% 弯路