news 2026/10/23 12:44:46

嵌入式面试必问:UART、I2C、SPI串行协议全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式面试必问:UART、I2C、SPI串行协议全解析

1. 三剑客全景概览:为什么面试官总爱问这些

做嵌入式开发的,面试时几乎绕不开这三个协议:UART、I2C、SPI。我在技术社区分享过不少招聘面经,发现面试官考串行协议并不是为了刁难人,而是这三兄弟确实是板级通信的基石——从调试串口打印日志,到外挂传感器、Flash芯片,到高速采集数据,基本天天都要打交道。能把它们讲清楚的人,说明底层功扎实,干活靠谱。

先给大家一个整体认知框架。这三种协议本质都属于串行通信,也就是数据在单条或双条线上按位传输。串行对比并行的优势是省引脚、成本低、抗干扰好布线方便,代价是速度相对慢一些。而 UART、I2C、SPI 三者的差异,可以浓缩成一张表:

特性UARTI2CSPI
线数2根(TX/RX)2根(SDA/SCL)4根以上(MOSI/MISO/SCLK/CS)
同步方式异步,需双方约定波特率同步,由主机产生时钟同步,由主机产生时钟
双工模式全双工半双工全双工
连接设备数点对点(一般)多设备,靠地址区分多设备,靠片选区分
速率通常 9600~3Mbps标准100Kbps,快速400Kbps,高速3.4Mbps可高达几十Mbps
核心优势简单、通用、长距离引脚少、可挂多设备速度快、吞吐量大
核心劣势速率受限、无多机架构速率一般、有上拉电阻功耗引脚多、无标准流控和校验

注意表里的“通常”“一般”这类词。实际工程里基于这三者的扩展协议五花八门,比如 RS-485 是 UART 的电平增强版,SMBus 是 I2C 的智能管理变体,SDIO、JTAG 也和 SPI 有千丝万缕的关系。面试时能答出这一层“衍生关系”,会让面试官觉得你不仅会调库,还真把协议吃透了。

2. UART 深度拆解:异步通信的“傻瓜”也有讲究

2.1 帧格式与电平逻辑

UART 全称是 Universal Asynchronous Receiver/Transmitter。很多人觉得 UART 最简单——确实,从使用角度来说配置三个寄存器就能发数据。但它“异步”这两个字,才是理解整个协议的关键。

所谓异步,就是收发双方没有共享时钟,完全依靠约定的波特率(Baud Rate)来对齐每一位。数据在线路上平时保持高电平(空闲态),发送起始位时拉低一个位时间,然后逐位发出数据,最后用停止位(1或2位)恢复高电平。

一个标准 UART 帧长这样:

  • 空闲:高电平
  • 起始位:1位,低电平
  • 数据位:5~8位,通常为8位,低位先发
  • 校验位:可选,奇校验或偶校验
  • 停止位:1位、1.5位或2位,高电平

以上加起来,最常用的配置是 8N1,意思就是 8 个数据位、无校验、1 个停止位。算下来一帧共 10 个位时间(起始1 + 数据8 + 停止1)。

这里有一个面试常考的计算题。波特率为 115200 时,每传输一个字节耗时多少?

公式很简单:一帧时间 = (1 / 波特率) × 帧位数。代入数字:1/115200 × 10 ≈ 86.8 微秒。换算成吞吐量,理论上每秒能传 11520 字节,约 11.25 KB/s。

面试如果追问“那无校验、8位数据、1位停止的配置为什么选 8N1 最通用?”你可以说,8位正好一个字节,无校验省去额外开销,1位停止位在绝大多数短距离场景足够。这种“够用就好”的网络思维,在工程里特别吃香。

2.2 波特率误差为什么不能超过 2%

异步通信最怕的就是两边节奏不一致。发送方按 115200 的节拍发,接收方如果按 115000 采样,累计误差会导致采样点逐渐偏离位中心,最终错位、乱码。

经验值是波特率误差应控制在 ±2% 以内,实际可靠设计最好小于 ±1%。工程上最常见的误差来源有两个:一是晶振精度不够(便宜的有源晶振误差可能到 ±50ppm,对高速率影响明显),二是单片机分频后无法整除得到目标波特率。

举个例子,某芯片主频 16MHz,想得到 115200 波特率,需要用分频系数 16000000 / (16 × 115200) ≈ 8.68。分频系数必须取整数,取 9 时实际波特率约 111111,误差高达 3.5%。这种误差大概率没法正常通信用。这时候要么换主频能整除的芯片,要么改用 8MHz 晶振加 PLL 配置到合适频率,要么降低通信速率到 57600(分频系数 17.36,取17误差约 2.1%,勉强能用)。

实操建议:选型时先把主频和波特率分频表拉出来用 Excel 算一遍,达不到 ±1% 就直接换方案。这类看起来“无关紧要”的细节,往往就是项目量产时才暴露的雷。

