1. 引言为什么嵌入式工程师必须吃透这几种总线搞嵌入式开发无论是玩单片机、FPGA还是做系统集成总绕不开和各种总线打交道。我干了十几年硬件和底层驱动从最早的51单片机到现在的多核异构处理器一个深刻的体会是项目里大部分的“坑”往往不是算法有多难而是总线没调通。SPI、I2C、CAN、I2S、SSP这些名词教科书和芯片手册里都有但真到了画板子、写驱动、调时序的时候才发现纸上得来终觉浅。这篇文章我想抛开那些枯燥的理论条文结合我这些年踩过的坑、调通的板子跟你聊聊这几种最常见总线的“实战真经”。我们不光要知道它们是什么更要明白在什么场景下该选谁硬件上怎么连软件上怎么写出了问题怎么查。比如为什么车载系统里CAN总线一统江湖为什么音频芯片几乎都用I2SSPI的四种模式到底该怎么选I2C总线上挂多个设备怎么就突然不灵了这些经验都是焊台和示波器前熬出来的。无论你是刚入行的嵌入式新手还是在选型上犯难的老手希望这篇融合了原理、选型、实操和排错的长文能成为你手边一份可靠的参考。全文超过五千字我会尽量把每个细节掰开揉碎咱们就从最常用也最“简单”的SPI开始。2. SPI总线灵活高效的“短跑健将”SPISerial Peripheral Interface是我个人最喜欢也最常用的同步串行总线之一Motorola推出的这个标准以其简单、高效、全双工的特性几乎成了MCU与外围芯片通信的“标配”。但简单不代表没讲究用好了事半功倍用不好调试到怀疑人生。2.1 核心架构与工作模式解析SPI通常采用一主多从的架构一个主设备通常是你的MCU或FPGA通过片选线CS/SS来控制多个从设备如Flash、传感器、屏幕驱动等。它的四根线是精髓SCLKSerial Clock时钟线由主设备产生是所有数据收发的节拍器。MOSIMaster Out Slave In主设备输出、从设备输入数据线。MISOMaster In Slave Out主设备输入、从设备输出数据线。CSChip Select片选线低电平有效。主设备通过拉低对应从设备的CS线来激活它。SPI是全双工的这意味着数据在MOSI和MISO线上可以同时进行收发。主设备在发出一个字节的同时也会接收一个字节。其核心是一个环形移位寄存器主设备通过MOSI将数据位移出同时从设备的数据通过MISO移入主设备。时钟边沿触发数据的移出和采样。这里最关键的也是新手最容易混淆的是时钟极性CPOL和时钟相位CPHA它们共同定义了四种工作模式Mode 0-3CPOL定义SCLK在空闲时的状态。CPOL0空闲时为低电平CPOL1空闲时为高电平。CPHA定义数据在哪个时钟边沿被采样。CPHA0在第一个时钟边沿即SCLK从空闲状态第一次跳变时采样CPHA1在第二个时钟边沿采样。为了让你彻底明白我画个思维图Mode 0 (CPOL0 CPHA0)空闲低电平在上升沿采样数据。这是最常用的模式很多NOR Flash、SD卡都采用此模式。Mode 1 (CPOL0 CPHA1)空闲低电平在下降沿采样数据。Mode 2 (CPOL1 CPHA0)空闲高电平在下降沿采样数据。Mode 3 (CPOL1 CPHA1)空闲高电平在上升沿采样数据。一些特定的ADC或传感器会用此模式。重要提示主从设备的模式必须完全一致否则数据会错位。务必仔细查阅从设备的数据手册确认其支持的模式。通常手册里会明确写“SPI Mode 0”或给出CPOL/CPHA的时序图。2.2 硬件设计与软件驱动实战要点理解了模式我们来看看怎么把它用起来。硬件上SPI的连接看似直连即可但有几个坑等着你。硬件设计避坑指南上拉电阻SPI总线通常不需要外部上拉电阻因为其接口一般是推挽输出。但如果你将MCU的SPI引脚复用为GPIO并开漏模式使用或者总线长度较长10cm可以考虑在SCLK和MOSI上添加弱上拉如10kΩ以增强抗干扰能力尤其是在高速情况下。片选线的管理每个从设备都需要独立的CS线。切忌为了省IO口而尝试用软件模拟片选时序比如通过数据包内的地址来选设备这在大批量数据连续传输时极易出错。CS线在数据传输间隙必须拉高以结束本次传输。走线等长与屏蔽当SPI时钟频率超过10MHz或者走线较长、环境干扰大时需要将SCLK、MOSI、MISO作为一组差分线虽然不是标准差分来对待尽量保持走线等长、并行、远离噪声源如电源、电机驱动。对于超高速SPI如Quad-SPI用于Flash必须严格按照高速信号进行阻抗控制和布线。电平匹配确保主从设备接口电平一致如均为3.3V。若不一致需使用电平转换芯片如TXS0108E不可直接连接。软件驱动编写心得现在MCU的SPI外设都很强大通常只需配置几个寄存器时钟分频设置波特率、数据位宽8位或16位、CPOL/CPHA模式、MSB/LSB先行。重点在于时序的控制。// 以STM32 HAL库为例一个典型的SPI发送接收函数调用 uint8_t tx_data 0xA5; uint8_t rx_data; HAL_SPI_TransmitReceive(hspi1 tx_data rx_data 1 HAL_MAX_DELAY);这段代码会同时完成发送0xA5和接收一个字节。但这里有一个关键细节SPI是全双工即使你只想发送比如配置寄存器你也会收到一个“垃圾数据”反之如果只想读取你也必须发送一个虚拟数据如0xFF来产生时钟。很多驱动库的Read函数内部其实就是先写后读。对于需要连续读写大量数据的场景如读写SPI Flash务必使用DMA。直接CPU轮询会严重占用资源。配置DMA时注意设置数据宽度和存储器地址自增。2.3 四种模式的选择与典型应用场景为什么会有四种模式主要是为了兼容不同半导体制造工艺下芯片内部数据锁存器的设计差异。选择模式的唯一准则就是从设备手册说用哪种就用哪种。Mode 0应用最广。适用于绝大多数SPI Flash如W25Q系列、SD卡SPI模式、数字传感器如BMP280气压计、TFT屏幕控制器。Mode 3也比较常见。一些ADI的ADC如AD7793、某些型号的RFID读卡芯片会使用。Mode 1和Mode 2相对少见但在一些老款或特定功能的芯片中会遇到。一个高级技巧如何快速验证SPI通信如果你手头有逻辑分析仪哪怕是最便宜的几十块钱的连接上SCLK MOSI MISO CS四根线。设置好触发如CS下降沿然后让主设备发送一个已知数据如0xAA。在逻辑分析仪软件中添加SPI协议解码器并正确设置模式CPOL CPHA和数据位顺序MSB/LSB。如果解码出的数据与你发送的一致且时序波形干净无毛刺、上升/下降沿陡峭那么硬件连接和基本配置就成功了。这是排查SPI问题最直观高效的方法。3. I2C总线优雅但“娇气”的两线制网络如果说SPI是点对点的高速公路那么I2CInter-Integrated Circuit就是一条优雅但需要严格交通规则的多车道城市道路。它只用两根线SDA数据线和SCL时钟线就能连接上百个设备成本极低但正因如此其调试复杂度也成倍增加。3.1 总线协议深度剖析与“线与”逻辑I2C是真正的多主多从、半双工总线。所有设备都并联在SDA和SCL上依靠开漏输出和上拉电阻实现“线与”逻辑。这是理解I2C一切特性的基础任何设备都可以将线拉低输出0但释放后需要靠上拉电阻将线拉回高电平1。如果任何一个设备输出低电平整条线就是低电平。这种结构带来了几个核心机制起始S与停止P条件SCL高电平期间SDA的下降沿是起始信号上升沿是停止信号。只有主设备能产生这两种信号它们标志了一次传输的开始与结束。地址帧与读写位起始信号后主设备发送的第一个字节是7位或10位从机地址 1位读写方向位0写1读。总线上每个从设备都必须有一个唯一地址并在检测到自己的地址后回应一个应答ACK。应答ACK与非应答NACK机制每个字节8位数据传输后接收方必须在第9个时钟脉冲期间拉低SDA作为应答。如果接收方没有拉低保持高电平就是非应答NACK通常意味着传输结束或出错。时钟拉伸从设备如果处理速度跟不上主设备的时钟可以在接收到一个字节后主动拉低SCL线强制主设备进入等待状态直到从设备释放SCL。这是一个非常实用的流控机制。3.2 从硬件设计到软件调试的全流程指南硬件设计成败在于细节上拉电阻Rp计算这是I2C硬件设计中最关键的一环。电阻值太小电流大功耗高可能超出IO口驱动能力电阻值太大上升沿太慢可能导致建立时间不足在高速模式下通信失败。有一个简化计算公式Rp(min) (Vcc - 0.4) / 3mA0.4V是低电平门限3mA是最大灌电流典型值Rp(max) T_rise / (0.8473 * C_bus)其中T_rise是标准允许的上升时间标准模式1000ns快速模式300nsC_bus是总线总电容包括走线电容和所有器件引脚电容通常估算为每器件5-10pF每厘米走线1-2pF。实践中对于3.3V系统标准模式100kHz常用4.7kΩ快速模式400kHz常用2.2kΩ超快速模式1MHz可能需要1kΩ甚至更小。务必用示波器测量SCL/SDA的上升沿确保其陡峭。总线电容与长度限制I2C标准规定总线电容不得超过400pF。这限制了总线长度和挂接设备的数量。长距离传输需要用到总线缓冲器如PCA9515来分割网段降低电容。地址冲突与电平兼容确保所有从设备地址不冲突。许多传感器地址可通过引脚配置。对于混合电平系统如5V和3.3V器件共存必须使用双向电平转换器如TXS0102不可直接连接。软件驱动与调试心法现代MCU的I2C外设如STM32的I2C功能复杂中断和DMA模式能有效降低CPU负载。但调试时我建议先从最简单的轮询模式开始。// 伪代码向地址为0x50的EEPROM写入一个字节 HAL_I2C_Mem_Write(hi2c1 0x501 0x00A0 I2C_MEMADD_SIZE_16BIT data 1 100);这段代码向设备0x50左移1位是因为最低位是R/W位的存储器地址0x00A0写入一个字节数据。HAL库封装得很好但底层可能出错。当通信失败时按以下顺序排查物理层检查用万用表测SCL、SDA电压。空闲时应为稳定的高电平接近Vcc。如果电压在中间值如1.6V很可能是上拉电阻过大或总线电容过大导致上升缓慢或者有设备故障拉不低电平。示波器/逻辑分析仪抓取波形这是最强大的手段。抓取一次完整的读写序列检查起始、停止信号是否标准时钟频率是否符合预期地址字节是否正确从机是否在第9个时钟周期给出了ACKSDA被拉低数据字节是否准确上升/下降沿是否干净软件排查初始化确认I2C外设时钟使能GPIO模式是否正确设置为开漏复用Open-Drain AF。超时处理适当增加超时时间特别是在从设备有“时钟拉伸”行为时。中断与DMA如果使用中断或DMA确保中断优先级配置正确DMA缓冲区管理无误。多主竞争如果系统中有多个主设备不常见但存在需要实现总线仲裁和冲突检测逻辑。3.3 常见疑难杂症与解决方案实录问题I2C总线锁死死锁SCL被持续拉低。原因这是最经典的I2C问题。通常发生在从设备特别是那些软件模拟I2C或设计不良的从设备在传输过程中发生异常如复位、程序跑飞导致其内部状态机卡住一直占用总线拉低SCL。解决方案预防选择质量可靠的从设备芯片主设备程序增加超时和错误恢复机制。抢救主设备尝试发送多个时钟脉冲通常9个以上同时监控SDA。有些从设备在收到足够多的时钟后能完成当前操作并释放总线。如果无效唯一的办法是硬件复位整个I2C总线上的所有从设备或者主设备临时将SCL和SDA配置为强推挽输出强制输出几十个时钟脉冲序列来“唤醒”从设备。这是一个“暴力”但往往有效的恢复手段。问题通信不稳定偶尔丢数据或出错尤其在长距离或设备多时。原因信号完整性差。上升时间过长导致建立/保持时间不足总线电容过大环境电磁干扰。解决方案减小上拉电阻值加速上升沿。缩短总线长度或使用带缓冲、中继功能的I2C芯片。采用双绞线并远离噪声源。降低通信速率从400kHz降到100kHz。问题从设备无应答NACK但地址确认正确。原因从设备忙例如EEPROM正在写入内部存储器、从设备供电不稳、或从设备内部寄存器地址错误。解决方案对于EEPROM等有写周期的设备发送写命令后需等待t_WR典型5ms再读检查电源纹波确认访问的寄存器地址是否在从设备有效范围内。4. CAN总线工业与汽车领域的“可靠信使”当你需要在一个嘈杂、远距离、多节点的工业环境中进行可靠通信时SPI和I2C就显得力不从心了。这时CANController Area Network总线就该登场了。它生来就是为了应对严苛的现场环境其设计哲学充满了工程智慧。4.1 核心优势与多主仲裁机制揭秘CAN总线的强大根植于其几个核心设计多主结构与无损仲裁所有节点平等都可主动发送。当多个节点同时发送时通过标识符ID进行“线与”仲裁ID数值越小二进制位优先级越高优先级越高。发送过程中每个节点同时监听总线。如果它发送了一个“隐性位”逻辑1对应总线高电平但监听到的是“显性位”逻辑0总线低电平它就意识到有更高优先级的报文在发送于是立即退出发送转为接收。这个过程没有任何数据损坏或延迟高优先级报文继续无中断传输。这是CAN相比主从轮询如RS-485实时性高的根本原因。非破坏性位仲裁如上所述仲裁失败节点自动退出总线无冲突。强大的错误检测与处理CAN协议包含了循环冗余校验CRC、帧检查、应答错误、位填充错误等多种检错机制。任何一个节点检测到错误会立即发送一个“错误帧”来破坏当前报文通知所有节点丢弃该帧之后发送节点会自动重发。节点内部有“发送错误计数器”和“接收错误计数器”根据错误严重程度节点可以自动进入“错误被动”甚至“总线关闭”状态避免故障节点拖垮整个网络。差分信号传输CAN_H和CAN_L是一对差分线对外部共模干扰有极强的抑制能力是实现长距离可达10km高速可达1Mbps传输的物理基础。4.2 从物理层到数据链路层的完整实现实现一个CAN节点需要三层CAN控制器、CAN收发器和微处理器MCU。物理层设计CAN收发器芯片选型最经典的是NXP原Philips的PCA82C250/TJA1050。现在更推荐其升级版TJA1042/1051等具有更低的功耗和更好的电磁兼容性。终端电阻CAN总线两端最远距离的两个节点必须各接一个120Ω的终端电阻用于阻抗匹配消除信号反射。这是很多新手容易遗漏导致通信不稳定的关键点。总线中间节点不应接此电阻。布线要求CAN_H和CAN_L应使用双绞线绞距尽量小。避免星型连接应采用总线型拓扑。如果节点需要分支分支线应尽可能短。数据链路层配置CAN控制器 现代MCU大多集成CAN控制器如STM32的bxCAN。配置主要涉及波特率设置CAN波特率 APB1时钟 / (Prescaler * (TimeSeg1 TimeSeg2 1))。其中TimeSeg1和TimeSeg2决定了采样点的位置一般建议采样点位于位时间的75%-80%处。例如目标波特率500kbpsAPB1时钟为36MHz分频器Prescaler设为4则时间份额tq 4 / 36MHz ≈ 111ns。设位时间为1/500kHz 2000ns则总时间份额数为2000/111 ≈ 18。可以配置TimeSeg113 TimeSeg24 同步段固定为1总和为18。采样点位于(113)/18 ≈ 77.8%。过滤器配置这是CAN控制器的精华。用于筛选接收到的海量报文减轻CPU负担。可以配置为标识符列表模式或掩码模式。例如只接收ID为0x123的报文或者接收ID在0x100-0x1FF范围内的报文。工作模式正常模式、静默模式只收不发用于监听、环回模式自发自收用于自测试。应用层协议 CAN只定义了物理层和数据链路层具体数据含义需要应用层协议规定。常见的标准有CANopen在工业自动化中广泛应用定义了对象字典、服务数据对象SDO、过程数据对象PDO等。J1939重型车辆和柴油发动机领域的标准。DeviceNet在工业控制领域常用。自定义简单协议对于小型系统可以自定义例如用前两个字节表示命令字后六个字节为数据。4.3 车载网络应用与故障排查实战在汽车中CAN网络是神经中枢。通常分为高速CANCAN-C波特率500kbps连接发动机、变速箱、ABS等核心控制单元对实时性要求极高。低速CANCAN-B波特率125kbps或更低连接车身舒适系统如门窗、空调、灯光等。车载CAN故障排查经验工具必备CAN总线分析仪如PCAN-USB Vector CANcase或支持CAN解码的示波器。常见故障现象与排查整个网络瘫痪检查总线终端电阻两端各120Ω并联后应为60Ω。测量CAN_H与CAN_L之间的直流电阻应在55-65Ω之间。如果远大于此值可能是终端电阻丢失或断路如果远小于此值可能是总线短路。某个节点通信异常将该节点从总线断开看网络是否恢复。如果恢复问题在该节点可能是收发器损坏、电源异常或MCU程序故障。用示波器测量该节点CAN_H和CAN_L对地的波形正常应为对称的差分信号。如果波形严重畸变或幅度不足可能是收发器故障或电源问题。大量错误帧使用分析仪查看错误类型位错误、格式错误、CRC错误等和错误计数器。如果某个节点的发送错误计数器快速增长可能是其发送的报文格式不对或波特率设置有误。如果所有节点都收到大量错误可能是总线受到强干扰或波特率不匹配。报文丢失检查总线负载率。CAN总线负载率建议低于30%峰值不超过50%。负载过高会导致低优先级报文无法及时发送。可以通过分析仪统计总线负载并优化报文发送频率和长度。5. I2S总线专为高保真音频而生的“艺术家”当通信的对象是数字音频数据时对时序和保真度的要求就达到了另一个维度。I2SInter-IC Sound是飞利浦专为数字音频设备之间传输而制定的总线标准它不像SPI、I2C那样通用但在其专业领域内做到了极致简洁和高效。5.1 信号定义、时序与数据格式详解I2S通常只需三根线有时四根就能传输高质量的立体声音频数据BCLKBit Clock 位时钟每一位数据对应一个时钟脉冲。其频率计算公式至关重要BCLK 采样频率 × 采样位数 × 通道数。例如对于44.1kHz 16位 立体声2通道的CD音质音频BCLK 44100 × 16 × 2 1.4112 MHz。LRCKWord Clock/Left-Right Clock 字时钟/左右声道时钟用于指示当前传输的是左声道还是右声道数据。LRCK的频率等于采样频率如44.1kHz。通常约定LRCK为高电平时传输左声道数据低电平时传输右声道数据。SDATASerial Data 串行数据实际的音频数据流以二进制补码形式传输。MCLKMaster Clock 主时钟 可选系统时钟通常是采样频率的256倍或384倍如44.1kHz × 256 11.2896MHz。许多高性能音频编解码器Codec需要这个超高频的稳定时钟来驱动内部锁相环PLL和数字滤波器以获得更低的抖动和更好的音质。I2S的数据格式是其核心。数据总是在LRCK变化表示一个声道帧开始后的第二个BCLK上升沿或下降沿取决于具体设备开始传输最高有效位MSB。这种设计带来了巨大的灵活性发送端和接收端的有效数据位数可以不同。例如发送端发送24位数据接收端是16位的DAC它可以选择只接收高16位丢弃低8位反之如果接收端是32位处理器它可以在接收16位数据后自动补零到32位。这完美解决了不同精度音频设备间的互连问题。除了标准的飞利浦格式还有两种常见变体左对齐格式数据在LRCK变化后的第一个BCLK边沿就开始传输。这种格式时间裕度更小对时序要求更苛刻。右对齐格式也叫日本格式数据的LSB最低有效位固定在LRCK变化前的最后一个BCLK边沿。这种格式现在已较少使用。5.2 在嵌入式音频系统中的应用与调试在嵌入式系统中使用I2S通常涉及一个主控制器MCU/MPU/FPGA和一个或多个音频编解码器Codec或数字麦克风。硬件连接注意事项时钟同步必须明确谁是时钟主设备Master。通常主控制器提供BCLK和LRCK作为MasterCodec作为从设备Slave。但有些设计为了获得更低抖动的时钟会让高性能的Codec或专用时钟芯片产生MCLK甚至BCLK/LRCK主控制器作为从设备接收时钟。主从模式必须匹配。MCLK的重要性对于追求高音质的应用如Hi-Fi播放器务必提供低抖动的MCLK。可以使用MCU的高精度时钟输出引脚或外接专用的低抖动时钟发生器如SiTime的MEMS时钟。信号完整性虽然I2S是单端信号但在高速如192kHz 24bit BCLK可达9.2MHz或长距离传输时仍需注意走线等长避免串扰。可以将三根信号线BCLK LRCK SDATA作为一组并行走线。软件配置与驱动开发以STM32的SAISerial Audio Interface或I2S外设为例配置步骤初始化时钟根据目标音频参数采样率、位深精确计算并配置BCLK和LRCK的频率。配置数据格式选择标准飞利浦格式、左对齐或右对齐。设置数据位宽16/24/32位。注意32位模式下通常用于传输24位有效数据高位补零。配置DMA音频数据流是连续的、实时的必须使用DMA。设置双缓冲Ping-Pong Buffer是标准做法一个缓冲区被DMA传输时CPU可以填充另一个缓冲区实现无缝衔接。处理数据音频数据通常是PCM脉冲编码调制格式。你可能需要实现音频处理算法如均衡器、混音或与编解码器进行控制通信通常通过I2C或SPI来配置Codec的寄存器。调试技巧无声或杂音首先用逻辑分析仪抓取I2S三根线的波形。检查BCLK、LRCK频率是否正确SDATA数据是否在正确的时钟边沿变化数据格式是否匹配。最常见的错误是主从时钟模式设反或者数据位宽、格式不匹配。爆音或断续通常是DMA缓冲区管理出了问题导致缓冲区溢出或下溢。检查DMA中断是否正常触发缓冲区切换逻辑是否正确。可以尝试增大DMA缓冲区大小。音质差底噪大检查电源质量特别是模拟部分Codec的AVDD的纹波。检查MCLK的抖动是否过大。检查PCB布局模拟地和数字地是否单点连接音频走线是否远离数字噪声源。6. SSP总线及其他相关接口简介SSPSynchronous Serial Port是某些ARM处理器如NXP LPC系列中常见的一个串行接口外设。你可以把它理解为一个高度可配置的、增强版的SPI接口。它的设计目标是兼容多种同步串行协议。6.1 SSP一个高度灵活的SPI超集SSP的核心特点是其帧格式的可编程性。除了支持标准的SPI模式Motorola格式外它通常还支持TITexas Instruments同步串行格式与SPI类似但使用不同的帧同步信号FS极性控制。Microwire格式一种更早的、半双工的同步串行协议由National Semiconductor推广。SSP外设允许你独立配置数据帧长度4位到16位、时钟极性和相位即SPI的四种模式、主从模式等。它的 FIFO先入先出缓冲区通常比标准SPI更深并且中断和DMA功能也更完善。因此当你使用的MCU带有SSP接口并且需要与多种不同格式的串行设备通信时SSP提供了极大的便利。在软件驱动上你只需根据从设备的数据手册正确配置SSP的控制寄存器其使用体验与SPI非常相似。6.2 其他相关串行接口简要对比在嵌入式世界里串行总线远不止这几种。了解它们的定位有助于你在选型时做出正确判断UART/RS-232/RS-485异步串行通信的鼻祖。简单、通用、距离远RS-485可达千米级但速度较低无时钟同步需要双方约定相同的波特率。常用于调试打印、与老式设备通信、工业控制网络。USB复杂的主机-设备架构的高速通用串行总线。协议栈复杂通常需要专门的控制器芯片或成熟的软件协议栈支持。用于连接PC外设、大容量存储、高速数据采集等。SDIO基于SD卡标准演化而来用于连接Wi-Fi、蓝牙、GPS等模块。物理层和SD卡相同协议层更复杂但速度可以很快SDIO 2.0可达50MB/s。Ethernet网络通信的绝对主力。在嵌入式领域通过MACPHY或集成MAC的MCU实现协议栈庞大如lwIP用于需要网络连接的高端应用。MIPI系列移动产业处理器接口包含CSI摄像头、DSI显示屏等超高速串行接口。速率可达数Gbps用于手机、平板等紧凑型设备内部连接设计和调试难度极高。6.3 总线选型决策树我该用哪一个面对一个具体项目如何选择总线我总结了一个简单的决策流程问距离与速度距离1米环境嘈杂首选CAN。距离1米要求高速10Mbps点对点或点对少数几点首选SPI。距离0.5米速度中低速1Mbps设备多且成本敏感首选I2C但要做好调试准备。问设备类型传输数字音频必须用I2S。连接Flash、ADC、DAC、屏幕驱动SPI是常见选择。连接传感器、EEPROM、RTC时钟芯片I2C是常见选择。连接汽车ECU、工业控制器CAN是标准选择。问系统复杂度简单主从控制设备少SPI或I2C。多主对等网络需要高可靠性CAN。连接消费类音频设备I2S。问开发资源追求最简单最快的驱动实现SPI。愿意花时间调试稳定性且IO口极其紧张I2C。有成熟的CAN协议栈如CANopen和硬件支持CAN。处理音频流有现成的Codec驱动和DMA配置I2S。没有一种总线是完美的只有最适合当前场景的。很多时候一个复杂的系统会同时用到多种总线例如核心处理器通过SPI连接Flash和屏幕通过I2C连接传感器和RTC通过CAN连接其他控制单元通过I2S连接音频Codec。作为一名嵌入式工程师熟练掌握这几种总线的特性、用法和调试技巧就像木匠熟悉他的锯、刨、凿一样是构建稳定可靠系统的基石。