7.3 低速串行总线UART、I2C与SPI


7.3 低速串行总线 UART、I2C 与 SPI

本节摘要:板级互联的三种通用串行总线各有性格——UART 异步自由、I2C 两线组网、SPI 四线飙速;把三者的时序规则与仲裁机制并排摊开,会发现第 4、5 章的原理在贫瘠线路上的完整重演。

前两站的设备都是点对点接线,本站升级为网络视角:一条总线上挂多个设备、由协议分清"跟谁说话、何时说话"。三种总线吃透了,板级互联的九成场景都有了答案。

三种串行总线的性格

图 7-2:三种总线的线数、节奏与从属关系

图 7-2:三种总线的线数、节奏与从属关系

三者的时序规则各有一处必懂细节。UART 没有时钟线,收发双方按约定波特率各自计时,起始位的下降沿是唯一的对表机会——波特率偏差超过约百分之二,十位的累积误差就会让采样点滑出位宽,这也是"改错波特率读出一串乱码"的机理。I2C 的应答位是它的礼貌:主机每发完一个字节松开数据线,从机在第 9 个时钟把它拉低表示收到;从机没拉低就是没接住,主机据此决定重试还是放弃。SPI 的四个模式由时钟极性与相位组合而成,主机与从机的模式必须一致——模式配错时数据看似在动、实则每位移半格,读回的值形似随机数。

机制的重演:应答、仲裁与节奏

把三张协议说明书盖住名字再看,前几章的机制一个个回来了。I2C 的应答位是 5.3 节"接待与销号"的微缩——每个字节的收讫都有回执,比 UART 的裸发裸收多了确认环节。I2C 的多主仲裁是 4.3 节总线仲裁的线级变体:两个主机同时开讲,谁发送的零更多谁赢,输掉的主机检测到位错便自动退场且不损数据——仲裁在线上进行,全程无损。I2C 的时钟延展则是一个体贴的设计:慢速从机把时钟线按住不放,主机只好等待——这正是 2.2 节 READY 信号的精神续作,慢设备按拍请假的权力一直延续到两根线上。

SPI 干脆利落,没有应答没有仲裁,速度全靠时钟线硬堆——它是三种总线里"最像并行总线"的一个:一主多从、片选分权、全双工吞吐,唯一的妥协是每挂一个从设备多花一根片选线。

案例展开:一条卡死的 I2C 总线

背景:某面板控制器批量返修,故障现象一致——触摸与背光正常,但传感器读数全部冻结,复位后才恢复片刻又冻结。操作:冻结现场量两根 I2C 线,发现时钟线被恒定拉低——按协议这是某从机在"时钟延展",但延展几分钟不松手就是死锁而非延展;断电重启能恢复,说明从机内部逻辑卡在等某个条件;翻查固件日志,冻结前都有一条"读操作中途被复位中断"的记录,推断复位打断了从机一次跨字节操作,其内部状态机停在延展态等一个永远不会来的时钟沿。结果:两步修复——软件侧检测时钟线拉低超过阈值后,向总线补发九个时钟脉冲并跟一个停止条件,帮助从机状态机归位;硬件侧给 I2C 两线各加超时检测电阻网络作为兜底。解读:I2C 的礼貌(从机有权按住时钟)在异常场景会变成死锁的温床,协议的优雅特性都要问一句"异常时怎么退出"。变式:对可靠性要求苛刻的总线场景,可直接选用带内置超时的硬件控制器,或改用 SPI——牺牲组网能力换确定性。

一字节的账、地址的纠纷与片选的加法

UART 的效率要算帧的账:一个字节十位(一起始一停止,无校验),九千六百波特下每帧约一点零四毫秒,有效数据率只有九百六十字节每秒;加校验位与两个停止位,帧涨到十二位,有效率再降两成。串口的"波特率"永远大于"字节率",做吞吐预算时按帧算,不按位算——这是串口工程最常犯的算术错误。

I2C 的地址纠纷是组网的第一课:七位地址空间只有一百二十七个可用地址,传感器厂家的芯片出厂地址固定,同一块板上挂两颗同型号芯片就会撞号。解法三选一:带地址选择脚的芯片用引脚电平改地址;带地址自动递增协议的靠软件排位;实在不行就加 I2C 多路开关,分时接通各支路——又见"时间复用救空间不足"的老朋友。SPI 的片选做的是另一道加法:每挂一个从设备多花一根线,从设备多了以后用译码器把几根地址线扩成几十根片选——6.1 的译码手艺在串行世界照样通工。

补一件 UART 的常用附件:硬件流控。收方处理不过来时,用两根握手线告诉发方"暂停"与"继续"——数据在物理层就被限流,而不是靠上层协议亡羊补牢。它常被忽略,因为调试短接跳线时流控线常常缺席;可一旦接收侧有突发阻塞(写慢速存储、长临界区),没有流控的串口就是 5.4 案例的串口版。三种总线的补全到此齐整:串口补流控、I2C 补地址、SPI 补片选——每种协议的短板处,都有一件对应的工程配件。

三种总线还各有"速度上限从哪来"的答案,放在一起看很开眼界:串口的极限在收发双方的时钟误差与采样裕量,两线的极限在上拉电阻与总线电容组成的 RC 常数,四线的极限在时钟走线的完整性与片选的建立时间。同一个问题"能不能再快",三份答案指向三种物理量——判断一块新板的总线还能不能提速,先量对应的那个物理量,别急着改代码。

高频追问三则

问:I2C 为什么要开漏输出加上拉电阻? 因为总线的线与逻辑:任何一方拉低即为低,全部松手才为高。开漏是线与的电气前提,应答、仲裁、时钟延展全建立在它上面。上拉电阻的取值是速度与功耗的折中——太小费电流,太大边沿变缓限速。

问:SPI 主从的时钟极性配错,为什么读数"像是随机的"? 极性与相位决定在时钟的哪个沿采、空闲时时钟停在哪。配错一位,采样点就落在数据位的翻转边缘——收到的每一位都对一半错一半,拼出来自然是乱码。对不上时先把四种模式各试一遍,比查示波器还快。

问:串口只用来打印日志,波特率要不要拉满? 拉满的收益是日志刷得快,代价是误码率上升、线长受限。调试日志的瓶颈通常不在带宽而在刷写本身——日志太密反而改变时序(8.2 节的灵异事件)。合适就好, debugging 的第一戒律是别让工具扰动现场。

本节要点回顾

  • 三线三种性格:串口异步自由,两线组网省脚,四线全双工飙速。
  • UART 靠守约:无时钟线,波特率偏差超百分之二必出乱码。
  • I2C 的三件法宝:应答位、多主仲裁、时钟延展——前几章机制的微缩重演。
  • SPI 的四模式:极性与相位必须两端一致,配错即"位移半格"。
  • 异常退出是协议设计的隐藏考题:优雅特性在故障场景可能变成死锁。

下一站把总线拉进更狠的环境:工厂的电机噪声、几公里的距离、以及不允许停机的生产线。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U