SPI协议

  • SPI 信号包括标准串行时钟(SCLK)、主入从出(MISO)、主出从入(MOSI)和从设备选择(SS)。

  • SPI 通常是全双工通信:主设备和从设备可以在同一时钟下同时发送和接收数据。多个从设备时,SCLK、MOSI、MISO 可以共用,但每个从设备通常需要一根独立的 SS/CS。

  • SS/CS引脚用于将 SPI 模块产生的选择信号输出至另一外围设备;当 SPI 模块配置为主设备时,该引脚用于输出该选择信号;而当 SPI 模块配置为从设备时,该引脚则用作输入端以接收从设备选择信号。

关于片选使能

  • MODFEN — 模式故障使能位:该位用于检测 MODF 故障。若 SPI 处于主模式且 MODFEN 位被清零,则 SSOE 端口引脚不被 SPI 使用;在从模式下,无论 MODFEN 位的值为何,SS 端口引脚均仅作为输入端使用。

  • 完全不使用硬件的SPI不需要进行片选,或者通过软件片选(00/01)。

  • MODFEN控制位,当MODFEN为1有效的时候,SSOE 作为输入,用于检测模式故障,也就是检测总线冲突。也就是MODFEN为1时SSOE被配置为输入,并且外部把 SS 拉低,硬件会认为有另一个主机在选自己,发生多主冲突,于是触发 MODF 模式故障,可能自动清除主模式位,让本机降为从机(10)。

  • 如果是单主机多个从机的场景,虽然不会被降级成从机,但是仍然需要片选,所以MODFEN仍需设置成1,且SSOE也要设置成1,这样能保证可以通过0来拉低从机SS/CS引脚选中从机(11)。
    image

  • SS/SC一般而言在选择从机是会将对应从机SS/CS引脚拉低,跟上面说的SSOE不是一个东西,SSOE更像是使能控制,只有MODFEN和SSOE使能的时候,才能片选。

  • CPOL用于选择反相或非反相的 SPI 时钟信号。在 SPI 模块之间传输数据时,各 SPI 模块必须具有相同的 CPOL 值,在主模式下,该位的改变将中止当前正在进行的传输,并使 SPI 系统进入空闲状态。
    0 = 代表正相,在空闲状态下, SCK 为低电平,高电平时保持;
    1 = 代表反相,在空闲状态下, SCK 为高电平,低电平时保持;

关于时钟极性采样

  • CPHA选择 SPI 时钟格式,决定采样边沿,也是有两种选择,决定是在奇数边沿采样还是在偶数沿采样,
    1 = 数据采样发生在 SCK 时钟的偶边沿(2、4、6……、16);
    0 = 数据采样发生在 SCK 时钟的奇边沿(1、3、5……、15)。
    0代表第一个边沿采样(奇数沿),1代表第二个边沿采样(偶数沿)。至于是上升沿还是下降沿采样这个不固定,不仅与CPHA有关,还与CPLO有关,决定了SPI的工作模式,分别是:
    image

  • LSB-First Enable(LSBFE)不影响数据寄存器中 MSB 和 LSB 的位置,对数据寄存器进行读取或写入操作时, MSB 始终位于第 7 位。在主模式下,该位的变更将中止当前正在进行的传输,并使 SPI 系统进入空闲状态。
    1 = 数据按最低有效位优先方式传输;
    0 = 数据按最高有效位优先方式传输。

关于工作原理(主机模式)

  • SPI系统的核心组件是SPI数据寄存器。主设备中的8位数据寄存器与从设备中的8位数据寄存器通过 MOSI 和MISO引脚相连,构成一个分布式16位寄存器(在 8 个时钟周期里,两个 8 位寄存器一起移位,相当于一个 16 位寄存器在循环移位。)。当执行数据传输操作时,该16位寄存器会由主设备发出的S-clock时钟进行8位串行移位操作,从而实现主设备与从设备之间的数据交换。你往主设备数据寄存器里写什么,就会发给从设备;你从主设备数据寄存器里读什么,就是从设备发给你的。

  • 当 MSTR 位被置位时,SPI 单元以主模式运行。仅主 SPI 模块可发起数据传输。传输操作始于向主 SPI 数据寄存器写入数据;若移位寄存器已清空,则该字节将立即被移入移位寄存器。该字节将在串行时钟的控制下通过 MOSI 引脚进行移位输出。

  • S-clock,SPI波特率寄存器中的SPR2、SPR1和SPR0波特率选择位,与SPPR2、SPPR1和SPPR0波特率预选位协同作用,用于控制波特率发生器并确定数据传输速率。 SCK 引脚为SPI时钟输出端;主设备通过该 SCK 引脚控制从设备外围器件的移位寄存器。

  • 在主模式下,串行数据输出引脚(MOSI)与串行数据输入引脚(MISO)的功能由 SPC0 及BIDIROE决定。

从机模式(从跟主)

  • 在从机模式下, SCK 表示来自主设备的 SPI 时钟输入信号。
  • 在从机模式下,串行数据输出引脚(MISO)与串行数据输入引脚(MOSI)的功能由 SPI 控制寄存器 2 中的 SPC0 位和BIDIROE决定。
  • 在数据传输发生之前,从设备的SPI接口上的SS引脚必须保持低电平;SS引脚必须持续保持低电平直至数据传输完成。若SS引脚变为高电平,则SPI接口将被强制进入空闲状态。
  • SS引脚还用于控制串行数据输出引脚:当SS引脚为高电平(即从设备未被选中)时,串行数据输出引脚处于高阻抗状态;当SS引脚为低电平时,SPI数据寄存器中的第一个数据位将被驱动输出至串行数据输出引脚。(SS控制串行数据传输)
  • 此外,若从设备未被选中(SS引脚为高电平),则 SCK 输入信号将被忽略,且SPI移位寄存器不会进行内部数据移位操作。尽管SPI接口支持双工操作,但某些SPI外设仅能在从设备模式下接收SPI数据。(SS控制SCLK的有效性)
  • 可以观察到,从机的一切行为都取决于是否被选中,也就是SS是否为0.

posted on 2026-09-20 11:41  tuck0603  阅读(15)  评论(0)    收藏  举报

导航