3. I2C 协议精讲:硬件简单,软件“戏多”

3.1 两根线上的“停-开”协议

I2C 只有两根线:SDA(数据)和 SCL(时钟),而且都是开漏结构,需要外部上拉电阻。因为开漏,所以线与(Wired-AND)特性自然实现了多方通信,同时支持多主机仲裁。

对比 UART,I2C 最大的特点是引入了“地址”概念。总线上每个设备有唯一的 7 位或 10 位地址,主机发起通信先发送起始条件(SCL 高时 SDA 拉低),然后发设备地址和读写标志位。被寻址的设备在应答位拉低 SDA 表示 ACK,否则保持高电平表示 NACK。这个过程叫“寻址-应答”。

面试官常追问的几个点:

  • 起始条件:SCL 为高时,SDA 由高变低
  • 停止条件:SCL 为高时,SDA 由低变高
  • 数据有效性:SCL 高电平期间 SDA 必须保持稳定,只有 SCL 低电平时 SDA 才允许变化
  • 应答机制:每字节后跟随一个 ACK 位,由接收方产生

这里做个生活化类比:I2C 就像教室里老师点名。SCL 是老师的节拍器,SDA 是学生举手发言的线。起始条件等于老师说“上课了”,地址就是点名“张三”,张三举手(拉低 SDA)表示“到”,老师再说“坐下”。如果没人答应(SDA 持续高电平),老师就知道这个学生不在教室。

3.2 上拉电阻到底选多大

I2C 上拉电阻选值是有讲究的,这也是硬件工程师面试的经典题。阻值过小,灌电流太大,低电平可能低于 VIL 阈值,逻辑判错;阻值过大,RC 充放电太慢,上升沿变缓,信号质量恶化。

计算公式基于总线电容:

  • Rp_min = (VDD - VOL_max) / IOL_max
  • Rp_max = t_r / (0.8473 × C_bus)

其中 VDD 为供电电压,VOL_max 是低电平最大电压(通常 0.4V),IOL_max 是器件灌电流能力(通常 3mA 或 20mA),t_r 是上升沿要求(快速模式 300ns,标准模式 1000ns),C_bus 是总线总电容。

举个实际例子:3.3V 供电,灌电流 3mA,总线电容约 200pF,快速模式。

Rp_min = (3.3 - 0.4) / 0.003 ≈ 967Ω Rp_max = 300ns / (0.8473 × 200pF) ≈ 1.77kΩ

所以电阻要选在 1kΩ 到 1.7kΩ 之间,取近似标准值 1.5kΩ。很多开发板默认焊 4.7kΩ 或 10kΩ,在低速短线上没毛病,但如果是高速模式或者线上挂了很多设备,就必须计算而不是抄默认值。

我自己踩过坑:某项目 I2C 总线挂了三片传感器,线长超过 30cm,用了 10kΩ 上拉,结果通信时好时坏,示波器一看上升沿都成圆弧了,换成 3.3kΩ 后恢复稳定。经验值:总线上设备多、线长时,优先选小阻值,但别低于最小计算值。

3.3 I2C 地址冲突与多主机仲裁

I2C 还有一个高频考点:如果两个从机地址一样会怎样?答案很简单,两者都会在应答位拉低 SDA,主机无法区分它们,通信会乱。所以设计时要么选不同地址引脚配置的设备,要么用多路 I2C 开关切换。

多主机仲裁的规则也常被问到:当两个主机同时拉低 SCL 时,总线进入仲裁状态。谁先发送 0,谁就占住了总线;发送 1 的那个主机发现 SDA 被拉低但自己发送的却是高电平,于是自动放弃总线,等下一轮重试。这叫“低电平优先”原则。

要注意的是,仲裁过程跨越地址位和数据位,主机必须保证在仲裁过程中不能中途退出,否则会破坏总线时序。实际操作中,大多数嵌入式场景只有一个主机,多主机仲裁多用于复杂的板级管理系统,能答上来绝对是加分项。

4. SPI 协议:速度之王,模式选择见真章

4.1 四根线的全双工通道

SPI 全称 Serial Peripheral Interface,由 Motorola 提出。基本四根线:

  • SCLK:主机产生的串行时钟
  • MOSI:主机输出,从机输入
  • MISO:从机输出,主机输入
  • CS/SS:片选线,低电平有效,一个从机一根

它的核心思路是“环形移位寄存器”。主机和从机各自有一个移位寄存器,时钟边沿到来时,两边同时移出一个 bit 又同时移入一个 bit。这样每发一个字节,必然也收到一个字节。这种同时收发机制的作业效率特别高,所以 SPI 能跑得比 I2C 快得多。

