026 四大接口对比速度、距离、功耗、引脚数、应用场景全面分析上周五晚上十一点产线那边突然炸了锅——一批智能家居网关在老化测试中频繁掉线。我赶到现场时测试主管拿着示波器截图给我看I2C总线上SCL波形像被狗啃过SDA上还挂着毛刺。拆开三台样机发现其中两台用的EEPROM地址线拉得太长另一台干脆是GPIO模拟I2C的时序没调好。这种问题见多了。说到底就是接口选型时没把“速度、距离、功耗、引脚数”这四个维度算清楚。今天把这四个接口掰开揉碎了讲全是实战里淌过的浑水。速度别被数据手册上的理论值骗了GPIO的速度最容易被低估。很多人觉得GPIO就是开关灯用的实际上在STM32F4上GPIO翻转频率能做到50MHz以上。但注意这是裸翻转——不带负载。一旦你接上长线、加上上拉电阻、再挂个电容速度直接腰斩。我见过有人用GPIO模拟SPI去驱动LCD结果刷新率只有15fps因为GPIO的上升沿被线缆电容拖成了斜坡。UART的波特率上限受限于线缆长度和电气特性。RS232在15米内能跑115200bps超过这个距离就得降速。RS485能到10Mbps但那是差分信号在双绞线上的理论值实际工程中超过100米建议降到1Mbps以下。别信那些“我们实验室跑通了”的话产线环境里电磁干扰一上来UART的误码率会让你怀疑人生。I2C的标准模式100kHz快速模式400kHz高速模式3.4MHz。但注意I2C是开漏输出靠上拉电阻拉高。速度越高上拉电阻就得越小功耗就越大。400kHz时上拉电阻通常取4.7kΩ3.4MHz时得降到1kΩ以下。而且I2C总线电容有限制——400pF是红线超过这个值波形就畸变。我踩过的坑用I2C连接6个传感器总线长度30cm400kHz下SCL波形已经圆得像正弦波了。SPI是速度之王。没有开漏限制推挽输出直接干。常见MCU的SPI能到几十MHz高端芯片能上100MHz。但SPI对布线要求高高速下信号反射、串扰都是问题。我做过一个项目SPI时钟50MHz线长10cm结果数据偶尔错位。最后发现是地线没铺好信号回流路径太长。速度排序SPI GPIO裸翻转 UARTRS485 I2C距离差分信号才是王道GPIO的距离最惨。CMOS电平的GPIO超过10cm就得考虑信号完整性。3.3V的GPIO驱动1米长的线末端电压可能只剩2V逻辑电平都保不住。别想着加驱动芯片那是治标不治本。UART的距离取决于物理层。RS232的±12V电平能到15米RS485的差分信号能到1200米。但注意RS485需要终端匹配电阻而且总线上的节点数有限制——32个是标准值用高阻抗收发器能到256个。我见过有人把32个节点挂满结果最后一个节点的信号眼图已经闭上了。I2C的距离是硬伤。标准模式下最长也就几米而且总线电容限制死了。想延长距离用I2C中继器或者缓冲器但每个中继器会引入延迟多个串联后时序会乱。我有个客户非要用I2C控制10米外的传感器最后换了RS485转I2C的桥接芯片才搞定。SPI的距离也短。主从模式片选信号是点对点时钟和数据线超过30cm就得加驱动。而且SPI没有标准的长距离物理层想拉远只能用差分SPI或者转成LVDS。距离排序UARTRS485 UARTRS232 I2C ≈ SPI ≈ GPIO功耗细节里藏着魔鬼GPIO的功耗最灵活。输出高电平时功耗取决于负载电流输出低电平时功耗几乎为零。但注意GPIO翻转时的动态功耗跟频率成正比。50MHz翻转的GPIO功耗可能比整个MCU还高。我做过一个低功耗项目GPIO翻转频率从1MHz降到100kHz系统功耗降了30%。UART的功耗相对固定。收发器本身有静态电流RS232的电荷泵还要额外耗电。RS485的静态功耗低但总线上的偏置电阻会一直耗电。一个120Ω的终端电阻在5V下就是208mW十个节点就是2W——别小看这点功耗电池供电的设备里这就是命。I2C的功耗跟总线状态强相关。空闲时总线被上拉电阻拉高功耗就是VCC²/R。400kHz下4.7kΩ上拉3.3V时功耗约2.3mW。但总线上的从设备越多总电容越大动态功耗越高。而且I2C的从设备地址识别需要时钟每个ACK/NACK都会产生功耗。SPI的功耗在高速下很可观。推挽输出没有静态功耗但动态功耗跟频率和负载电容成正比。50MHz SPI驱动10pF负载功耗约10mW。但SPI的从设备通常不需要时钟时进入低功耗模式这点比I2C强。功耗排序同速率下I2C UART SPI GPIO引脚数少即是多但多也有多的好处GPIO最灵活但引脚数取决于MCU封装。一个GPIO只能做一件事想复用就得用软件模拟。我见过有人用4个GPIO模拟I2C结果时序调了三天。UART最少2根线TX、RX加上流控就是4根RTS、CTS。RS485只需要2根差分线但半双工需要方向控制引脚。UART的引脚数少但每个UART只能点对点通信RS485可以多节点。I2C只需要2根线SCL、SDA而且支持多主多从。但每个从设备需要唯一的地址7位地址最多128个设备10位地址能到1024个。注意地址冲突是I2C最常见的坑——两个设备用同一个地址总线直接瘫痪。SPI最少4根线SCLK、MOSI、MISO、CS但每个从设备需要独立的CS线。N个从设备就需要N3根线。所以SPI的引脚数跟设备数量成正比设备多了引脚就不够用。引脚数排序从少到多I2C2线 UART2线 SPI4线N*CS GPION个应用场景选对了省心选错了加班GPIO适合做控制信号、中断输入、LED驱动、按键检测。别用GPIO做高速数据传输除非你时间多到没处花。我见过有人用GPIO模拟USB结果速度只有12Mbps的十分之一还经常丢包。UART适合做调试日志输出、GPS模块通信、蓝牙模块连接、长距离工业总线。注意UART没有时钟线收发双方必须波特率一致而且没有流控时容易丢数据。我习惯在UART通信中加CRC校验哪怕只是调试用。I2C适合做板内低速传感器读取、EEPROM存储、RTC时钟、ADC配置。别用I2C做实时性要求高的通信因为总线仲裁和时钟拉伸会导致延迟不确定。而且I2C的从设备地址是硬编码的产品升级时如果地址冲突只能换芯片。SPI适合做高速ADC采样、LCD显示驱动、SD卡读写、FPGA配置、音频编解码。SPI是全双工速度高但布线要求也高。我做过一个SPI驱动LCD的项目时钟20MHz结果屏幕闪烁。最后发现是MISO线上的干扰导致数据错误加了RC滤波才解决。个人经验选型时先问自己三个问题第一通信距离是板内还是板间板内用I2C或SPI板间用UARTRS485。别想着用I2C拉10米线那是给自己挖坑。第二功耗有没有限制电池供电的设备优先考虑GPIO和SPI的低功耗模式。I2C的上拉电阻功耗在低功耗场景下不可忽视。第三引脚够不够用MCU引脚紧张时I2C是首选。但如果你有多个从设备SPI的CS线会吃掉大量引脚这时候可以考虑I2C或者用GPIO模拟CS的SPI。最后说一句别迷信理论值。数据手册上的速度、距离、功耗都是在理想条件下测的。你的PCB布线、线缆质量、电源纹波、电磁环境都会让这些参数打折。做项目时留出50%的余量——比如I2C总线电容控制在200pF以内SPI时钟频率不超过数据手册的70%UART波特率不超过理论值的80%。这样产线就不会在周五晚上十一点给你打电话了。
026、四大接口对比:速度、距离、功耗、引脚数、应用场景全面分析
发布时间:2026/6/22 5:29:16
026 四大接口对比速度、距离、功耗、引脚数、应用场景全面分析上周五晚上十一点产线那边突然炸了锅——一批智能家居网关在老化测试中频繁掉线。我赶到现场时测试主管拿着示波器截图给我看I2C总线上SCL波形像被狗啃过SDA上还挂着毛刺。拆开三台样机发现其中两台用的EEPROM地址线拉得太长另一台干脆是GPIO模拟I2C的时序没调好。这种问题见多了。说到底就是接口选型时没把“速度、距离、功耗、引脚数”这四个维度算清楚。今天把这四个接口掰开揉碎了讲全是实战里淌过的浑水。速度别被数据手册上的理论值骗了GPIO的速度最容易被低估。很多人觉得GPIO就是开关灯用的实际上在STM32F4上GPIO翻转频率能做到50MHz以上。但注意这是裸翻转——不带负载。一旦你接上长线、加上上拉电阻、再挂个电容速度直接腰斩。我见过有人用GPIO模拟SPI去驱动LCD结果刷新率只有15fps因为GPIO的上升沿被线缆电容拖成了斜坡。UART的波特率上限受限于线缆长度和电气特性。RS232在15米内能跑115200bps超过这个距离就得降速。RS485能到10Mbps但那是差分信号在双绞线上的理论值实际工程中超过100米建议降到1Mbps以下。别信那些“我们实验室跑通了”的话产线环境里电磁干扰一上来UART的误码率会让你怀疑人生。I2C的标准模式100kHz快速模式400kHz高速模式3.4MHz。但注意I2C是开漏输出靠上拉电阻拉高。速度越高上拉电阻就得越小功耗就越大。400kHz时上拉电阻通常取4.7kΩ3.4MHz时得降到1kΩ以下。而且I2C总线电容有限制——400pF是红线超过这个值波形就畸变。我踩过的坑用I2C连接6个传感器总线长度30cm400kHz下SCL波形已经圆得像正弦波了。SPI是速度之王。没有开漏限制推挽输出直接干。常见MCU的SPI能到几十MHz高端芯片能上100MHz。但SPI对布线要求高高速下信号反射、串扰都是问题。我做过一个项目SPI时钟50MHz线长10cm结果数据偶尔错位。最后发现是地线没铺好信号回流路径太长。速度排序SPI GPIO裸翻转 UARTRS485 I2C距离差分信号才是王道GPIO的距离最惨。CMOS电平的GPIO超过10cm就得考虑信号完整性。3.3V的GPIO驱动1米长的线末端电压可能只剩2V逻辑电平都保不住。别想着加驱动芯片那是治标不治本。UART的距离取决于物理层。RS232的±12V电平能到15米RS485的差分信号能到1200米。但注意RS485需要终端匹配电阻而且总线上的节点数有限制——32个是标准值用高阻抗收发器能到256个。我见过有人把32个节点挂满结果最后一个节点的信号眼图已经闭上了。I2C的距离是硬伤。标准模式下最长也就几米而且总线电容限制死了。想延长距离用I2C中继器或者缓冲器但每个中继器会引入延迟多个串联后时序会乱。我有个客户非要用I2C控制10米外的传感器最后换了RS485转I2C的桥接芯片才搞定。SPI的距离也短。主从模式片选信号是点对点时钟和数据线超过30cm就得加驱动。而且SPI没有标准的长距离物理层想拉远只能用差分SPI或者转成LVDS。距离排序UARTRS485 UARTRS232 I2C ≈ SPI ≈ GPIO功耗细节里藏着魔鬼GPIO的功耗最灵活。输出高电平时功耗取决于负载电流输出低电平时功耗几乎为零。但注意GPIO翻转时的动态功耗跟频率成正比。50MHz翻转的GPIO功耗可能比整个MCU还高。我做过一个低功耗项目GPIO翻转频率从1MHz降到100kHz系统功耗降了30%。UART的功耗相对固定。收发器本身有静态电流RS232的电荷泵还要额外耗电。RS485的静态功耗低但总线上的偏置电阻会一直耗电。一个120Ω的终端电阻在5V下就是208mW十个节点就是2W——别小看这点功耗电池供电的设备里这就是命。I2C的功耗跟总线状态强相关。空闲时总线被上拉电阻拉高功耗就是VCC²/R。400kHz下4.7kΩ上拉3.3V时功耗约2.3mW。但总线上的从设备越多总电容越大动态功耗越高。而且I2C的从设备地址识别需要时钟每个ACK/NACK都会产生功耗。SPI的功耗在高速下很可观。推挽输出没有静态功耗但动态功耗跟频率和负载电容成正比。50MHz SPI驱动10pF负载功耗约10mW。但SPI的从设备通常不需要时钟时进入低功耗模式这点比I2C强。功耗排序同速率下I2C UART SPI GPIO引脚数少即是多但多也有多的好处GPIO最灵活但引脚数取决于MCU封装。一个GPIO只能做一件事想复用就得用软件模拟。我见过有人用4个GPIO模拟I2C结果时序调了三天。UART最少2根线TX、RX加上流控就是4根RTS、CTS。RS485只需要2根差分线但半双工需要方向控制引脚。UART的引脚数少但每个UART只能点对点通信RS485可以多节点。I2C只需要2根线SCL、SDA而且支持多主多从。但每个从设备需要唯一的地址7位地址最多128个设备10位地址能到1024个。注意地址冲突是I2C最常见的坑——两个设备用同一个地址总线直接瘫痪。SPI最少4根线SCLK、MOSI、MISO、CS但每个从设备需要独立的CS线。N个从设备就需要N3根线。所以SPI的引脚数跟设备数量成正比设备多了引脚就不够用。引脚数排序从少到多I2C2线 UART2线 SPI4线N*CS GPION个应用场景选对了省心选错了加班GPIO适合做控制信号、中断输入、LED驱动、按键检测。别用GPIO做高速数据传输除非你时间多到没处花。我见过有人用GPIO模拟USB结果速度只有12Mbps的十分之一还经常丢包。UART适合做调试日志输出、GPS模块通信、蓝牙模块连接、长距离工业总线。注意UART没有时钟线收发双方必须波特率一致而且没有流控时容易丢数据。我习惯在UART通信中加CRC校验哪怕只是调试用。I2C适合做板内低速传感器读取、EEPROM存储、RTC时钟、ADC配置。别用I2C做实时性要求高的通信因为总线仲裁和时钟拉伸会导致延迟不确定。而且I2C的从设备地址是硬编码的产品升级时如果地址冲突只能换芯片。SPI适合做高速ADC采样、LCD显示驱动、SD卡读写、FPGA配置、音频编解码。SPI是全双工速度高但布线要求也高。我做过一个SPI驱动LCD的项目时钟20MHz结果屏幕闪烁。最后发现是MISO线上的干扰导致数据错误加了RC滤波才解决。个人经验选型时先问自己三个问题第一通信距离是板内还是板间板内用I2C或SPI板间用UARTRS485。别想着用I2C拉10米线那是给自己挖坑。第二功耗有没有限制电池供电的设备优先考虑GPIO和SPI的低功耗模式。I2C的上拉电阻功耗在低功耗场景下不可忽视。第三引脚够不够用MCU引脚紧张时I2C是首选。但如果你有多个从设备SPI的CS线会吃掉大量引脚这时候可以考虑I2C或者用GPIO模拟CS的SPI。最后说一句别迷信理论值。数据手册上的速度、距离、功耗都是在理想条件下测的。你的PCB布线、线缆质量、电源纹波、电磁环境都会让这些参数打折。做项目时留出50%的余量——比如I2C总线电容控制在200pF以内SPI时钟频率不超过数据手册的70%UART波特率不超过理论值的80%。这样产线就不会在周五晚上十一点给你打电话了。