首页/外设速查/I2C
🔸

I2C 集成电路总线

通信外设
两根线挂一堆从机的经典总线:开漏+上拉、地址寻址,EEPROM/传感器/RTC 标配。
🧩 核心原理
📈 时序 / 工作过程图
I2C 写寄存器时序START → 器件地址+W → ACK → 寄存器地址 → ACK → 数据 → ACK → STOPSCLSDASTART器件地址+WACK寄存器地址ACK数据ACKSTOPSDA在SCL高电平时变化=起始/停止;数据在SCL高电平期间必须稳定(SCL低电平时变化)
⚙️ 配置 / 使用要点
  1. 使能 I2C + GPIO 复用(开漏模式)
  2. 配置时钟速率/地址模式
  3. 主机:HAL_I2C_Master_Transmit/Receive
  4. 从机:地址匹配中断 + 回调
🛠️ 项目示例
I2C 读 SHT30 温湿度传感器(先写命令再读数据)
// 主机发送 0x2C 0x06(高重复性测量命令)
uint8_t cmd[2] = {0x2C, 0x06};
HAL_I2C_Master_Transmit(&hi2c1, (0x44 << 1) | 0, cmd, 2, 100);

// 等待测量完成,读 6 字节:温度2+CRC + 湿度2+CRC
uint8_t buf[6] = {0};
HAL_I2C_Master_Receive(&hi2c1, (0x44 << 1) | 1, buf, 6, 100);
// 温度 = -45 + 175 * (buf[0]<<8|buf[1]) / 65535
float t = -45.0f + 175.0f * ((buf[0] << 8) | buf[1]) / 65535.0f;
❓ 面试高频
I2C为什么是开漏?
开漏实现线与(多设备可同时驱动总线)、避免电平冲突;上拉电阻提供高电平,低电平任一处可拉低
怎么识别总线上有哪些设备?
逐个地址发地址+W,收到ACK即存在(总线扫描)
START和STOP怎么区分?
SCL为高时,SDA由高变低=START;SDA由低变高=STOP。数据传输期间SDA必须在SCL高电平时稳定
上拉电阻选多大?
快400k用小阻值(2.2k)满足上升时间;慢速用4.7k-10k省功耗;容性负载大时需更小阻值
✅ 自查清单 (点击勾选,本地保存)
0/0
会画I2C时序(START/STOP/ACK)
知道为什么开漏+上拉
会做总线扫描
知道7位地址与读写位
能写出读写EEPROM/传感器流程