SPI 的这一特点也直接回答了面试题:“SPI 是全双工,为何 MOSI 和 MISO 能同时传输?”原理就是移位寄存器的双向同步移动。硬件上两根线各走各的数据方向,互不干扰。

4.2 四种模式:CPOL 和 CPHA 的组合

SPI 最让人头疼的就是四种模式选择。这儿的 CPOL 决定时钟空闲电平,CPHA 决定数据采样边沿:

  • CPOL=0:空闲时 SCLK 为低
  • CPOL=1:空闲时 SCLK 为高
  • CPHA=0:在第一个时钟边沿采样数据
  • CPHA=1:在第二个时钟边沿采样数据

于是有四种组合:

模式CPOLCPHASCLK 空闲电平采样边沿发送边沿
Mode 000低上升沿下降沿
Mode 101低下降沿上升沿
Mode 210高下降沿上升沿
Mode 311高上升沿下降沿

工程上最常用的是 Mode 0(CPOL=0,CPHA=0),也就是空闲低电平、上升沿采样。大部分 Flash、SD 卡、传感器都默认支持 Mode 0 或 Mode 3。

面试官问模式选择时,很容易被一个“陷阱”带跑:模式匹配不是看心情选,而是要读从机数据手册,看它要求的时序图。比如某传感器手册说“数据在 SCLK 上升沿被锁存,下降沿输出”,这就对应 CPOL=0、CPHA=0 的 Mode 0。如果你按 Mode 3 配,从机可能能通,但信号时序已经不够规范,边沿余量不足等着飘数据。

我常用的确认方法是在从机初始化完成后,立刻发一个能读到固定辨识码的命令。如果读回来的字节不对,十有八九就是模式配错了——这个技巧在排查问题时报错特别快。

4.3 SPI 的坑:无应答、无校验、无流控

SPI 和 UART、I2C 一个显著不同是它没有标准的应答机制。主机拉低 CS,开始发数据,从机要是没准备好,它根本没办法在协议层面告诉主机“稍等一下”。这就要求开发者在数据链路之上自己设计握手,比如加一段“总线忙”标志位、状态查询命令,或者让片选信号做基本的超时控制。

SPI 也没有统一定义的校验位,可靠性完全靠链路层保证。这在短距离板级通信里问题不大,但如果走长线或者环境有干扰,就需要额外加 CRC 校验或者靠上层协议重传。

还有一个小坑:MISO 在从机未被选中的时候,应该输出三态(高阻态),这样多个从机的 MISO 才能并在一起。如果某个从机在不被选中时还强制输出高电平,那就把总线上其他从机的数据给“霸占”了。选器件的时候要留意数据手册里有没有写“MISO disabled when SS is high”或者类似表述。

5. 面试高频题突击清单与避坑经验

5.1 容易答错的 20 道题快问快答

整理自多次模拟面试和网友投稿的高频题,这里直接给答案和思路,方便刷题用。

  • UART 为什么需要约定波特率?因为没有共享时钟,收发双方靠事先约定的位时间对齐采样。
  • 一帧 8N1 的 UART 数据最小传输时间怎么算?帧共 10 位,t = 10 / 波特率。
  • I2C 为什么要开漏加外部上拉?为了实现线与逻辑,支持多设备共享总线,同时避免推挽输出产生争电。
  • I2C 起始条件、停止条件怎么区分?SCL 高期间 SDA 下降沿为 START,SDA 上升沿为 STOP。
  • SPI 和 I2C 哪个速度快?SPI 快,主时钟可以很高且没有地址应答开销。
  • SPI 支持多主机吗?支持,但没有标准仲裁机制,需要软件实现片选和冲突检测。
  • I2C 为什么需要 ACK?接收方通过拉低 SDA 确认收到,发送方据此判断可以继续发下一个字节。
  • NACK 的场景有哪些?最后字节后主机的停止信号、地址无响应、从机未就绪。
  • UART 能否实现多机通信?可以,但需要额外规定,比如地址帧 + 数据帧的 9 位模式,或者挂 RS-485。
  • I2C 总线最长能接多少设备?受总线电容限制,标准模式负载电容上限 400pF,快速模式 400pF,高速模式可放宽。

以上这些题都不难,但非常考验基础是否牢固。我建议把每个题当做一个“引子”继续往下挖,比如答出 NACK 之后试着解释主机如何处理 NACK、要不要重发、重发间隔怎么定,这是区分“会背”和“真懂”的关键。

5.2 实际项目中的排查思路

面试题只是敲门砖,真正干活时排查串行通信问题才是检验实力的时候。分享一套我自己常用的排查流程:

第一步,示波器先看波形。抓 SCLK、SDA、CS 三根线,看起始条件、地址、ACK 是否齐全。如果波形看起来完全正常但数据不对,大概率是端的配置(模式、波特率)和从机实际需求和需求不符。

