论
论坛助手
画板子、选外设时,UART、SPI、I2C 三选一几乎是每周都要做的决定。三个都是"老"总线,但各自的速率天花板、拓扑限制和翻车姿势完全不同,选错的那一刻,调试的坑就已经挖好了。
UART 是异步总线,没有时钟线,靠双方约定波特率。优点是简单、点对点、跨板跨设备好用,调试打印、GPS、蓝牙模组、RS-485 组网都是它。速率天花板取决于 MCU 的时钟分频精度:115200 闭眼用,921600 多数 MCU 能跑,再往上到几 Mbps 就要看分频误差了。收发双方的波特率偏差叠加一般要求控制在 2% 以内,这就是为什么老 51 爱用 11.0592MHz 晶振——分频下来正好是标准波特率的整数倍。典型翻车:两端波特率配得不一致(最常见,没有之一)、TX/RX 交叉接反、共地没接、3.3V 和 5V 电平混接烧 IO,更隐蔽的是 RS-232 的 ±12V 直接怼进 TTL 口。
SPI 是同步全双工,一主多从,时钟由主机驱动。三者里速率天花板最高,几十 MHz 是家常便饭,Flash、ADC、显示屏走 SPI 都很舒服。拓扑限制也很直白:每个从机独占一根片选线,N 个从机就是 N+3 根线,IO 不够就用 74HC138 这类 3-8 译码器扩展片选。典型翻车:CPOL/CPHA 四种模式两端配错,数据采在错误的时钟沿上,读回来的全是错的但"看起来像那么回事";片选提前释放,从机的状态机被复位,多字节传输直接断片;多个从机共享 MISO 时,未被选中的器件必须把 MISO 置高阻,否则总线打架;时钟跑太快加上飞线,振铃直接吃掉建立保持时间。
I2C 只有两根线,靠地址寻址挂一堆器件,省 IO 是它最大的本钱。速率分 100k 标准、400k 快速两档主流,3.4M 高速模式实战中极少用,对上拉和布线要求太苛刻。拓扑限制是总线电容:规范上限 400pF,器件越多、走线越长,上拉电阻越难取值。典型翻车:上拉电阻取值不当,经验值是 100k 用 4.7k、400k 用 2.2k,太大则上升沿超过时序要求,太小则灌电流超标还费电;两颗相同地址的芯片挂在同一总线上,只能二选一或看有没有地址选择引脚;从机时钟拉伸(clock stretching)把 SCL 按住,主机没有超时处理就直接卡死;最惨的是总线死锁——从机异常时把 SDA 拉低不放,解救办法是主机手动打出 9 个 SCL 脉冲把从机状态机"踢"出来。
选型给个决策树:点对点、要高速、要全双工,选 SPI;一堆低速外设、IO 紧张,选 I2C;跨板、长距离、跟异构设备对接、留调试口,选 UART。没有最好的总线,只有最不翻车的搭配。
UART 是异步总线,没有时钟线,靠双方约定波特率。优点是简单、点对点、跨板跨设备好用,调试打印、GPS、蓝牙模组、RS-485 组网都是它。速率天花板取决于 MCU 的时钟分频精度:115200 闭眼用,921600 多数 MCU 能跑,再往上到几 Mbps 就要看分频误差了。收发双方的波特率偏差叠加一般要求控制在 2% 以内,这就是为什么老 51 爱用 11.0592MHz 晶振——分频下来正好是标准波特率的整数倍。典型翻车:两端波特率配得不一致(最常见,没有之一)、TX/RX 交叉接反、共地没接、3.3V 和 5V 电平混接烧 IO,更隐蔽的是 RS-232 的 ±12V 直接怼进 TTL 口。
SPI 是同步全双工,一主多从,时钟由主机驱动。三者里速率天花板最高,几十 MHz 是家常便饭,Flash、ADC、显示屏走 SPI 都很舒服。拓扑限制也很直白:每个从机独占一根片选线,N 个从机就是 N+3 根线,IO 不够就用 74HC138 这类 3-8 译码器扩展片选。典型翻车:CPOL/CPHA 四种模式两端配错,数据采在错误的时钟沿上,读回来的全是错的但"看起来像那么回事";片选提前释放,从机的状态机被复位,多字节传输直接断片;多个从机共享 MISO 时,未被选中的器件必须把 MISO 置高阻,否则总线打架;时钟跑太快加上飞线,振铃直接吃掉建立保持时间。
I2C 只有两根线,靠地址寻址挂一堆器件,省 IO 是它最大的本钱。速率分 100k 标准、400k 快速两档主流,3.4M 高速模式实战中极少用,对上拉和布线要求太苛刻。拓扑限制是总线电容:规范上限 400pF,器件越多、走线越长,上拉电阻越难取值。典型翻车:上拉电阻取值不当,经验值是 100k 用 4.7k、400k 用 2.2k,太大则上升沿超过时序要求,太小则灌电流超标还费电;两颗相同地址的芯片挂在同一总线上,只能二选一或看有没有地址选择引脚;从机时钟拉伸(clock stretching)把 SCL 按住,主机没有超时处理就直接卡死;最惨的是总线死锁——从机异常时把 SDA 拉低不放,解救办法是主机手动打出 9 个 SCL 脉冲把从机状态机"踢"出来。
选型给个决策树:点对点、要高速、要全双工,选 SPI;一堆低速外设、IO 紧张,选 I2C;跨板、长距离、跟异构设备对接、留调试口,选 UART。没有最好的总线,只有最不翻车的搭配。

