
说实话,每次接到新项目我都会纠结一下:这四种常见接口到底用哪个?UART两根线最简单,但速率上不去;I2C也能挂一堆设备,但速率更慢;SPI速率够快,但布线麻烦;CAN可靠性高,可芯片成本也高。这不是理论问题,是实打实的工程选择。
干了这么多年硬件,我发现很多工程师对这四个接口的认知还停留在"知道但不确定"的状态。今天就把这四种接口的硬件差异彻底讲清楚,重点说实战中容易踩的坑。
一、UART:最简单但最慢UART这玩意儿,估计是每个工程师接触的第一个通信接口。它的工作原理其实很直接:两根线,TX发RX收,双方约定好波特率就能通信。听起来简单到不能再简单了,但魔鬼都在细节里。
硬件基础标准UART就两根数据线,加上一个共地就够了。很多初学者分不清TTL、RS232、RS485的区别——简单说,TTL就是芯片直接出来的电平,0-3.3V或者0-5V;RS232是把电平转换成±15V左右,抗干扰能力强一些;RS485是差分信号,能传1200米远,能挂128个设备。
波特率这块,115200是最常用的,但我见过不少人设成460800甚至921600也没问题,不过这得看芯片手册和PCB走线质量。速率上,UART基本在115200bps以下比较靠谱,高速UART也有,但应用场景不多。
典型应用场景我目前项目里用UART的地方主要是:蓝牙模块的AT指令通信、GPS模块的数据读取、还有一些调试串口。说白了,当你的数据量不大、实时性要求不高、设备之间的距离不超过几米的时候,UART是个省心的选择。
容易踩的坑电平匹配这个坑我见过太多人踩了。3.3V的系统接5V的模块,烧了芯片才知道后悔。还有就是波特率精度问题——有些低速晶振分频出来的波特率偏差太大,数据乱码你都不知道咋回事。
二、SPI:高速全双工如果说UART是串口里的小学生,那SPI就是大学生。它能做到全双工通信,速率轻松上几十MHz,这对于需要大数据量传输的场景简直是救星。
硬件基础SPI需要四根线:CLK时钟线、MOSI主机输出从机输入、MISO主机输入从机输出、CS片选线。有人可能会问,为啥不能像I2C那样挂一堆设备共用总线?SPI的CS线就是来解决这个问题的——每个从设备都要单独一根CS线。所以设备多了,布线会变得很头疼。
SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。这个配置必须两端完全一致,否则通信就会乱码。很多新手调不通SPI,第一反应是怀疑芯片坏了,其实大概率是CPOL和CPHA没对上。
速率方面,SPI能跑到几十MHz没问题,STM32的SPI最高能到84MHz,FPGA那边跑个百来兆也不是事儿。
典型应用场景我用SPI最多的是Flash存储芯片、W25Qxx系列的SPI Flash读写速度快得飞起。还有OLED/LCD显示屏、RFID读卡器、高速AD/DA芯片,基本上需要快速传输数据的场景都会选SPI。
容易踩的坑时钟极性和相位这个前面说过了。另外要注意的是,SPI的走线最好等长,特别是时钟线和其他数据线的长度差尽量控制在较小范围内,否则高速通信时数据采样点会歪掉。还有CS片选最好用普通GPIO推挽输出,别用开漏,上升沿会很难看。
三、I2C:两线搞定多设备I2C最大的优势就是两根线能挂一大堆设备。听起来很美好,但说实话,这玩意儿调起来比SPI烦多了,特别是遇到总线出错的时候,那叫一个头疼。
硬件基础I2C就两根线:SCL时钟线和SDA数据线。这两根线都是开漏输出,必须接上拉电阻。这个上拉电阻的值不能随便选,太大了上升沿太慢影响速率,太小了功耗大还容易烧驱动。我一般用4.7K到10K之间,具体得看总线电容和速率要求。
I2C的地址是个7位或10位的值,每个挂在总线上的设备都有唯一地址。通信的时候,主机先发地址,对方应答后再发数据。这个地址有时候会冲突,特别是你用了好几个同一厂家的传感器模块的时候。
速率有标准模式100KHz、快速模式400KHz、快速模式+1MHz,还有高速模式3.4MHz。不过说实话,我平时用的基本都是400KHz,再快上去稳定性就不好说了。
典型应用场景I2C最适合的场景是:同一PCB板上挂很多低速设备。比如EEPROM存储芯片、RTC实时时钟、各种传感器陀螺仪加速度计、温湿度传感器等等。我之前做个项目挂了七八个I2C传感器,用SPI的话光CS线就绕不开,最后还是老老实实用了I2C。
容易踩的坑地址冲突这个前面提到了。另一个大坑是总线仲裁——两个主机同时发起通信时,I2C会自己仲裁,但如果你没做好设计,总线可能会卡死。还有就是上拉电阻的选择不当导致通信不稳定,这个很多人会忽略。
四、CAN:工业和汽车的选择CAN总线跟前面三种接口不是一个量级的,它是为工业现场和汽车电子这种高可靠性场景设计的。价格也是最贵的,一颗CAN transceiver动不动就几块钱,单独的CAN控制器芯片更贵。
硬件基础CAN也是两根线:CAN_H和CAN_L,是差分信号。这两根线在终端需要接120欧姆的终端电阻,这个必须接,不接的话信号反射会让你通信完全乱套。CAN的速率最远能跑到40米左右,更远的话速率就得降下来,1Mbps的话只能跑40米,125Kbps能跑500米。
CAN的物理层和协议层是分开的,这点跟UART有点像。CAN协议本身有强大的错误检测和纠正机制,能自动重发,自动退出冲突——这让它特别适合电磁干扰严重的环境。
典型应用场景汽车几乎是CAN的天下,发动机控制、车身电子、安全系统等等全部用CAN。还有工厂自动化、机器人控制、医疗设备这些对可靠性要求极高的地方。我在工控项目里用过CAN总线,上百米的传输距离,干扰再大也没出过问题。
容易踩的坑终端电阻是必须要注意的,两个终端都要接,而且阻值必须是120欧姆。CAN_H和CAN_L不能接反,否则通信会很不稳定。另外CAN的布线最好用双绞线,这对抑制共模干扰很重要。
五、选型建议:什么场景用什么说了这么多,实际项目里怎么选?我总结了几个维度供大家参考:
调试和低速场景用UART。模块调试、参数配置、日志输出这些场景,UART最方便,两根线加个USB转TTL小板就能用。
高速同板通信用SPI。Flash、显示屏、AD/DA这些需要快速数据传输的,优先选SPI,速率高且协议简单。
多设备低速通信用I2C。传感器多、板内通信、速率要求不高的场景,I2C能省很多布线麻烦。
工业现场和汽车用CAN。传输距离远、可靠性要求高、电磁干扰严重的环境,CAN是唯一选择,虽然成本高但值。
总结:快速选型决策表最后给大家一个简单的对比表,方便实际选型时快速决策:
| UART | 2根 | 10Mbps | 几米(TTL) 1200米(RS485) | 调试、模块通信 |
| SPI | 4根 | 几十MHz | 同一PCB | 高速同板通信 |
| I2C | 2根 | 3.4MHz | 同一PCB | 多设备板内通信 |
| CAN | 2根 | 1Mbps | 40米(高速) 500米(低速) | 工业、汽车 |
接口选型没有标准答案,关键看你的实际需求。速率要求、设备数量、传输距离、可靠性要求、成本预算,这些都要综合考虑。选对了接口,后面的调试会省心很多。
大家有什么实际项目中的选型经验或者踩过的坑,欢迎在评论区交流。

扫码关注






