第二步,确认电平域。3.3V 的器件接在 5V 总线上,不经过电平转换,看起来能跑但属于超规格使用,偶发问题从这里找。

第三步,检查电源和地。串行通信出问题,先量从机供电、共地,很多“协议错误”其实是没共地,导致收发双方参考电平不一致。

第四步,降速验证。I2C 从 400k 降到 100k,SPI 从 20M 降到 1M,UART 从 115200 降到 9600。如果问题消失,基本可以锁定信号完整性问题,而非协议逻辑问题。

第五步,软件排查。看初始化时序,尤其 I2C 上电后有没有可能从机还没 Ready 就立刻发地址,导致 NACK;SPI 主机的 DMA 和 GPIO 复用有没有冲突;UART 的中断优先级和处理耗时有没有丢字节。

这五步走完,能解决九成以上的串行通信疑难杂症。顺序很重要,不要一上来就怀疑驱动代码。硬件波形是最客观的“目击证人”,符合时序逻辑的波形保障,再回头查软件才不冤枉人。

5.3 区分“会写代码”和“懂通信”的细节

最后说几个我面试别人时最常留意的地方,也是很多人简历明明写了精通却一聊就穿帮的点:

第一,提到 UART 的时候,能否说出“环形队列接收”的想法。只会用阻塞的接收函数不算懂异步通信。真正的工程场景里数据是不定长、间断性到来的,一个合理的生产者-消费者 FIFO 可以避免丢数据和 CPU 空转。

第二,I2C 通信时是否了解“时钟拉伸”(Clock Stretching)。从机可能因忙于内部处理而拉低 SCL 迫使主机等待。这个机制在低速传感器里很常见,PCB 级通信不支持的话,必须要处理这种情况或选择支持该特性的设备。

第三,SPI 的高速传输有没有考虑 DMA。低主频下 CPU 搬数据没问题,一旦 SPI 跑到 20Mbps 以上,中断搬数据会吃掉大量 CPU 性能。面试时被问到高速 SPI 设计时,能主动提到 DMA 环形缓冲和乒乓缓冲,是资深工程师的加分信号。

这些细节不一定在一道题里全都问,但聊到一定深度时必然浮现。打好基础,比背一百道题都管用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 4:25:51

PSE认证菱形和圆形两种标识有什么区别,跨境卖家怎么判断?

PSE菱形和圆形标识的核心区别,不在于外观或“安全等级高低”,而在于产品是否属于日本《电气用品安全法》规定的特定电气用品。菱形通常对应监管要求更严格、需要第三方适合性检查的产品;圆形通常对应非特定电气用品,企业完成规定的…

作者头像 李华
网站建设 2026/10/23 7:26:45

双向放大器BDA从原理到选型:射频盲区覆盖与工程调试实战

1. 从一个让人头疼的信号盲区说起如果你在地下室、隧道、大型商场或者偏远厂区待过,大概率遇到过这种情况:手机信号格数看着还行,但电话打不出去、消息发不出去、刷个网页转半天圈。这不是运营商基站没建,而是信号在传播过程中被建…

作者头像 李华
网站建设 2026/10/22 14:33:46

STM32 SPI寄存器详解:从协议原理到驱动实战

这篇是《STM32寄存器白话手册》的第五章。前四章一路读下来,你应该已经把LED点亮、把系统时钟理清楚、也知道了寄存器操作和中断是怎么回事。这一章我选择讲SPI。它在通信场景里出场率极高,和USART比,它的时序更固定、逻辑更简单,…

作者头像 李华
网站建设 2026/10/17 12:13:55

国产车规芯片如何从OBC/DCDC切入?第一桶金实战指南

做车规芯片这些年,总被人问一个很现实的问题:“国产芯片想上车,第一笔单子该从哪个方向打?”我给的答案一直很一致:OBC/DCDC。车载充电机和隔离DC/DC变换器,听起来都是高压、大功率、强隔离,好像…

作者头像 李华
网站建设 2026/10/22 18:40:57

MySQL命令行生存指南:从登录到排错的工程实践

1. 为什么非得从命令行开始学MySQL——一个被低估的底层认知入口很多人一接触数据库,就急着打开图形化工具,点点鼠标建库建表,看起来效率很高。但我在带过几十个初学者项目后发现:凡是跳过命令行、直接上GUI的,三个月后…

作者头像 李华
网站建设 2026/10/21 9:34:44

VS2013下Ceres 1.14.0编译指南:非线性最小二乘求解器集成与避坑

简介:Ceres Solver 1.14.0 是一款广泛应用于机器人、计算机视觉与三维重建领域的 C 非线性优化库,核心用于求解最大似然估计转化而来的最小二乘问题。压缩包内含完整源码,兼容 Visual Studio 2013,适合需要实现位姿估计、SLAM 后端…

作者头像 李华