STM32 I2C通信怎么调试?ACK位与时序怎么抓?嵌入式面试

浏览量:21
时间: 2026-09-18 09:03:17
一句话答案

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 波形,SCL/SDA 信号,ACK 位标注,STM32 开发板连接传感器

面试官:STM32 读 I2C 传感器,一直读不到数据,你怎么排查?

面试官考察点

面试官看你是否真调过 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)
Standard100kHzOK
Fast400kHz4.7k 或 2.2k
Fast+1MHz需更弱上拉+短走线

面试官可能追问

追问 1:I2C 为什么要上拉电阻?
I2C 是开漏输出,只能拉低不能拉高,必须靠上拉电阻拉高。没有上拉总线一直低。
追问 2:7 位地址和 8 位地址区别?
7 位是设备地址,主机发时左移一位加 R/W 位变 8 位。有些 datasheet 直接给 8 位值(含 R/W),要换算。
追问 3:ACK 和 NACK 区别?
第 9 个时钟 SDA 被拉低=ACK(从机应答);SDA 高=NACK(从机没应答或读结束)。
追问 4:I2C 和 SPI 区别?
I2C 两线、地址寻址、低速;SPI 四线(MOSI/MISO/SCK/CS)、片选、高速。I2C 省线但慢。
追问 5:总线被拉死怎么办?
SDA 被从机拉低时,主机手动发 9 个时钟让从机释放 SDA,再发起始位复位总线。

常见失分表达

✗ I2C 不上拉 — 开漏总线没有上拉,SDA/SCL 一直低,通信不了。
✗ 地址直接抄 datasheet — 有些 datasheet 给 7 位,有些给 8 位,要换算左移一位。
✗ 硬用 STM32 硬件 I2C — F1 硬件 I2C 有 bug,卡死时不如模拟。

准备动作

1
用逻辑分析仪抓一次 I2C 波形,找 ACK 位
2
在 STM32 上模拟 I2C 读一个传感器
3
准备一个 I2C NACK 的排查案例
4
了解 I2C/SMBus/PMBus 区别

核心关键词

I2CACK上拉电阻逻辑分析仪NACKSTM32


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
STM32的SPI通信怎么配置?嵌入式面试SPI四种工作模式与数据收发实现

本文概述STM32的SPI通信配置是嵌入式面试中的基础必考题,考察点涵盖SPI协议原理、四种工作模式、主从机配置流程和实际调试经验。SPI是全双工同步串行接口,... 详情>>

2026-08-25 10:13:35
锂电池充电电路怎么设计?CC/CV充电与保护怎么做?电源工程师面试

电源设计中级技术基础题本文概述锂电池充电是消费电子和便携设备电源设计的常考题。面试官想听的不是“用充电芯片就行”,而是你懂不懂锂电池充电的基本流程(预充、恒流、... 详情>>

2026-09-05 09:51:45
Linux驱动DMA数据偶发异常,怎样排查缓存一致性和映射方向?

题库分类:嵌入式Linux适合经验:1—5年难度:中高级题型:驱动排查题 + 内存一致性题面试题Linux驱动中DMA传输大多数时候正常,但偶发读到旧数据、尾部... 详情>>

2026-07-31 14:58:45
PCB串扰仿真中,近端串扰和远端串扰有什么区别?

📂 分类:PCB仿真📊 经验级别:中级⭐ 难度:★★★☆☆📝 题型:概念辨析题本文概述近端串扰和远端串扰是串扰的两种表现形式。近端串扰NEXT发生在被干扰... 详情>>

2026-08-11 11:25:22
嵌入式系统多路电源上电时序怎么设计?嵌入式面试要从器件要求讲到PDN协同

分类:嵌入式工程师面试题 经验要求:中高级 难度:中高级 题型:电源完整性设计嵌入式系统多路电源上电时序怎么设计?嵌入式面试要从器件要求讲到PDN协同处理器、F... 详情>>

2026-08-04 15:57:24
开班信息