资讯动态

UART、I2C、SPI总线选型与实战调试指南

发布时间:2026/10/18 1:09:17 来源:尧图企业网站定制
1. 三种串行总线的本质差异与选型逻辑1.1 为什么面试官总爱问这三兄弟嵌入式岗位的面试里UART、I2C、SPI 几乎是必考题。原因很直接它们是芯片之间说话的最基础方式任何一个嵌入式项目都绕不开。面试官问这三个不是想考你背不背得出定义而是想看你能不能在实际项目里做出正确的选型判断。我面过不少人简历上写着精通UART、I2C、SPI结果一问你的传感器为什么用I2C不用SPI就卡住了。这说明他只会在现成的代码里调用库函数没有真正理解三种总线各自的适用边界。这三种总线本质上解决的是同一个问题两块芯片之间怎么用最少的引脚、最可靠的方式传输数据。但它们的解法完全不同就像从A地到B地可以走路、骑车、开车各有各的适用场景。1.2 一张表看清三者的核心区别先上一张对比表把最关键的参数拉出来。这张表建议你面试前默写一遍基本覆盖80%的考点。对比维度UARTI2CSPI信号线数量2根TX/RX2根SCL/SDA4根SCLK/MOSI/MISO/CS通信方式异步同步同步时钟来源双方各自约定波特率主机提供SCL主机提供SCLK拓扑结构点对点多主多从总线型一主多从星型寻址方式无地址靠物理连线区分7位或10位地址片选信号CS选中典型速率9600bps~1Mbps100k/400k/1M/3.4M几M~几十M引脚开销低低高每个从机多一根CS硬件复杂度低中需要上拉电阻低典型应用调试串口、GPS、蓝牙模块传感器、EEPROM、RTCFlash、显示屏、ADC这张表里最容易被追问的是为什么I2C需要上拉电阻和SPI为什么速率可以做到很高。这两个问题后面会展开讲。1.3 选型时我实际考虑的几个维度面试里被问到选型不要只背UART点对点、I2C多从机、SPI高速这种教科书答案。实际项目中我一般按下面这个顺序来决策第一看速率需求。如果数据量小、实时性要求不高比如读个温度传感器I2C足够了。如果要刷屏幕或者读写FlashSPI是唯一选择。UART的速率上限比较尴尬一般超过1Mbps就不太稳了。第二看引脚预算。PCB板子小、MCU引脚紧张的时候I2C的优势就出来了。两个引脚挂一堆设备这是I2C最核心的卖点。SPI每多一个从机就多一根CS线设备多了引脚吃不消。第三看距离。板内通信三种都行板间通信超过几十厘米UART反而更常见因为它是异步的对时钟线要求低。I2C和SPI都是同步总线长距离传输时钟线容易受干扰。第四看从机数量和种类。如果总线上要挂很多不同厂家的传感器I2C的标准化程度最高地址冲突也容易排查。SPI虽然快但不同厂家的时序模式CPOL/CPHA经常对不上调试起来头疼。实操心得我做过一个项目MCU要同时接温湿度传感器、EEPROM、OLED屏和一个无线模块。最后方案是传感器和EEPROM走I2COLED走SPI无线模块走UART。三种总线各司其职引脚刚好够用。如果全用SPI光CS线就要4根MCU根本不够。2. UART的核心考点与实操细节2.1 异步通信的约定到底约定了什么UART最核心的特点是异步。什么叫异步就是通信双方没有共享的时钟线全靠事先约定好的波特率来对时。这就像两个人约好每天早上8点见面没有电话确认全靠各自的表准不准。UART的一帧数据由这几部分组成起始位1位低电平告诉对方我要开始发了数据位5~9位通常是8位低位先发校验位可选奇校验、偶校验或无校验停止位1位、1.5位或2位高电平表示一帧结束面试常问波特率和比特率是一回事吗严格来说不是。波特率是每秒信号变化的次数比特率是每秒传输的比特数。但在UART里一个信号变化就对应一个比特所以两者数值相等。这个细节能答出来面试官会觉得你基础扎实。2.2 波特率误差能容忍多少这是UART最容易被追问的深水区。异步通信没有时钟线双方波特率如果有偏差累积到一帧的末尾就可能采样错位。UART接收端一般在每个比特的中间采样。一帧10位1起始8数据1停止如果双方波特率偏差太大到第10位的时候采样点可能已经偏出这个比特的范围了。经验公式是这样的假设接收端在第N位采样允许的最大偏差大约是1 / (2 × N)。对于10位的帧最坏情况是第10位允许偏差约5%。但实际工程中我一般要求双方波特率误差控制在2%以内留足余量。常见的波特率误差来源晶振精度不够比如用内部RC振荡器分频系数除不尽比如系统时钟除出来不是整数踩过的坑有一次用内部RC振荡器跑115200波特率通信时好时坏。后来换成外部晶振问题立刻消失。内部RC振荡器精度可能只有±2%加上对方也有误差累积起来就超了。所以高速UART通信外部晶振几乎是必须的。2.3 流控什么时候需要RTS/CTSUART还有两根可选的流控线RTS请求发送和CTS清除发送。当接收方缓冲区快满了就拉高RTS告诉对方先别发了。什么时候需要流控两种情况速率高、数据量大比如115200以上连续传输接收方CPU来不及处理接收方处理能力弱比如MCU要同时处理其他任务串口中断优先级低大部分简单应用不需要流控两根线TX/RX就够了。但如果你的项目里串口丢数据先检查是不是没开流控。2.4 UART调试的实战技巧调试UART我一般按这个顺序排查第一步确认波特率。这是最常见的错误来源。双方波特率不一致收到的就是乱码。用示波器量一下TX线的位宽1/位宽就是波特率。第二步确认电平标准。TTL电平0~3.3V或0~5V和RS232电平负逻辑±12V不能直接对接需要电平转换芯片。我见过有人把TTL的TX直接接到RS232的RX上结果芯片烧了。第三步确认TX/RX交叉。A的TX接B的RXA的RX接B的TX。这个错误新手经常犯而且症状是完全没反应很容易误判为硬件坏了。第四步看数据格式。数据位、停止位、校验位是否一致。特别是校验位一方开了另一方没开收到的数据会错位。现象可能原因排查方法完全无数据TX/RX接反、电平不匹配示波器看TX线有无波形收到乱码波特率不一致测量位宽反推波特率偶尔丢数据无流控、中断被抢占开启流控或提高中断优先级数据错位数据位/停止位/校验位不一致核对双方配置3. I2C的核心考点与实操细节3.1 开漏输出与上拉电阻的必然性I2C最经典的面试题为什么SCL和SDA需要上拉电阻答案要从它的电气结构说起。I2C的引脚是开漏输出Open-Drain。开漏意味着引脚只能主动拉低不能主动拉高。要输出高电平只能靠外部上拉电阻把线拉高。为什么这么设计因为I2C是总线型拓扑多个设备挂在同一根线上。如果两个设备同时输出一个想拉高一个想拉低就会短路。开漏结构天然实现了线与逻辑只要有一个设备拉低线就是低所有设备都释放线才被上拉电阻拉高。这样就避免了总线冲突时的短路问题。上拉电阻的阻值怎么选这是个计算题阻值太小功耗大且可能超过设备的灌电流能力阻值太大上升沿变缓高速通信时波形来不及拉高经验公式Rp(max) tr / (0.8473 × Cb)其中tr是允许的最大上升时间Cb是总线电容。标准模式100kHztr1000ns快速模式400kHztr300ns。实际选型3.3V系统常用4.7kΩ5V系统常用10kΩ。总线电容大或者速率高的时候要减小阻值比如2.2kΩ。实操心得我曾经遇到一个I2C通信不稳定的问题波形上看SDA的上升沿特别缓。后来发现是总线上挂了8个设备电容太大4.7kΩ的上拉电阻不够。换成2.2kΩ后波形立刻变陡通信稳定了。所以设备多的时候上拉电阻要相应减小。3.2 起始、停止、应答I2C的握手礼仪I2C的通信过程有一套严格的时序规范面试经常要求手画时序图。起始条件StartSCL为高时SDA由高变低。这个特殊的跳变告诉所有设备通信要开始了。停止条件StopSCL为高时SDA由低变高。表示通信结束。应答ACK/NACK每传输8位数据后接收方要拉低SDA一个时钟周期表示ACK或者保持高电平表示NACK。这里有个细节起始和停止条件都发生在SCL为高的时候而数据位的改变必须发生在SCL为低的时候。这样保证数据在SCL高电平期间是稳定的接收方可以可靠采样。3.3 时钟拉伸从机的慢动作权利时钟拉伸Clock Stretching是I2C一个很巧妙的设计。从机如果处理不过来可以在ACK阶段把SCL线拉低强制主机等待。主机检测到SCL没有被释放就知道从机还没准备好会一直等下去。这个机制让慢速从机也能挂在快速总线上。比如一个低速传感器挂在400kHz的I2C总线上它处理不过来的时候就可以拉伸时钟。但时钟拉伸也是坑。有些主机不支持时钟拉伸或者支持得不好。我遇到过主机的I2C控制器在时钟拉伸时超时退出导致通信失败。所以选型时要确认主从双方对时钟拉伸的支持情况。3.4 I2C地址冲突与排查I2C的7位地址理论上可以挂128个设备但实际可用的地址范围有限有些地址被保留而且很多传感器的地址是固定的或者只有两三个可选值。地址冲突的症状是总线上某个设备不响应或者响应错误。排查方法用I2C扫描工具很多MCU有现成的I2C扫描代码遍历所有地址看哪些地址有ACK查数据手册确认每个设备的地址以及地址是否可以通过引脚配置用逻辑分析仪抓波形看主机发出的地址和从机的响应如果两个设备地址确实冲突解决方案有用I2C多路复用器如TCA9548A把冲突的设备分到不同通道换用地址可配置的器件改用SPI接口的同类器件常见I2C问题症状解决方案地址冲突某设备不响应用多路复用器或换器件上拉电阻过大高速时通信失败减小阻值至2.2k~4.7k总线电容过大上升沿缓、波形畸变减小上拉电阻、减少设备数时钟拉伸不支持通信超时确认主从支持情况电源域不同电平不匹配用电平转换芯片4. SPI的核心考点与实操细节4.1 四根线的分工与全双工原理SPI用四根线完成通信SCLK时钟主机产生MOSIMaster Out Slave In主机发、从机收MISOMaster In Slave Out主机收、从机发CS片选低电平有效每个从机一根SPI是全双工的主机在MOSI上发数据的同时从机在MISO上发数据。这是因为SPI内部是一个移位寄存器主机和从机的寄存器首尾相连每个时钟周期双方各移出一位、移入一位。8个时钟周期后双方交换了一个字节。这个全双工特性是SPI比I2C快的重要原因之一。I2C是半双工同一时刻只能单向传输。4.2 CPOL和CPHASPI最容易被问倒的地方SPI有四种工作模式由CPOL时钟极性和CPHA时钟相位组合而成模式CPOLCPHA空闲时SCLK采样沿移出沿Mode 000低上升沿下降沿Mode 101低下降沿上升沿Mode 210高下降沿上升沿Mode 311高上升沿下降沿记忆方法CPOL决定空闲电平CPHA决定第一个边沿是采样还是移出。CPHA0时第一个边沿采样CPHA1时第二个边沿采样。面试常问你的Flash用哪个模式大部分Flash支持Mode 0和Mode 3因为这两个模式在空闲时SCLK都是低或高采样沿都是上升沿兼容性好。但有些器件只支持特定模式配置错了就读不出数据。踩过的坑有一次调试一个SPI传感器怎么都读不出正确数据。查了半天发现传感器要求Mode 3我配的是Mode 0。改过来立刻正常。所以拿到新器件第一件事就是查数据手册确认SPI模式。4.3 片选信号的时序要求CS信号看似简单其实也有讲究建立时间CS拉低到第一个SCLK边沿之间要有足够的时间让从机准备好保持时间最后一个SCLK边沿到CS拉高之间也要有时间让从机完成内部处理多从机切换切换CS时要确保前一个从机的CS已经拉高再拉低下一个有些器件对CS的时序要求很严格比如某些ADC在CS拉低后需要等待几个时钟周期才能开始转换。这些细节都要查数据手册。4.4 SPI速率能跑多高SPI的速率上限主要受三个因素限制主机的SPI控制器能力有些MCU的SPI最高只能到系统时钟的1/2或1/4从机的最大时钟频率查数据手册比如某些Flash支持50MHz某些传感器只支持10MHzPCB走线质量速率越高对走线的阻抗匹配、长度控制要求越高实际项目中我一般先按从机手册的最大频率配置然后逐步降频测试稳定性。如果高速下不稳定先检查PCB走线再考虑降频。SPI速率问题可能原因排查方法高速下数据错走线太长、阻抗不匹配缩短走线、加串联电阻完全无数据CS接错、模式不对检查CS连线、确认CPOL/CPHA数据偶尔错时序余量不足降低速率、检查建立保持时间多从机互相干扰CS切换时序问题确保CS切换间隔足够5. 面试高频问题与实战排查速查5.1 那些年被问过的经典问题整理一下我遇到过的、以及我面试别人时问过的经典问题UART相关波特率误差怎么计算能容忍多少起始位和停止位的作用是什么奇偶校验能检测出什么错误检测不出什么错误流控什么时候需要RTS/CTS怎么工作I2C相关为什么需要上拉电阻阻值怎么选起始条件和停止条件怎么定义时钟拉伸是什么有什么作用7位地址和10位地址有什么区别总线仲裁是怎么实现的SPI相关四种模式怎么区分你常用哪种全双工是怎么实现的片选信号的作用是什么可以省掉吗SPI为什么比I2C快综合对比你的项目里为什么选这个总线如果总线通信失败你怎么排查三种总线各自的优缺点是什么5.2 总线排查的通用思路不管是哪种总线排查思路都是相通的第一步确认硬件连接。用万用表量通断确认没有虚焊、短路。特别是地线一定要共地。第二步看电源和电平。双方供电是否正常电平标准是否匹配3.3V的器件和5V的器件直接对接可能损坏。第三步用示波器或逻辑分析仪抓波形。这是最直接的方法。看时钟有没有、数据线有没有跳变、时序是否符合预期。第四步对照数据手册。确认时序参数、模式配置、地址设置是否正确。第五步简化测试。如果总线上挂了多个设备先只留一个排除干扰。5.3 逻辑分析仪的使用技巧逻辑分析仪是调试串行总线的利器。我用的是某款8通道的逻辑分析仪配合开源软件能直接解码UART、I2C、SPI协议。使用技巧采样率要足够至少是被测信号频率的4倍以上一般设10倍比较稳触发条件设好比如I2C可以设起始条件触发UART可以设特定字节触发解码器配置要对波特率、数据位、校验位、SPI模式都要和实际配置一致看时序余量不光看数据对不对还要看建立时间、保持时间够不够实操心得逻辑分析仪抓I2C的时候如果发现SDA和SCL的上升沿很缓说明上拉电阻太大或者总线电容太大。这时候即使数据能解码实际产品里也可能因为温度变化、电压波动而通信失败。所以波形质量比数据正确性更重要。5.4 常见问题速查表总线问题现象最可能原因快速验证UART完全无数据TX/RX接反交换两根线试试UART乱码波特率不匹配测量位宽反推UART偶尔丢字节无流控、中断延迟开流控或提高优先级I2C无ACK地址错、设备没供电用扫描工具遍历地址I2C波形上升沿缓上拉电阻大、电容大减小上拉电阻I2C通信超时从机时钟拉伸确认主机支持情况SPI无数据CS没拉低、模式错检查CS和CPOL/CPHASPI数据错位采样沿不对换一种SPI模式SPI高速不稳定走线问题降频测试6. 从面试到实战的几点体会面试里问总线表面考的是知识点实际考的是你有没有真正调过、踩过坑。我见过能把时序图背得滚瓜烂熟但没接过示波器的人也见过说不出理论但一上手就能定位问题的人。前者面试可能过但实际项目里会吃亏。我的建议是学这三种总线一定要动手。找一块开发板接一个传感器用逻辑分析仪抓波形把数据手册里的时序图和实际波形对照着看。这样学一遍比看十遍书都管用。另外面试的时候如果被问到不会的不要硬编。可以说这个细节我记不太清了但我的排查思路是……展示你的方法论比背答案更重要。总线调试的核心能力不是记住所有参数而是遇到问题时知道从哪里入手。最后分享一个我常用的调试习惯每次接手一个新器件先写一个最简单的读写测试只读一个寄存器用逻辑分析仪确认波形正确再往上叠功能。这样出问题的时候能快速定位是新功能的问题还是底层通信的问题。这个习惯帮我省了大量调试时间。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