SPI 协议底层通信原理详解
一、 核心特性与总线架构通信特征同步、串行、全双工。网络拓扑支持一主多从主要模式也支持多主多从。与 IIC 的速率对比SPI 的通信速率远快于 IIC。底层原因IIC 为了实现多主机的线与逻辑数据线使用了开漏输出结构必须依赖外部上拉电阻拉高电平。由于走线寄生电容的存在由电阻拉高电平的上升沿比较平缓RC充放电导致时钟频率受限而 SPI 使用的是推挽输出内部晶体管直接驱动高低电平上升/下降沿非常陡峭因此速率可以非常高。硬件连线四线制SCK (Serial Clock)时钟线由主机产生并控制频率。MOSI (Master Output Slave Input)主机输出从机输入数据线。MISO (Master Input Slave Output)主机输入从机输出数据线。SS / CS (Slave Select / Chip Select)从机选择线。二、 一主多从的实现与局限寻址方式与 IIC 通过发送软件设备地址来寻址不同SPI 采用纯硬件物理寻址。连接方式所有从机的 MOSI、MISO、SCK 全部并联在一起。但每个从机都需要单独引出一根 SS 线与主机的 GPIO 相连。通信过程主机想和哪个从机通信就把连接该从机的 SS 线拉低低电平有效。通信结束后再将 SS 线拉高释放该从机。资源消耗弊端这种模式非常消耗主机的 GPIO 资源。有多少个从机主机就需要付出多少根独立的 SS 引脚。三、 最底层原理基于移位寄存器的“字节交换”SPI 的本质不是单纯的“发送”或“接收”而是主从机之间强制性的“数据交换”。硬件基础主机和从机的底层各有一个 8 位或 16 位的移位寄存器。动态交换过程以一个字节为例当时钟源产生移位边沿如上升沿或下降沿取决于模式时主机和从机的移位寄存器同时整体向左移一位。主机的最高位MSB被挤出发送到MOSI线上同时从机的最高位MSB被挤出发送到MISO线上。当时钟源产生采样边沿时双方同时读取数据线上的电平。主机读取 MISO 上的电平并将其塞入自己移位寄存器的最低位LSB从机读取 MOSI 上的电平并塞入自己寄存器的最低位。时钟跳变 8 次为一个循环刚好完成 8 个 bit 的位移。此时主机的寄存器里装的是从机原来的数据从机的寄存器里装的是主机原来的数据完成了一次完美的字节交换。四、 单向通信只发 / 只收的变通实现既然底层强制是双向交换当我们在软件层面上只需要单向通信时该怎么办只发送模式Tx Only我们把有效数据放进寄存器发出去同时时钟也会把从机的数据交换进我们的寄存器。处理方法直接丢弃/不读接收回来的数据即可。只接收模式Rx Only我们需要从机的数据但 SPI 必须有主机的时钟驱动才能工作时钟一动就会发送数据。处理方法随便发送一个无意义的“假数据”Dummy Byte通常是0xFF或0x00。用这个废字节去把从机里的有效数据“套”出来。五、 SPI 的四种时序模式 (CPOL CPHA)你总结的四种模式逻辑非常对。在单片机底层寄存器配置中这四种模式由两个标志位决定CPOL (Clock Polarity - 时钟极性)决定空闲时无通信时SCK 线的电平是低还是高。CPHA (Clock Phase - 时钟相位)决定是在第 1 个时钟跳变沿采样还是第 2 个时钟跳变沿采样。对应你提到的内容标准术语映射如下模式 0 (CPOL0, CPHA0)空闲时钟为低电平。主机拉低 SS 线的瞬间第一位数据就已经被移出到数据线上。时钟线来上升沿第1个边沿时双方同时读取/采样数据。时钟来下降沿时双方移位。结束时 SS 拉高。对应你的模式 0 理解。模式 1 (CPOL0, CPHA1)空闲时钟为低电平。拉低 SS 线后时钟线来上升沿第1个边沿时双方移位。时钟来下降沿第2个边沿时双方读取/采样数据。对应你的模式 1 理解。模式 2 (CPOL1, CPHA0)就是模式 0 的时钟反转版。空闲时钟为高电平。第1个边沿下降沿读取/采样第2个边沿上升沿移位。这对应你说的“模式3对应模式0时钟翻转”。模式 3 (CPOL1, CPHA1)就是模式 1 的时钟反转版。空闲时钟为高电平。第1个边沿下降沿移位第2个边沿上升沿读取/采样。这对应你说的“模式4对应模式1时钟翻转”。