上一篇下一篇IIC 专题I²C---- 下集目 录SPI 专题1简单介绍一下 SPI2SPI 有几种工作模式3SPI 的基本通信时序4简述主/从机的数据交互物理层逻辑层5简述多从设备的 SPI 通信实现方式6SPI 通信速率受什么影响7简述一下 SPI 的优缺点8IIC 和 SPI 对比SPI 专题SPI串行外设设备接口Serial Peripheral Interface可参考博客Cortex-M3-STM32F1 开发五十二详细介绍了 SPI 的结构、工作模式、寄存器、函数等_stm32f1 spi-CSDN博客1简单介绍一下 SPISPI是一种同步、全双工的串行通信协议主要用于微控制器和各类外设传感器、存储器、显示屏等之间进行高速、短距离的数据传输。单主多从结构协议本身很简洁没有复杂的寻址机制使用专用的片选线选择从设备、也没有应答机制。所需信号线有 4 根1位时钟SCLK– 主设备产生双方严格按此时钟采样/发送数据所以速度可达几十MHz远快于异步串口。2根独立数据线MOSI、MISO– 分别负责主发从收和主收从发因此可以同时收发。1根片选线CS/SS– 每个从设备独占一根主设备拉低对应引脚来选择通信对象。它的工作方式可以类比为一个“移位寄存器环”主设备通过时钟驱动在一次传输中将自己的寄存器数据推入从设备同时将对方的数据拉回来。通常还会涉及 4 种时钟极性和相位组合模式0~3用来适配不同外设的时序要求。2SPI 有几种工作模式SPI 的工作模式由时钟极性CPOL、时钟相位CPHA共同决定主要是为了配置上升沿还是下降沿采样。时钟极性CPOL决定空闲状态下 SCLK 的电平⟶ \longrightarrow⟶CPOL0空闲状态为低电平CPOL1空闲状态为高电平。时钟相位CPHA决定在第几个时钟边沿采样数据⟶ \longrightarrow⟶CPHA0在 SCK 的第一奇数边沿进行数据采样接收在第二边沿进行数据更新发送CPHA1在 SCK 的第二偶数边沿进行数据采样接收在第一边沿进行数据更新发送工作模式表模式CPOLCPHA空闲时 SCLK 电平数据采样接收时刻数据更新发送时刻000低上升沿第1个边沿奇数下降沿第2个边沿偶数101低下降沿第2个边沿偶数上升沿第1个边沿奇数210高下降沿第1个边沿奇数上升沿第2个边沿偶数311高上升沿第2个边沿偶数下降沿第1个边沿奇数通常使用的是工作模式 000或工作模式 311。常见设备中SD卡初始化时一般使用Mode 0大多数FLASH存储器使用Mode 0或Mode 3某些传感器使用Mode 1或Mode 2。3SPI 的基本通信时序主设备将对应从设备的 CS 片选线拉低激活主设备开始产生时钟信号 SCLK主设备通过 MOSI 线发送数据同时可以通过 MISO 线接收数据数据传输完成后主设备停止时钟将 CS 片选线拉高释放SPI 的硬件通信协议本身非常底层自由发挥空间很大虽然有 MOSI 和 MISO 线但是每次传输就是连续的 8 位或 16 位移位操作硬件不关心你发的是什么也不解析任何“帧头”、“地址”或“校验”也没有起始位、停止位等硬件固定格式。开发者可自定义应用层协议类似 UART 串口一样定义帧头和帧尾。4简述主/从机的数据交互物理层逻辑层使用SPI的时候比如说主机发数据从机一定要同时回数据吗可不可以主机发但是从机同时回和不同时回都行呢物理/硬件层面只要有数据被主/从机发出就必须发生数据交换SPI 在底层本质上是主机和从机内部各有一个 8 位移位寄存器通过 MOSI 和 MISO 串联成一个封闭的环每当时钟线SCLK上产生一个脉冲主机移位寄存器就会通过 MOSI 向从机移入 1 位数据与此同时从机移位寄存器也会通过 MISO 向主机移入1位数据8 个时钟周期后主从设备完成一个字节的交换高位先发这个过程是纯硬件动作无法“跳过”或“不做”。就算从机的移位寄存器里拿到的数据无论是指令还是垃圾它都会在下一个时钟沿被移出去移入主机的移位寄存器中。所以从物理实现上讲只要主机发数据产生时钟从机就“一定”会回数据这是由硬件驱动的移位动作硬性决定的。应用/逻辑层面主机/从机都可以选择“不回有效数据”或“忽略收到的数据”虽然物理上移位一定会发生但从机可以不把“有效数据”放到移位寄存器里。常见的做法是对于从机它可以在编程或硬件设计上直接输出0、全1或者任意无用电平相当于“发了一串无意义的数据”。对于主机在只需要写命令的场景例如给 SPI 接口的 LCD 屏、一些传感器发配置指令主机完全可以忽略 MISO 引脚上接收到的数据直接将接收缓冲区丢弃或不读取。举个实际例子SPI Flash 写指令主机连续发送若干字节指令地址数据这段时间主机根本不关心 MISO 上从机回了什么。只有当主机发出读指令并需要读取状态寄存器或数据时才会特意去接收并解析 MISO 上的数据。所以总结起来就是物理上一定是“主/从机发 1 bit另一个紧接着就回 1 bit”因为每次时钟移位都必然有数据进出但逻辑上完全可以“不同时回有效数据”主机也可以选择看或不看拿到的数据。5简述多从设备的 SPI 通信实现方式独立片选法最典型连接每个从机都独立接到主机的MOSI、MISO、SCLK上但每个从机需要一根独立的CS线由主机GPIO分别控制。菊花链法级联连接所有从机共享同一根CS和SCLK但数据线串接主机 MOSI → 从机1 MOSI从机1 MISO → 从机2 MOSI从机2 MISO → 从机3 MOSI … 最后一个从机的MISO → 主机 MISO。实际上所有从机连成一个大的移位寄存器环。无论多少从机只占用主机一根CS极大节省GPIO。但数据必须像流水线一样依次穿过所有从机必须一次性读写全部从机延迟大效率低且链上任意一个从机故障整条链路可能中断。译码器扩展法补充思路使用3-8译码器或类似的逻辑芯片用几根GPIO输出二进制地址译码后产生多根CS线。这样用少量GPIO就可控制更多从机同时保留了独立访问能力。缺点是需要额外芯片且软件需要地址选择逻辑。6SPI 通信速率受什么影响SPI 的通信速率主要由以下三个层面共同决定最终由最慢的那个环节锁定上限时钟源决定上限主设备板载 SPI 外设的输入时钟频率由系统时钟树决定和可配置的分频系数直接产生 SCLK从设备数据手册中明确标明的最大 SCLK 承受能力是绝对不能逾越的硬天花板超过后从机无法正确采样物理传输通道PCB 走线过长、阻抗不匹配、串扰和反射会导致信号畸变即使器件本身能跑更高频率也会因误码而被迫降速主从供电电压不匹配如 3.3V 对 5V会使信号斜率变缓或逻辑电平判据不足限制实际可用的最高可靠频率软件处理能力即使 SCLK 频率很高如果使用CPU 轮询方式搬运数据或频繁的CS 切换、不合理的帧间延时都会产生大量空闲时间降低有效数据传输速率bps。采用DMA、双缓冲、批量传输可减少 CPU 干预和总线空闲使实际吞吐量接近理论值。一句话总结SCLK 频率由主控时钟分频和从设备支持上限决定实际能达到的最高可靠速率受 PCB 信号质量制约最终的数据吞吐率还受软件搬运效率的影响。——————————————————以 STM32F103 为例由系统时钟树可知SPI1 理论峰值 36 MHz实际常用 918 MHzSPI2/3 理论峰值 18 MHz实际常用 4.59 MHz。最终选用哪个频率取决于从设备能承受的上限以及板子上的信号质量。7简述一下 SPI 的优缺点优点由于没有设备地址、没有应答机制协议层极薄传输效率很高缺点需要为每个从设备分配一个GPIO做片选且主设备无法硬件确认数据是否被正确接收依赖上层协议或设计保证。8IIC 和 SPI 对比特性SPIIIC信号线数4 线SCLK, MOSI, MISO, CS2 线SCL, SDA通信方式全双工同时收发半双工分时收发通信速率高通常10MHz ~ 50MHz较低标准100kbps快速400kbps高速3.4Mbps寻址方式通过硬件片选线CS选中设备通过协议层发送 7 位或 10 位设备地址应答机制无无法确认从机是否接收到数据有每个字节后跟一位应答位ACK/NACK拓扑结构一主多从每增加一个从机需增加一根CS线多主多从所有设备共享2线通过地址区分采样时机边沿采样电平采样数据格式8 位为主少数 16 位8 位传输顺序MSB 先发为主少数 LSB 先发MSB 先发设计复杂度协议极简硬件稍复杂线多协议较复杂地址、仲裁、应答硬件简单线少典型应用高速、大吞吐场景Flash, TFT屏, SD卡低速、引脚敏感场景EEPROM, 各类传感器, PMIC