)
一、SPI是什么SPISerial Peripheral Interface是一种全双工、主从架构的同步串行通信协议。核心物理模型是将主设备和从设备内的两个移位寄存器通过时钟线连接在一起。每个时钟脉冲到来时两个移位寄存器同时向前移动一位——主设备移出一位进入从设备从设备也移出一位进入主设备。八个时钟脉冲结束后两个设备的寄存器内容就完全互换了。因此SPI 的本质上是一个极简的移位寄存器数据交换链路。二、为什么需要SPI在一个电路板上不同的芯片之间需要交换数据SPI是实现这类板内短距离通信的方案之一。SPI具有速度快全双工硬件成本低只用移位寄存器和少量控制逻辑协议灵活数据字长时钟频率采样边沿都可以配置的特点。三、SPI怎么工作3.1 四根信号线——CS/SCK/MOSI/MISO用一个故事来理解在一个被围墙隔开的王国里国王在城堡内骑士在围墙外。他们只能通过四根绳子来传递信息。国王需要给骑士下达命令骑士需要接给国王反馈城墙外的情况。如果国王和骑士想要正常沟通那他们就必须制定一套规则。绳子一选人绳CSChip Select围墙外有很多骑士国王必须先决定对谁说话。他选中某个骑士时就把属于那个骑士的选人绳绷紧拉直没选中的绳子就是松的。绳子二节拍绳SCKSerial Clock国王发的消息只有 0 和 1绳子松或紧。如果只用一根数据绳国王发送的消息是01那就是一松一紧骑士可以正确理解国王的命令。但如果国王发送的是00那绳子就一直松着骑士没法判断这到底是一个很长的0还是两个连续的0。即只靠一根数据绳没法区分连续两个相同的状态。于是如果他们约定了一根节拍绳国王每将节拍绳拉紧一下就在数据绳上放一个新数字骑士只在节拍绳拉紧的那一瞬间去识别这根数据绳的状态。绳子三国王的传声筒绳MOSIMaster Out Slave In专门用于国王向骑士传递命令。方向固定只能国王发骑士收。国王把命令比如“停止进攻”转换为只有双方能懂的比特串然后跟着节拍绳的节拍一位一位地推过去。绳子四骑士的传声筒绳MISOMaster In Slave Out骑士也需要把城外看到的情报报告给国王这根绳子就是骑士专用的回话通道。同样只能骑士发国王收。在节拍绳每拉紧一下的瞬间国王在 MOSI 上放一个比特给骑士同时骑士也在 MISO 上放一个比特给国王。两人各说各的互不冲突。注意骑士推出去的数字并不是对国王“当前正在说的这句话”的回答而是骑士早就提前准备好要报告的情报。等国王把整条命令发完骑士也把一个完整的情报同时塞回了国王手里。因为有两条独立的传声筒绳MOSI和MISO发命令和收情报是同时完成的——国王不需要等自己说完再听骑士也不需要等国王说完再讲。这种特性就叫“全双工”。SPI的全双工不是两个人聊天而是两个人同时给对方传递信息。3.2 四线总结信号线方向功能SCK主→从时钟线由主设备产生为通信提供节拍MOSI主→从主设备发数据从设备收数据MISO从→主从设备发数据主设备收数据CS / SS主→从片选线3.3、如何对齐采样时刻——CPOL 和 CPHA3.3.1 两个问题已经知道SCK起到一个节拍器的作用此时存在两个问题Q1国王和骑士是在SCK绳拉紧的时候读指令还是SCK绳松着的时候读数据错误场景1国王在绳子拉紧后发数据骑士在国王松绳子后读数据。错误场景2国王在松绳子后发数据骑士在国王拉紧后读数据。Q2国王不发指令时SCK绳默认是拉紧还是松的如果国王平时一直拉紧绳子默认高电平那他要发数据的时候第一个动作就是松绳子如果国王平时一松着绳子默认低电平那第一个动作是拉绳子拉紧。若国王习惯默认是低电平骑士认为是默认是高电平国王一拉紧绳子骑士认为国王恢复到了自己认为的默认状态就不管但国王一松绳子骑士误以为国王要发指令就准备开始工作。国王和骑士各自觉得自己做得对但读出来的全是错位、遗漏、误判的数据。3.3.2 CPOL和CPHACPHA相位决定是在SCK绳变松的时候读取数据还是在拉紧的时候读数据——解决Q1CPOL极性决定没发数据时SCK绳是松的还是拉紧的——解决Q2因此 SPI 定义了两个参数CPOLClock Polarity时钟极性决定空闲时 SCK 的电平。CPOL 0空闲时 SCK 为低电平。CPOL 1空闲时 SCK 为高电平。CPHAClock Phase时钟相位决定数据在第几个时钟边沿被采样。CPHA 0在第一个时钟边沿采样。CPHA 1在第二个时钟边沿采样。两个参数互相配合产生出 4 种标准工作模式主设备和从设备必须配置相同的模式才能正常通信。SPI 模式CPOLCPHA采样边沿锁存数据更新边沿输出新数据模式 000SCK 上升沿SCK 下降沿模式 101SCK 下降沿SCK 上升沿模式 210SCK 下降沿SCK 上升沿模式 311SCK 上升沿SCK 下降沿3.3.3 以模式1为例分析波形模式1CPOL 0CPHA 1上图中SCK空闲时为低电平对应CPOL0CPHA1指的是从SCK的第2个边沿开始采样结合CPOL0和CPHA1可知在下降沿处开始采样。此时所有输出更新都是在上升沿所有数据采样都是在下降沿对应图中虚线代表上升沿输出点线代表下降沿采样。时序流程单 bit 拆解CPOL0 CPHA11初始SCK0 空闲时下降沿2SCK↑上升沿第 1 边沿主机移位寄存器 → 更新 MOSI从机移位寄存器 → 更新 MISO3SCK 高电平维持一段时间MOSI/MISO 数据稳定4SCK↓下降沿第 2 边沿从机锁存 MOSI bit主机锁存 MISO bit5SCK 回到低完成 1bit循环下一位四、SPI支持的连接方式SPI的常见的连接方式有2种一主一从一主多从4.1 一主一从连接4 根信号线SCK、MOSI、MISO、CS直接一对一连接。4.2 一主多从一主多从有两种连接方式标准模式独立片选线和菊花链模式4.2.1 标准模式独立片选线1连接SCK、MOSI、MISO 三根线并联共享CS 线每个从设备一根2规则任意时刻有且只有 1 个从设备的 CS 被选中。未被选中的从设备其 MISO 引脚必须处于高阻态不干扰总线。主设备选谁谁就应答其他从设备不作反应。3优缺点优点逻辑简单各从设备可以独立工作在不同的模式和速率。缺点每增加一个从设备每增加一个从设备主设备就需要多一根 GPIO片选脚。4.2.2 菊花链模式Daisy Chain1连接方式所有从设备共用一根 CS 线数据线串联——主 MOSI → 从设备 1 输入 → 从设备 1 输出 → 从设备 2 输入 → … → 最后一个从设备输出 → 主 MISO2规则所有从设备同时被同一根 CS 选中数据像流水线一样依次流经每个设备。3优缺点优点只用 1 根 CS节省主设备引脚适合需要同步控制多个相同芯片的场合。缺点所有设备必须同时工作模式必须一致数据延迟较长要通过一条链一个设备出问题整个链就断了。五、SPI的优点和缺点5.1 优点1全双工速度快MOSI 和 MISO 两根数据线独立主发从收和从发主收可以同时进行同等时钟频率下有效吞吐量几乎是半双工协议的两倍。2协议简单硬件实现成本极低。3 时钟灵活没有固定速率上限时钟完全由主设备产生从设备无条件跟随。4支持任意字长数据不一定是 8 位可以是 9 位、12 位、16 位等。5 无硬件地址限制天然支持“广播”通过物理 CS 线选择设备不需要在帧内嵌入地址字节。如果同时拉低多个 CS还可以一次性向多个从设备发送相同数据广播。5.2 缺点1 引脚消耗大用物理片选代替地址字段每增加一个从设备就要多一根 CS 线。菊花链能省 CS但失去了独立控制能力。2没有标准化的流控和应答机制主设备发送数据后无法知道从设备是否正确接收也不知道从设备是否忙。3无硬件级别的错误检测没有奇偶校验位没有强制 CRC。数据在传输中若发生位翻转硬件层面完全无法察觉。4传输距离短抗干扰能力弱信号为单端高速数字电平没有差分或复杂的噪声容限设计通常只适合同一块电路板内的短距离通信。6从设备永远被动从设备不能主动发起通信。当从设备有紧急数据如传感器报警时只能等主设备发起下一次传输时“搭车”上报或者额外接一根独立的中断引起来通知主设备。5.3 SPI 的取舍理解设计取舍在「国王与骑士」故事中理解这样做换来的好处这样做付出的代价放弃地址字段国王不喊“3号骑士听令”而是直接拉一下属于3号骑士的专属选人绳。骑士根本不用知道自己编号。协议帧不含任何地址开销从设备仅需移位寄存器硬件实现极简通信效率高纯数据直达。必须为每个从设备分配独立的片选线CS导致主设备引脚数量随从设备增多而线性增加限制系统可扩展性。放弃应答机制国王说完一句话不等骑士回答“收到”马上说下一句。同时骑士也在自顾自情报上报两人互不打断。不存在应答等待周期时钟频率可连续拉满全双工通信完全不受从机响应速度制约吞吐量最大化。主设备无法感知从设备是否接收成功或正忙碌缺乏底层流控和错误通知可靠性依赖上层协议。放弃硬件校验两人传递的消息不附加任何防伪印章或校验码只传原话。每个时钟沿均传输有效载荷位无校验位或 CRC 带来的带宽开销移位寄存器电路最简无额外逻辑延迟。物理层无任何错误检测能力位翻转等传输错误无法被发现数据完整性必须由应用层自行保证如软件 CRC、重传。六、适用场景与替代方案6.1 适用SPI的应用场景1对速度要求高的器件2板上设备数量不多且MCU有足够的GPIO3需要全双工、低延迟、恒定传输间隔的场合6.2 不适合SPI的应用场景1引脚紧张且从设备众多 → 改用 I²C2 线带地址可挂上百个设备2需要米级以上长距离通信 → 改用 RS-485、CAN 等差分总线3从设备需要主动报告事件又不想额外加中断线 → I²C 或异步串口可能更合适4要求热插拔、硬件仲裁、复杂错误恢复 → 使用 I²C、USB 等带完善协议栈的总线七、实际工作中对SPI分析需要注意的点1主从模式芯片支持主模式还是从模式或者两者均可2时钟模式支持哪几种 CPOL/CPHA 组合主从必须一致。3最高频率主设备能产生、从设备能容忍的最高 SCK 频率是多少以两者中低的为准。4数据格式字长多少位先发最高位MSB还是最低位LSB5CS 管理硬件自动 CS 还是软件 GPIO 控制从设备是否要求每帧后 CS 必须拉高6电气特性引脚输入/输出电平标准、是否 5V 容忍、MISO 未选中时是否真正高阻。7可靠性补偿由于 SPI 无硬件应答和校验应用中通常需要增加软件 CRC 校验、通信超时处理等机制来保证数据可靠。