1. 为什么这“三剑客”总在面试现场集体亮相?
UART、I2C、SPI——这三个缩写字母组合,几乎成了嵌入式、物联网、单片机方向技术面试的“标准入场券”。不是考一个,而是三个一起上;不是问定义,而是直接甩出波形图让你标时序、给一段异常通信日志让你定位问题、甚至让你手画主从设备连接示意图。我带过几十位应届生和转行者准备面试,发现一个扎心事实:很多人能背出“UART是异步串行、I2C用两根线、SPI有四根线”,但一问“为什么I2C必须接上拉电阻”就卡壳,一问“SPI的CPOL/CPHA四种模式到底对应什么采样时机”就开始眼神飘忽,更别说解释“UART为什么在长距离传输中比SPI更抗干扰”这种跨维度对比题。
这背后根本不是考记忆,而是考你有没有真正把协议“用”进过项目里。UART是调试口、传感器透传、蓝牙模块通信的底层通道;I2C是温湿度传感器、OLED屏、EEPROM这些低速外设的“家庭总线”;SPI则是SD卡、Flash、高速ADC、WiFi模组这类对吞吐量敏感设备的“高速公路”。面试官真正想确认的是:你是否理解每条总线的设计哲学——它为解决什么痛点而生?它的物理约束如何决定软件行为?当硬件连错一根线、时钟配错一个参数、中断没关好一个标志位,系统会以什么方式“崩溃”?这种崩溃不是蓝屏,而是数据错乱、设备失联、日志断断续续,查起来像在迷宫里找出口。
所以这篇汇总不叫“协议手册”,而叫“面试高频考点全汇总”,核心逻辑很直白:所有考点都来自真实调试现场,所有答案都指向可复现的操作判断。比如“I2C地址为啥是7位不是8位?”这个问题,标准答案是“第8位留给读写方向”,但真正值钱的经验是:“如果你用逻辑分析仪抓到SCL高电平时SDA一直在跳变,第一反应不是改代码,而是拿万用表量上拉电阻是否虚焊——因为7位地址本身不会导致电平抖动,但上拉失效会让SDA浮空,被干扰源一碰就翻车。” 这种细节,教科书不写,但面试官会盯着你的眼睛问:“你遇到过吗?怎么确定的?”
关键词自然嵌入:UART负责点对点异步通信,I2C实现多主多从共享总线,SPI提供全双工高速同步传输——它们不是并列的三种技术,而是嵌入式系统里按需分层部署的通信基础设施。适合刚学完《微机原理》想突击面试的应届生,也适合做了三年STM32但总在通信模块调不通的工程师。接下来,我们不讲抽象定义,直接拆解面试官最常掏出来的四类题型:物理层辨析、时序图解读、故障现象归因、选型决策依据。
2. 物理层与电气特性:三根线背后的“生存法则”
2.1 UART:一根线跑通全靠“默契”,两根线才敢说可靠
UART本质是“异步串行”,关键词是“异步”——它不依赖共享时钟线,收发双方靠约定好的波特率(如9600、115200)各自计时。这就引出第一个高频陷阱题:“UART最少需要几根线?”
标准答案是2根:TX(发送)、RX(接收)。但面试官常追问:“如果只连TX不连RX,能通信吗?”
答案是:能,但只能单向发数据,且对方必须严格按你的波特率解码。现实中,很多调试场景(比如单片机通过USB转串口往电脑发日志)确实只用TX+GND,因为电脑端的USB转串口芯片已内置精准晶振,能稳稳跟上。但反过来,如果单片机只接RX不接TX,它永远收不到任何反馈,就像对着山谷喊话却没人回音——这不是协议问题,是设计残缺。
提示:UART的GND(地线)绝非可选项。我曾帮某公司排查一批批量返厂的传感器模块,现象是“偶尔通信失败”。最后发现是外壳金属件与PCB地平面之间存在毫欧级接触电阻,导致TX信号参考地电平漂移200mV。加粗这句话:没有共地,就没有可靠的UART通信。哪怕你用隔离电源供电,也必须通过0Ω电阻或专用隔离收发器建立地电位基准。
波特率计算是必考计算题。公式看似简单:波特率 = 晶振频率 / (16 × UBRRL)(以传统51单片机为例),但陷阱在“16”这个系数——它源于UART采样机制:每个比特周期内采样16次,取中间7次的多数值来抗干扰。这意味着:
- 若晶振为11.0592MHz,要得到9600波特率,UBRRL = (11059200 / 16) / 9600 - 1 = 71.5 → 取整为71,实际波特率误差 = (9600 - 9615) / 9600 ≈ -0.16%;
- 若用12MHz晶振,同样算得UBRRL=77,但实际波特率变成11538,误差达-0.3%,超出RS232标准允许的±2%容限,通信必然丢包。
这就是为什么开发板常用11.0592MHz或18.432MHz晶振——它们是专为常见波特率设计的“友好频率”。
2.2 I2C:两根线撑起“多设备江湖”,上拉电阻是命门
I2C的SCL(时钟)和SDA(数据)都是开漏输出(Open-Drain),这意味着器件只能把线“拉低”,不能主动“推高”。所以必须外接上拉电阻,让线路在无器件驱动时回归高电平。这是I2C一切特性的物理起点。
高频考点:“为什么I2C必须接上拉电阻?不接会怎样?”
标准答案是“保证高电平有效”,但实操真相是:不接上拉,SDA/SCL永远处于低电平或浮空状态,总线直接瘫痪。更隐蔽的问题是上拉电阻阻值选错。阻值太小(如1kΩ):电流过大,器件IO口可能过载发热;阻值太大(如100kΩ):上升沿变缓,高频通信时信号达不到高电平阈值,逻辑分析仪上看到的是“圆头波形”,而非干净方波。
实测经验:在400kHz标准模式下,3.3V系统推荐4.7kΩ;1MHz快速模式下建议2.2kΩ;若总线上挂载设备超过5个,需按公式估算:Rmin = (Vcc - VOLmax) / IOLmax(查器件手册得VOLmax和IOLmax),Rmax = 300pF × trise_time(trise_time由通信速率决定)。我曾在一个挂了8个传感器的I2C总线上,因统一用10kΩ上拉导致1MHz通信失败,换成2.2kΩ后秒通——这不是玄学,是RC充放电时间常数的硬约束。
另一个致命细节:I2C地址是7位,但实际传输是8位字节,最高位(bit7)是读写位(R/W)。例如AT24C02 EEPROM地址为0x50(7位0x28左移1位),写操作发0x50,读操作发0x51。面试官常故意写成“0x50读/0x50写”来观察你是否抠细节。记住:地址字节的bit0决定方向,bit7~bit1才是设备ID。
2.3 SPI:四根线构建“点对点专线”,时钟极性相位是灵魂
SPI没有地址概念,靠片选线(CS/SS)区分设备。标准四线是:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、SS(片选)。但面试最爱问:“SPI能实现多从机吗?怎么接?”
答案是:可以,且必须用独立片选线。常见错误是把多个从机的SS线并联——这会导致冲突:当主控同时选中两个从机,它们的MISO线都在往总线上灌数据,结果就是总线电平被“线与”,读到全是0xFF或随机值。
SPI的灵魂在于CPOL(Clock Polarity)和CPHA(Clock Phase)的组合,共4种模式:
- CPOL=0:空闲时SCLK为低电平;CPOL=1:空闲时为高电平;
- CPHA=0:数据在SCLK第一个边沿采样(上升或下降);CPHA=1:在第二个边沿采样。
高频题:“某传感器手册要求SPI Mode 3,你配置MCU时CPOL/CPHA应设为何值?”
Mode 3 = CPOL=1, CPHA=1 → 空闲时SCLK=高,数据在第二个边沿(即下降沿)采样。为什么这么设计?因为某些Flash芯片在SCLK高电平时内部状态机更稳定,下降沿采样能避开时钟边沿的毛刺。我曾调试一款SPI NOR Flash,死活读不出ID,最后发现是MCU配置成Mode 0(CPOL=0, CPHA=0),而Flash要求Mode 3,改完立刻正常——时钟配置错一位,通信全盘作废,且毫无报错提示。
注意:SPI没有标准电压电平定义,3.3V MCU直接连5V传感器可能烧毁IO口。必须加电平转换芯片(如TXB0108)或电阻分压,这点在混合电压系统中极易被忽略。
3. 时序图深度解析:从波形里读出“设备在说什么”
3.1 UART时序:起始位、数据位、校验位、停止位的“生命节拍”
UART帧结构是面试绘图题高频区。标准帧含:1位起始位(低电平)、5~9位数据位(LSB先发)、0/1位校验位、1/1.5/2位停止位(高电平)。重点陷阱在“停止位数量”:
- 停止位是接收方重同步的时间窗口。1位停止位意味着接收器必须在起始位下降沿后,等待11个比特周期才能判定帧结束;
- 若发送端设1.5位停止位,接收端设1位,接收器会在第10.5位就认为帧结束,导致后续数据错位。
实操案例:某客户用ESP32通过UART控制电机驱动器,指令发出去电机不动。抓波形发现:驱动器要求1.5位停止位,而ESP32默认1位。修改uart_config_t.stop_bits = UART_STOP_BITS_1_5后立即生效。停止位不是“越长越保险”,而是收发双方必须咬合的机械齿轮。
校验位类型(奇校验/偶校验/无校验)也是考点。“奇校验”指数据位+校验位中“1”的总数为奇数。例如数据0x55(01010101)含4个1,奇校验位应为1,使总数为5(奇数)。面试官可能给你一串波形,让你标出校验位值——关键看起始位后第9位(若8数据位+1校验位)是否满足奇偶规则。
3.2 I2C时序:起始/停止条件、应答/非应答的“握手暗号”
I2C时序精髓在“边沿触发”:SCL高电平时,SDA由高→低为起始条件(START),由低→高为停止条件(STOP)。这两个动作必须在SCL高电平期间完成,否则会被视为普通数据变化。
高频题:“主机发送地址0x50后,从机没应答(NACK),可能原因有哪些?”
标准答案列3点:从机地址错、从机未上电、总线被占用。但真实排障清单远更长:
- 上拉电阻失效:万用表测SDA对地电阻是否无穷大(开路)或接近0Ω(短路);
- 从机复位异常:I2C从机上电后需一定时间初始化,若主机太快发地址,从机还在复位中,必然NACK;
- SDA被其他设备强拉低:用逻辑分析仪看SDA是否在START后一直为低——若是,说明有设备把SDA钉死在低电平,可能是IO口配置错误或芯片损坏。
应答位(ACK)是第9个SCL周期,从机在SDA线置低表示收到。这里有个反直觉点:ACK不是从机“主动发送”的信号,而是它把SDA线拉低的“被动响应”。所以若从机没拉低,SDA靠上拉电阻自然回升至高电平,即NACK。这意味着:NACK本身不携带错误类型信息,只是“我没听懂/不能服务”的通用拒绝。
3.3 SPI时序:采样/建立时间、片选激活时机的“毫米级博弈”
SPI时序图里,最易被忽视的是片选(SS)与SCLK的时序关系。正确流程是:
- SS拉低(选中从机);
- 等待tCSS(Chip Select Setup Time,典型值10~100ns);
- SCLK开始翻转;
- 通信结束后,SCLK停在空闲电平(由CPOL决定),再等待tCSH(Chip Select Hold Time,典型值10~50ns),最后SS拉高。
高频陷阱:“SS在SCLK翻转前没拉低,会怎样?”
答案:从机可能错过第一个时钟沿,导致整个字节移位。例如本该读0x12,结果读成0x24(数据左移1位)。我调试一款SPI OLED屏时,因MCU的GPIO设置SS和SCLK不同步,导致屏幕显示错乱,波形显示SS比SCLK晚了200ns,补上延时后修复。
另一个关键点:MOSI/MISO数据必须在SCLK边沿建立(Setup Time)和保持(Hold Time)足够时间。以STM32 HAL库为例,HAL_SPI_TransmitReceive()函数内部已处理时序,但若手动用GPIO模拟SPI(bit-banging),就必须精确计算:
- 假设SCLK频率1MHz(周期1μs),CPOL=0, CPHA=0,则数据需在SCLK上升沿前至少200ns建立(查MCU手册),上升沿后保持100ns。这意味着:拉高/拉低MOSI后,必须插入精确NOP延时,否则高速下必出错。
4. 故障现象归因与排查:从“现象”反推“物理层病因”
4.1 UART典型故障树:丢包、乱码、无法连接的根因地图
| 故障现象 | 最可能根因 | 快速验证方法 | 经验技巧 |
|---|---|---|---|
| 发送正常,接收乱码 | 波特率不匹配 | 用逻辑分析仪测实际波特率,对比双方配置 | 乱码字符ASCII值往往有规律:若全为0x00/0xFF,大概率是RX线虚焊;若为连续0x3F('?'),可能是电平不匹配(3.3V vs 5V) |
| 接收偶尔丢包 | 停止位不一致或缓冲区溢出 | 抓波形看停止位宽度;增大UART接收缓冲区大小 | STM32 HAL库默认接收缓冲区仅1字节,高波特率下极易溢出,务必用DMA或加大环形缓冲区 |
| 电脑端能收到数据,但单片机收不到电脑发的数据 | RX线接错(如接成TX)或电平转换失效 | 用万用表测单片机RX引脚对地电压:正常空闲时应为3.3V,发数据时有波动;若恒为0V,RX线断路 | USB转串口模块的CH340芯片,其TXD引脚输出电平是TTL(0/3.3V),非RS232(±12V),勿与DB9接口混淆 |
| 通信几分钟后突然中断 | 晶振温漂导致波特率偏移 | 更换为温度补偿晶振(TCXO)或改用内部RC振荡器校准 | 某工业设备在夏天高温下通信失效,实测晶振频率漂移0.5%,导致115200波特率误差超限 |
实操心得:UART调试第一原则——先确保物理链路通,再谈协议。我习惯用“回环测试”:将MCU的TX与RX短接,发数据看能否原样收到。若能,证明MCU UART外设和驱动正常;若不能,优先查GPIO复用配置、时钟使能、中断优先级抢占。
4.2 I2C典型故障树:NACK、总线锁死、地址冲突的破局点
| 故障现象 | 最可能根因 | 快速验证方法 | 经验技巧 |
|---|---|---|---|
| 所有I2C操作返回NACK | 总线被锁死(SDA或SCL被某设备拉低) | 用万用表测SDA/SCL对地电压:若<0.8V,说明被强拉低;断开所有从机,逐个接入定位故障设备 | 锁死常见于从机复位异常或固件跑飞,强制断电重启是最快解法;若频繁发生,检查从机复位电路是否可靠 |
| 能读部分寄存器,读特定地址报NACK | 寄存器地址超范围或从机未支持该功能 | 查从机数据手册,确认目标地址是否在有效寄存器映射范围内;用逻辑分析仪看主机发出的地址字节是否正确 | 某温湿度传感器要求先写配置寄存器(0x00)再读数据,若跳过配置直接读,从机返回NACK而非数据 |
| 多设备挂同一总线,通信不稳定 | 上拉电阻阻值过大或总线电容超限(>400pF) | 用示波器测SDA上升沿时间:若>1μs(400kHz模式),需减小上拉电阻;用LCR表测总线对地电容 | 总线长度每增加10cm,电容约增1pF;走线避免平行长距离布线,可加磁珠滤波 |
| 主机扫描到设备地址,但读写失败 | 地址格式错误(7位地址未左移)或读写位颠倒 | 用逻辑分析仪捕获地址字节:正确写0x50应为0b01010000,读0x50应为0b01010001(bit0=1) | 许多I2C库函数(如Arduino Wire)自动处理地址左移,但裸机驱动需手动左移,这是新手最高频失误点 |
注意:I2C总线锁死时,不要强行拉高SDA/SCL!正确做法是:保持SCL为高电平,反复切换SDA高低电平9次以上,模拟时钟脉冲“唤醒”从机。这是I2C规范定义的总线恢复机制。
4.3 SPI典型故障树:数据错位、MISO无响应、速率上不去的硬核解法
| 故障现象 | 最可能根因 | 快速验证方法 | 经验技巧 |
|---|---|---|---|
| MOSI有数据,MISO始终为高电平 | 从机未上电、SS未选中、或MISO线断路 | 测从机VCC是否正常;测SS引脚电平是否随主机变化;用万用表通断档查MISO线路 | MISO线断路时,上拉电阻使其恒为高电平,表现为全0xFF;若从机MISO引脚配置为输入但未启用内部上拉,也可能浮空读随机值 |
| 数据高位/低位全部为0 | CPOL/CPHA配置错误或时钟相位偏移 | 用示波器同时测SCLK和MOSI,看数据是否在正确边沿采样;对照从机手册确认所需SPI模式 | 某SPI Flash在CPOL=0时读ID正常,CPOL=1时全0,因内部状态机依赖时钟空闲电平 |
| 通信速率提不上去(>1MHz失败) | PCB走线过长、未做阻抗匹配、电源噪声大 | 用示波器看SCLK边沿是否过冲/振铃;测VCC纹波是否<50mV;缩短SCLK-MOSI-MISO走线长度并等长 | SPI是高速信号,>10MHz需考虑传输线效应:走线长度>信号波长1/10(10MHz波长30m,故>3m需匹配),加串联电阻(22~33Ω)抑制反射 |
| 多从机中只有一个工作正常 | 片选线电平不兼容(如3.3V MCU驱动5V从机SS)或SS线间串扰 | 测各SS引脚电平:正常应为干净高/低;用示波器看SS切换时是否拖尾或耦合到邻近信号线 | 多从机系统务必确保SS线完全隔离,避免共用PCB铜箔;5V从机SS需用三极管或光耦隔离,不可直接接3.3V GPIO |
5. 协议选型决策指南:面对需求,如何三秒锁定最优解
5.1 选型四维评估模型:速度、距离、设备数、可靠性
面对一个新项目,别急着写驱动,先用这张表快速锚定方向:
| 评估维度 | UART | I2C | SPI | 决策逻辑 |
|---|---|---|---|---|
| 最大速率 | 低速(≤3Mbps,RS232限115.2K) | 中速(标准模式100KHz,快速模式400KHz,高速1MHz) | 高速(可达50MHz,取决于MCU和PCB) | 若需传输图像/音频流,SPI是唯一选择;若只是传感器数值,I2C足够;UART适合调试日志。 |
| 最大距离 | 长距(RS485可达1200米) | 短距(<1米,受总线电容限制) | 极短距(<10cm,高速下更短) | 工业现场长距离通信,UART+RS485是标配;板载传感器用I2C;Flash/SD卡等板载高速设备必用SPI。 |
| 设备数量 | 点对点(1对1) | 多主多从(理论128设备,实际<10) | 点对点(1主多从需独立SS线) | 温室监控挂20个传感器?I2C总线太拥挤,改用UART菊花链或SPI+多SS;若只需2-3个,I2C最省IO。 |
| 抗干扰性 | 强(差分信号RS485,单端UART较弱) | 弱(两线共模干扰大,需靠近布线) | 弱(四线,时钟易受干扰) | 电机驱动器旁放温湿度传感器?UART+屏蔽线;若必须I2C,加磁珠和TVS管;SPI则远离噪声源,SCLK走内层。 |
举个真实选型案例:某智能电表需接入LCD屏、红外通信模块、EEPROM存储。
- LCD屏:需高速刷新,选SPI(MISO可不用,简化为三线);
- 红外模块:异步收发,且需与家电遥控器兼容,必须UART;
- EEPROM:小容量、低速、多设备可能,I2C最省IO。
最终方案:MCU用3组外设——SPI驱动LCD,UART接红外,I2C挂EEPROM+未来扩展的计量芯片。没有万能总线,只有适配场景的组合拳。
5.2 成本与开发效率的隐形天平
工程师常忽略的选型成本:
- 硬件成本:UART只需2颗0Ω电阻;I2C需2颗上拉电阻(约¥0.02);SPI无需额外元件,但多设备时SS线增多,PCB布线成本上升。
- 开发成本:UART驱动最简单,Linux下
open("/dev/ttyS0")即可;I2C需处理地址、ACK/NACK、重复启动;SPI需严控时序、片选管理。某团队为赶工期,硬把SPI OLED屏改成I2C接口,结果因I2C速率不足导致屏幕闪烁,返工两周——协议选型错误,代价远超硬件差价。
实操心得:先定物理层,再选协议栈。例如物联网终端要连LoRa模块,模块提供UART和SPI两种接口:
- 若MCU UART资源已满,且SPI空闲 → 选SPI;
- 若需通过AT指令灵活调试(如
AT+JOIN),UART的交互性无可替代 → 宁可牺牲一个UART口也要选UART;- 若追求最低功耗,SPI在空闲时可关闭时钟,UART需持续监听,此时SPI胜出。
6. 面试实战题库精讲:从题干拆解到满分作答
6.1 高频真题1:画出I2C写入一个字节的完整时序图,并标出起始、地址、应答、数据、应答、停止位置
满分作答要点:
- 起始条件:SCL为高时,SDA由高→低(标注“START”);
- 地址字节:8位,bit7~bit1为7位地址(如0x28),bit0为写位(0),即0b01010000;
- 第一个ACK:第9个SCL周期,SDA被从机拉低(标注“ACK”);
- 数据字节:8位数据(如0x12),MSB先发;
- 第二个ACK:第17个SCL周期,SDA被从机拉低;
- 停止条件:SCL为高时,SDA由低→高(标注“STOP”)。
致命扣分点:
- 地址字节写成0x50(8位)而非0x28(7位);
- ACK画在SCL低电平期间(必须在SCL高电平);
- 停止条件画成SDA先高再SCL高(顺序颠倒);
- 忘记标SCL空闲电平(I2C要求SCL空闲为高)。
6.2 高频真题2:SPI的CPOL=1, CPHA=0模式下,数据在何时采样?请画出SCLK和MOSI波形示意
满分作答要点:
- CPOL=1:SCLK空闲为高电平;
- CPHA=0:数据在SCLK第一个边沿采样 → 即下降沿(因空闲为高,第一个边沿是高→低);
- 波形:SCLK为方波,空闲高;MOSI在SCLK下降沿前建立数据,在下降沿采样;下一个数据在下一个下降沿采样。
避坑提醒:
- 切勿画成“上升沿采样”,那是CPHA=1;
- 切勿让MOSI在SCLK上升沿变化(因CPOL=1,上升沿是无效边沿);
- 标注清楚“采样点”在下降沿中点。
6.3 高频真题3:UART通信中,若波特率误差为3%,是否一定失败?为什么?
满分作答要点:
- 不一定失败,但风险极高。RS232标准允许±2%误差,±3%已超限;
- 误差影响在帧末:假设10位帧(1起+8数+1停),每位误差3%,累计误差达30%,即第10位采样点偏移0.3位宽;
- 若偏移>0.5位宽,采样点落入错误电平区域,导致停止位误判为数据位,引发帧错位。
- 实际中,若双方误差符号相反(一正一负),可抵消;但单方3%误差,通信成功率<50%。
加分回答:
- 解决方案:换用误差更小的晶振(如11.0592MHz),或启用MCU的波特率校准寄存器(如STM32的USARTDIV小数部分)。
7. 我踩过的坑与私藏技巧:十年调试笔记精华
7.1 UART:那些年被“电平”坑惨的瞬间
- 3.3V与5V混接的血泪史:某次将STM32(3.3V IO)的TX直连5V Arduino的RX,运行一周后Arduino RX口永久损坏。正确做法:3.3V TX→5V RX可用电阻分压(10k+20k),但5V TX→3.3V RX必须用电平转换芯片,不可用电阻——因5V高电平可能击穿3.3V IO的钳位二极管。
- USB转串口的隐藏雷区:CH340芯片的TXD输出是3.3V TTL,但某些山寨模块为兼容旧设备,偷偷加了上拉到5V,导致接STM32时TX电压被拉高到4.2V,长期工作加速IO老化。我的检测法:空闲时测TX对地电压,若>3.4V,立即停用。
7.2 I2C:上拉电阻不是“随便选一个”
- 多电压系统上拉策略:某项目MCU是3.3V,挂载的传感器是5V,I2C总线需兼容两者。错误做法:全用3.3V上拉 → 5V传感器无法识别高电平;全用5V上拉 → 3.3V MCU IO可能过压。正确解法:用双电压电平转换器(如PCA9306),或为SDA/SCL分别接3.3V和5V上拉,靠转换器内部MOSFET隔离。
- “热插拔”I2C设备的禁忌:千万别在系统运行时插拔I2C模块!因SDA/SCL可能被瞬间拉低,触发总线锁死。必须设计硬件复位电路,或软件中加入总线恢复函数(发送9个时钟脉冲)。
7.3 SPI:片选线的“幽灵干扰”
- SS线串扰致SPI失效:某高速SPI Flash读写失败,波形显示MISO数据错位。最终发现:SS线与SCLK走线平行且过近,SCLK翻转时通过电容耦合在SS线上产生尖峰,导致从机误触发片选。解决方案:SS线加宽地线隔离,或改用“SS+GND”差分走线。
- DMA传输中的SPI陷阱:用DMA发SPI数据时,若未在DMA传输完成中断中及时拉高SS,从机可能将后续数据误认为同一帧。我的固定模板:DMA回调函数中,先
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET),再处理数据。
最后分享一个小技巧:面试前夜,别再背定义,拿出逻辑分析仪(或Saleae免费版),抓三组真实波形——UART发字符串、I2C读传感器、SPI写Flash,自己标出起始位、地址、数据、ACK、采样点。当你能指着波形说“这里错了”,面试官就知道:你不是背书的,是动手干过的。