首页/协议速查/I2C 协议
🔸

I2C 协议 两线总线

板内总线
两线挂多从机,地址寻址+开漏线与,EEPROM/传感器通用。
🧩 核心原理
📈 时序 / 工作过程图
I2C 写寄存器时序START → 器件地址+W → ACK → 寄存器地址 → ACK → 数据 → ACK → STOPSCLSDASTART器件地址+WACK寄存器地址ACK数据ACKSTOPSDA在SCL高电平时变化=起始/停止;数据在SCL高电平期间必须稳定(SCL低电平时变化)
⚙️ 配置 / 使用要点
  1. 主机模式:发START→地址→数据→STOP
  2. 读流程:写寄存器地址 → 重复START → 读数据(末尾NACK)
  3. 从机模式:地址匹配中断,逐字节收发
  4. 速率按从机手册选100k/400k
🛠️ 项目示例
I2C 读流程(写地址→重复START→读)
// 读 MPU6050 加速度计:先写寄存器地址 0x3B,再重复START读6字节
uint8_t reg = 0x3B;
HAL_I2C_Master_Transmit(&hi2c1, (0x68<<1)|0, &reg, 1, 100);

uint8_t data[6];
HAL_I2C_Master_Receive(&hi2c1, (0x68<<1)|1, data, 6, 100);
// 主机在最后一字节回 NACK → STOP,从机释放总线
❓ 面试高频
I2C为什么读要重复START?
同一事务中改变方向:先发地址+W写寄存器指针,重复START后发地址+R读数据,避免总线释放被其他主机插队
时钟拉伸是什么?
从机处理不过来时拉低SCL,主机检测到SCL为低就等待——慢速从机的硬件流控
怎么防止I2C死锁?
SDA被拉死时:切换GPIO手动翻转9个SCL脉冲+STOP释放总线;或看门狗+总线恢复例程
✅ 自查清单 (点击勾选,本地保存)
0/0
会画START/STOP/ACK时序
知道重复START用途
知道时钟拉伸
知道总线死锁恢复
会读写传感器寄存器