I2C 调试看逻辑分析仪:起始位→地址+ACK→数据+ACK→停止位;最常见问题是 NACK(从机没应答),先查地址、上拉电阻、时序;STM32 硬件 I2C 有 bug,很多人用 GPIO 模拟。
本文概述
I2C 是常用但容易出问题的总线,面试常考:I2C 时序、ACK/NACK、上拉电阻、STM32 硬件 I2C bug。回答要讲清调试方法和常见坑。
核心要点
I2C 用 SCL(时钟)+SDA(数据)两根线,开漏输出,必须接上拉电阻(通常 4.7k)
时序:起始→7位地址+R/W→从机 ACK→8位数据+ACK→...→停止
NACK 常见原因:地址错、从机没上电、上拉不够、总线被拉死
STM32 硬件 I2C(F1)有已知 bug,复杂项目常用 GPIO 模拟 I2C
调试工具:逻辑分析仪抓 SCL/SDA,看 ACK 位和地址

面试官考察点
面试官看你是否真调过 I2C、是否会用逻辑分析仪。重点听:上拉、地址、ACK、逻辑分析仪。
回答思路
按「硬件→时序→软件」排查,给具体步骤。
参考回答
第一步,看硬件。
SCL/SDA 有没有上拉电阻(4.7k~10k),没有上拉总线一直低;
上拉到哪个电源(3.3V 还是 1.8V),和从机电平匹配;
从机 VCC 有没有上电;
SDA/SCL 有没有接反。
第二步,抓时序。
用逻辑分析仪抓 SCL/SDA:
| 步骤 | 看什么 |
|---|---|
| 起始位 | SCL 高时 SDA 从高拉低 |
| 地址字节 | 7 位地址+R/W,和 datasheet 对 |
| ACK 位 | 第 9 个时钟 SDA 是否被从机拉低 |
| 数据字节 | 8 位数据后 ACK |
| 停止位 | SCL 高时 SDA 从低拉高 |
第三步,判断问题。
地址错:7 位地址左移一位+R/W,注意有些 datasheet 给 8 位地址(含 R/W);
NACK:从机没应答,查从机地址、上电、复位;
总线被拉死:SDA 一直低,复位从机或主机重新发起始;
上拉不够:上升沿慢,加大上拉电阻或换 4.7k。
STM32 硬件 I2C 的坑。
F1 硬件 I2C 有已知 bug,繁忙标志 BUSY 卡死;
解决:软件复位 I2C、超时重试,或直接用 GPIO 模拟 I2C;
模拟 I2C 简单可控,速度不高(100k/400k)完全够用。
常见参数。
| 模式 | 速度 | 上拉电阻(4.7k) |
|---|---|---|
| Standard | 100kHz | OK |
| Fast | 400kHz | 4.7k 或 2.2k |
| Fast+ | 1MHz | 需更弱上拉+短走线 |

扫码关注





























