IIC与SPI总线选型指南:从原理到嵌入式实战决策
发布时间:2026/10/18 2:03:19 锦皓数字建站

1. 从一根线说起为什么IIC和SPI总被放在一起比但凡做过嵌入式开发的人几乎都绕不开一个场景主控芯片选好了传感器、存储器、显示屏的型号也定了打开原理图准备画连线的时候突然发现——有的器件标着IIC有的标着SPI还有的两种都支持。这时候脑子里第一个冒出来的问题往往就是到底接哪个能不能都接选错了会怎样IIC和SPI是嵌入式系统里最常用的两种板级串行通信总线几乎每一颗MCU都至少带一路IIC和一路SPI。它们解决的问题本质上是一样的让主控和外围芯片之间用尽量少的引脚、尽量简单的协议完成数据交换。但两者的设计哲学完全不同一个追求“用最少的线挂最多的设备”一个追求“用最直接的方式跑最高的速度”。这个根本差异决定了它们在速率、引脚数、拓扑结构、软件开销、抗干扰能力上的所有区别。这篇文章面向的是正在做硬件选型或驱动开发的嵌入式工程师尤其是那些手头有一堆传感器和外设、需要决定“这个器件挂哪条总线”的人。我会从协议原理讲到实际项目中的选型逻辑把两种总线的脾气秉性拆开揉碎讲清楚再给出可以直接对照使用的选型决策表。不管你是刚入行的新手还是做了几年但一直“凭感觉选”的老手看完之后应该能建立起一套清晰的判断框架。需要提前说明的是IIC和SPI没有绝对的优劣之分只有适不适合当前场景的区别。很多项目里两种总线同时存在、各司其职这才是常态。所以这篇文章不会给你一个“选IIC就对了”或者“SPI永远更好”的结论而是帮你搞清楚在什么条件下该偏向谁。2. 两种总线的底层逻辑先搞懂它们是怎么工作的2.1 IIC总线的工作原理与关键特征IIC的全称是Inter-Integrated Circuit中文常叫“集成电路总线”。它的物理层非常简洁两根线一根是SDA串行数据线一根是SCL串行时钟线。两根线都是开漏输出需要外接上拉电阻到电源正极。所有挂在总线上的设备都并联在这两根线上每个设备有自己唯一的7位或10位地址。通信过程是这样的主设备发起起始条件SCL为高时SDA从高拉低然后发送目标设备的地址加读写位等待从设备应答。从设备拉低SDA表示ACK主设备收到应答后开始传输数据。每传输一个字节8位接收方都要回一个ACK位。传输结束后主设备发停止条件SCL为高时SDA从低拉高。这套机制的核心特点是多主多从、地址寻址。总线上可以挂很多个设备主设备通过地址来选择跟谁说话。理论上7位地址可以挂128个设备实际因为地址冲突和电容负载限制一般挂几个到十几个比较常见。IIC的速率标准分为几档标准模式100kHz快速模式400kHz快速模式1MHz高速模式3.4MHz。实际项目中400kHz用得最多1MHz以上对布线和上拉电阻的要求会明显提高。IIC还有一个容易被忽视但非常重要的特性时钟拉伸。从设备如果处理不过来可以把SCL线拉低强制主设备等待。这个机制在传感器数据还没准备好的时候特别有用但也意味着主设备必须支持时钟拉伸否则会出问题。2.2 SPI总线的工作原理与关键特征SPI的全称是Serial Peripheral Interface串行外设接口。它的物理层比IIC多两根线通常是四根SCLK时钟、MOSI主出从入、MISO主入从出、CS片选。有些变种会省略MISO或MOSI变成三线甚至两线模式但标准形态是四线。SPI的通信机制非常直接主设备拉低某个从设备的CS线表示“我要跟你通信了”然后在SCLK上产生时钟数据在MOSI和MISO上同时双向传输。每个时钟周期传一位通常是8位为一个字节。传输完成后拉高CS结束通信。SPI没有地址的概念靠的是片选线来选设备。一个从设备对应一根CS线主设备有多少个从设备就需要多少根CS线或者用译码器扩展。这是SPI引脚数随设备数量线性增长的根本原因。SPI的速率可以做到很高几十MHz是常规操作上百MHz也不罕见。因为没有协议开销不需要起始条件、地址、ACKSPI的有效数据吞吐率非常高。SPI有四种工作模式由CPOL时钟极性和CPHA时钟相位组合决定主从设备的模式必须匹配否则数据会错位。SPI还有一个特点是全双工。MOSI和MISO同时工作主设备在发送数据的同时也在接收数据。这个特性在某些场景下非常有用比如读取ADC转换结果的同时发送下一个通道的配置。2.3 两种总线的本质差异对比把两种总线的核心特征放在一起对比差异一目了然对比维度IICSPI引脚数单设备2根SDASCL4根SCLKMOSIMISOCS引脚数N个设备2根所有设备并联3N根时钟和数据共用CS独立寻址方式7位地址寻址片选线选择最高速率通常400kHz~1MHz高速3.4MHz通常10~50MHz可达100MHz双工方式半双工全双工协议开销起始地址ACK停止几乎无开销多主支持支持不支持标准SPI时钟拉伸支持不支持上拉电阻需要不需要抗干扰能力较弱开漏上拉较强推挽驱动典型应用传感器、EEPROM、RTCFlash、显示屏、ADC这张表是选型的起点但光看表还不够因为实际项目里的约束条件往往比表格复杂得多。接下来我会把每个维度背后的“为什么”讲清楚。3. 选型的核心逻辑从项目约束反推总线选择3.1 引脚资源最直观但也最容易误判的因素很多人选总线的第一反应是“IIC省引脚”这个判断在设备数量少的时候是对的但在设备数量多的时候需要重新算账。假设你要挂8个SPI从设备需要3根共用线SCLK、MOSI、MISO加上8根CS线总共11根引脚。如果换成IIC只需要2根线。这时候IIC的引脚优势非常明显。但反过来如果只挂1个SPI Flash4根线就够了而IIC虽然只用2根线但速率可能满足不了Flash的读写需求。这时候引脚数的差异就不是决定性因素了。还有一个容易被忽略的点CS线可以用译码器扩展。比如用3-8译码器3根GPIO可以控制8个CS信号这样8个SPI设备只需要336根引脚。虽然增加了译码器芯片但在引脚极度紧张的时候这是一个可行的折中方案。实操心得在引脚预算阶段不要只看“IIC只要2根线”就做决定。先把所有外设列出来分别算出IIC方案和SPI方案的总引脚数再结合速率需求综合判断。我见过不少项目因为一开始没算清楚画到一半发现引脚不够被迫换器件或者加译码器返工成本很高。3.2 速率需求什么时候IIC真的不够用IIC在400kHz下的理论最大吞吐率大约是40KB/s考虑起始、地址、ACK开销后实际更低。这个速率对于大多数传感器温度、湿度、加速度、陀螺仪是够用的因为传感器本身的数据更新率就不高比如温度传感器每秒采样几次到几十次每次读几个字节400kHz绰绰有余。但以下几种场景IIC会明显吃力SPI Flash读写页编程和扇区擦除需要传输大量数据400kHz下写1MB数据要几十秒完全不可接受。TFT显示屏刷新全屏刷新需要传输几百KB的像素数据IIC的速率会导致肉眼可见的卡顿。高速ADC连续采样比如音频采样每秒需要传输几十KB到几百KB的数据IIC带宽不够。摄像头模块虽然摄像头配置寄存器常用IIC但图像数据传输必须走SPI或并口。SPI在10MHz下的吞吐率大约是1.25MB/s是IIC 400kHz的30倍以上。这个差距在需要传大量数据的场景下是决定性的。但也要注意SPI的高速率是有代价的PCB布线要求更高走线太长或太密容易出信号完整性问题从设备的SPI接口也有最高速率限制不是所有SPI器件都能跑50MHz。3.3 设备数量与拓扑结构谁更适合“挂一堆”IIC的地址寻址机制天生适合挂多个设备。只要地址不冲突理论上可以挂很多个。实际项目中挂5~10个IIC设备很常见比如一个环境监测节点上挂温度、湿度、气压、光照、PM2.5传感器全部走IIC只用2根线。但IIC挂多了有两个问题一是总线电容每个设备的引脚都有输入电容加上PCB走线电容总电容超过400pF后信号上升沿会变缓通信可靠性下降。二是地址冲突有些传感器的地址是固定的挂两个同型号的器件就会冲突需要用到IIC多路复用器来隔离。SPI挂多个设备靠CS线没有地址冲突的问题但CS线数量随设备增加而增加。如果主控GPIO不够就需要译码器或者用GPIO扩展芯片。SPI的总线电容问题比IIC小因为它是推挽驱动驱动能力更强。注意事项IIC总线上的上拉电阻值需要根据总线电容和速率来选。400kHz下常用4.7kΩ100kHz下可以用10kΩ。上拉电阻太小会增加功耗太大则上升沿变缓。如果总线上挂了多个设备建议先用示波器看一下实际波形再定阻值。3.4 软件复杂度驱动开发的工作量差异从驱动开发的角度看IIC的软件复杂度通常比SPI高。原因有几个IIC有起始条件、停止条件、地址帧、ACK/NACK、时钟拉伸等机制状态机比较复杂。特别是时钟拉伸如果主设备的硬件IIC控制器不支持就需要用GPIO模拟软件开销很大。IIC的多主仲裁机制也增加了复杂度虽然大多数项目用不到多主。SPI的协议非常简单基本上就是“拉低CS、发时钟、移数据、拉高CS”。用GPIO模拟SPI很容易用硬件SPI控制器更简单。SPI没有ACK机制主设备发了数据不需要等从设备确认软件流程更直接。但SPI也有自己的软件坑四种工作模式CPOL/CPHA组合必须和从设备匹配搞错了数据就是乱的。有些器件的datasheet里写的模式描述比较绕需要仔细对照时序图确认。从调试角度看IIC因为有时钟拉伸和ACK机制出问题时更容易定位比如用逻辑分析仪可以看到哪个环节没有ACK。SPI出问题时往往表现为数据错位或全零需要检查模式设置和CS时序。3.5 抗干扰与可靠性工业场景下的考量在工业环境或长距离板间通信场景下SPI的抗干扰能力通常优于IIC。原因在于SPI是推挽输出驱动能力强信号边沿陡峭不容易受外界干扰。IIC是开漏输出加外部上拉上升沿由RC充电决定边沿较缓在噪声环境下更容易出错。但这不意味着IIC在工业场景就不能用。很多工业传感器用的就是IIC接口关键在于PCB布线要规范SDA和SCL尽量短、尽量平行走线、远离高频信号源、上拉电阻靠近主设备放置。如果通信距离超过几十厘米IIC就需要加缓冲器或改用差分总线。SPI在长距离通信时也有问题时钟线在高频下容易产生振铃和反射需要串联端接电阻。CS线如果走线太长片选信号的边沿可能变形导致从设备误触发。实操心得在电机驱动、开关电源等强干扰场景下如果非要用IIC建议降低速率到100kHz上拉电阻减小到2.2kΩ并且在SDA/SCL上并联小电容几十pF滤高频噪声。SPI则建议在时钟线上串联22~33Ω电阻减少反射。4. 实战选型决策一张表覆盖90%的场景4.1 按器件类型快速判断实际项目中大多数器件的总线选择其实是有惯例的。下面这张表整理了常见器件类型的推荐总线器件类型推荐总线理由温度/湿度/气压传感器IIC数据量小更新率低IIC够用且省引脚加速度计/陀螺仪IIC或SPI低速采样用IIC高速采样用SPIEEPROMIIC小容量存储读写不频繁IIC足够SPI FlashSPI需要高速读写IIC带宽不够TFT/OLED显示屏SPI像素数据量大必须高速ADC/DACSPI需要连续采样和高速传输RTC实时时钟IIC数据量极小IIC是标准配置数字电位器SPI需要快速更新SPI更合适射频模块SPI配置和数据传输都需要较高速度电机驱动SPI或IIC看具体型号SPI更常见这张表是经验总结不是硬性规定。有些器件同时支持IIC和SPI比如某些加速度计和ADC这时候就需要结合系统整体情况来选。4.2 混合使用大多数项目的真实状态实际项目中IIC和SPI往往同时存在。比如一个典型的数据采集终端IIC总线挂温度传感器、EEPROM、RTCSPI总线挂SPI Flash、ADC、显示屏这种混合架构的好处是各取所长低速小数据量的器件走IIC省引脚高速大数据量的器件走SPI保带宽。两条总线互不干扰软件上分别初始化即可。混合使用时需要注意引脚分配。主控的IIC和SPI引脚通常是复用的需要在初始化时正确配置。有些MCU的SPI和IIC共用同一组引脚不能同时使用选型时要查清楚引脚复用表。4.3 选型决策流程图文字版如果你面对一个具体器件不知道选哪个可以按以下顺序判断器件支持哪些总线如果只支持一种那就没得选。如果两种都支持看数据量需要传大量数据10KB/s选SPI否则可以选IIC。看引脚预算引脚紧张且设备多优先IIC引脚充裕或设备少SPI也可以。看速率要求需要1MHz的时钟选SPI否则IIC够用。看系统已有总线如果板上已经有IIC总线且地址不冲突优先挂IIC如果已经有SPI且CS够用优先挂SPI。看干扰环境强干扰场景优先SPI或者IIC降速使用。这个顺序不是绝对的但能覆盖大多数情况。关键是不要孤立地看一个器件要放在整个系统的上下文里判断。5. 实操中的坑与排查技巧5.1 IIC常见问题与解决方法问题一通信完全无响应示波器看SDA和SCL都是高电平。这是最常见的IIC问题。排查步骤先确认上拉电阻是否焊接、阻值是否合适再用示波器看主设备有没有发出起始条件如果起始条件都没有检查GPIO配置是否正确开漏模式如果有起始条件但没有ACK检查从设备地址是否正确7位地址左移一位后的值。问题二通信偶尔成功大部分时候失败。这种间歇性故障通常是时序问题。检查SCL频率是否超过从设备支持的最高速率检查上拉电阻是否太大导致上升沿太慢检查总线电容是否过大挂太多设备或走线太长。用示波器看SCL和SDA的上升沿时间如果超过1μs说明上拉电阻偏大。问题三读数据时第一个字节正确后续字节错误。这通常是ACK处理的问题。IIC读数据时主设备在接收完一个字节后需要发送ACK继续读或NACK停止读。如果ACK/NACK发错了从设备会停止发送或继续发送导致数据错位。检查驱动代码中ACK/NACK的发送时机。问题四多设备总线上某个设备不响应。先确认该设备的地址是否与其他设备冲突。如果地址冲突需要用IIC多路复用器如TCA9548A来隔离。如果没有冲突检查该设备的电源和地是否正常有些传感器需要先配置寄存器才能响应。5.2 SPI常见问题与解决方法问题一数据完全错乱读出来全是0xFF或0x00。首先检查CPOL和CPHA设置是否与从设备匹配。这是SPI最容易出错的地方。查从设备datasheet的时序图确认时钟空闲电平和数据采样边沿。如果模式对了还是错检查CS线是否在传输期间保持低电平有些器件的CS在字节之间不能拉高。问题二高速通信时数据偶尔出错。高速SPI对信号完整性要求高。检查SCLK走线是否太长、是否有过孔、是否靠近干扰源。在SCLK上串联22~33Ω电阻可以减少反射。如果从设备支持适当降低SPI时钟频率试试如果降速后正常说明是信号完整性问题。问题三多个SPI设备互相干扰。检查CS线的时序在切换CS时确保SCLK处于空闲电平避免产生毛刺时钟导致从设备误动作。如果CS线走线太长考虑加缓冲器。另外MISO线在多个从设备之间共享时未选中的从设备必须将MISO置为高阻态否则会冲突。问题四DMA传输时数据不完整。SPI配合DMA传输时要注意DMA的传输长度和SPI的数据帧长度匹配。有些MCU的SPI FIFO深度有限DMA请求触发阈值设置不当会导致数据丢失。检查DMA配置中的传输宽度8位/16位是否与SPI数据帧大小一致。5.3 逻辑分析仪的使用技巧不管是IIC还是SPI逻辑分析仪都是最有效的调试工具。几个实用技巧IIC解码时设置触发条件为“起始条件”或“特定地址”可以快速定位问题帧。SPI解码时正确设置CPOL/CPHA和位顺序MSB/LSB否则解码结果全是错的。用逻辑分析仪的协议解码功能可以直接看到地址、数据、ACK等字段比看波形快得多。如果逻辑分析仪采样率不够高速SPI的信号会失真建议采样率至少是SPI时钟的5倍以上。实操心得我习惯在PCB上给IIC和SPI的关键信号留测试点调试时直接夹逻辑分析仪探头不用飞线。测试点尽量靠近主控引脚这样看到的波形最真实。另外逻辑分析仪的探头地线要尽量短否则高频信号会引入振铃。6. 进阶话题什么时候需要“不按常理出牌”6.1 用GPIO模拟IIC或SPI的场景有些项目因为主控的硬件IIC/SPI外设不够用或者引脚复用冲突需要用GPIO模拟总线。GPIO模拟IIC比较常见因为IIC速率低软件模拟完全跟得上。GPIO模拟SPI在低速下也可行但高速1MHz就比较吃力因为软件翻转GPIO的速度有限。GPIO模拟IIC的关键是开漏输出。如果MCU的GPIO不支持开漏模式可以用“输出低输入高阻”的方式模拟要输出低电平时配置为推挽输出低要输出高电平时切换为输入模式靠外部上拉拉高。这种方式切换方向需要时间会影响最高速率。GPIO模拟SPI的关键是时钟和数据的时间关系。在SCLK的边沿之前把数据准备好在另一个边沿采样。用软件延时控制时序延时长短取决于MCU主频和从设备的时序要求。6.2 总线扩展与隔离方案当IIC设备太多或地址冲突时可以用IIC多路复用器。这类芯片把一路IIC分成多路每路可以挂地址相同的设备。主设备通过写多路复用器的寄存器来选择当前通信的通道。SPI设备太多导致CS线不够时可以用译码器扩展。比如3-8译码器用3根GPIO控制8根CS线。也可以用SPI GPIO扩展芯片通过SPI总线控制多根CS线。在需要电气隔离的场景比如高压侧和低压侧通信可以用数字隔离器隔离IIC或SPI信号。IIC隔离需要注意双向信号的隔离SPI隔离相对简单因为MOSI和MISO是单向的。6.3 高速SPI的PCB设计要点当SPI时钟超过20MHz时PCB设计就变得关键了。几个要点SCLK走线尽量短避免过孔如果必须过孔尽量少。SCLK和MOSI/MISO不要长距离平行走线减少串扰。在SCLK源端串联端接电阻22~33Ω减少反射。MISO线如果较长考虑加缓冲器。地平面要完整信号线尽量靠近地平面走。如果走线长度超过信号波长的1/10就需要按传输线处理。这些规则在低速SPI下可以忽略但在高速下不注意就会导致通信不稳定。7. 我的选型经验总结做了这么多年嵌入式项目我在IIC和SPI选型上踩过的坑不少总结几条个人经验。第一条不要因为“IIC省引脚”就无脑选IIC。省引脚是有代价的速率低、软件复杂、抗干扰弱。如果项目对速率有要求或者环境干扰大SPI多出来的两根线是值得的。第二条SPI的CS线要提前规划。很多项目画到一半才发现CS线不够用这时候改方案很痛苦。建议在原理图设计阶段就把所有SPI设备的CS线列出来算清楚GPIO够不够。第三条IIC的上拉电阻不要照抄参考设计。不同项目的总线电容不同上拉电阻需要根据实际情况调整。4.7kΩ是常见值但不是万能值。如果通信不稳定先用示波器看波形再调电阻。第四条SPI模式一定要对照时序图确认。datasheet里写的“Mode 0”或“Mode 3”有时候和实际时序有出入以时序图为准。我遇到过好几次datasheet写Mode 0但实际需要Mode 3的情况。第五条逻辑分析仪是必备工具。不管是IIC还是SPI出问题时第一件事就是抓波形。没有逻辑分析仪调试效率会低很多。现在几百块的逻辑分析仪就能解码IIC和SPI性价比很高。最后再分享一个小技巧在驱动代码里加一个总线扫描功能。IIC可以扫描所有地址看哪些设备有应答SPI可以逐个拉低CS看哪个设备有反应。这个功能在调试初期非常有用能快速确认硬件连接是否正确。这个内容后续还可以这样扩展如果你在做多主IIC系统可以研究一下IIC的仲裁机制如果你在用SPI做高速数据采集可以研究一下DMA和双缓冲的配合如果你在做低功耗设计可以对比一下两种总线在休眠模式下的功耗表现。每个方向都值得单独写一篇。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。