一、追本溯源:SPI协议的本质是"环形移位寄存器"
要理解方向模式,必须先回归SPI的物理层本质。
SPI(Serial Peripheral Interface)的核心逻辑并非简单的"发送"和"接收",而是数据交换 。在SPI总线内部,主设备(Master)和从设备(Slave)各有一个移位寄存器 ,它们通过物理连线构成封闭的环形回路。
- SCK(时钟):由主机产生,驱动整个环路的运转。
- MOSI(主机输出,从机输入):主机移位寄存器的输出端,连接到从机移位寄存器的输入端。
- MISO(主机输入,从机输出):从机移位寄存器的输出端,连接到主机移位寄存器的输入端。
基本规律 :在SCK的每一个时钟沿,主机和从机同时 将移位寄存器中的1位数据"推"给对方,同时"拉"进来1位数据。这意味着,SPI在物理层面天生就是全双工的------发1位的同时,必然收到1位。
基于这个物理特性,芯片设计工程师为适应不同的应用场景(以及节省GPIO引脚),通过"裁剪"或"复用"数据线,衍生出多种方向模式。
二、分清主次:Master与Slave的角色定位
在深入模式之前,需要明确主从角色的分工:
- Master(主机) :唯一拥有SCK控制权的一方。谁产生时钟,谁就是Master。STM32在绝大多数应用场景中都作为Master。
- Slave(从机):被动接收SCK,在时钟驱动下响应数据。屏幕、Flash芯片、传感器等通常是从机。
一般规律是:STM32驱动外设时选择Master;STM32被电脑或主控MCU访问时才选择Slave。
三、逐一拆解:STM32的5种SPI方向模式
在STM32的HAL库或CubeMX配置中,与方向相关的常见选项如下(以Master视角展开,Slave逻辑与之对称):
1. Full-Duplex Master(全双工主机)------ 经典标准模式
- 数据线 :2根(MOSI + MISO),相互独立。
- 数据流向 :同时双向。在同一个时钟周期内,主机通过MOSI发送数据,同时从机通过MISO返回数据。
- 硬件动作:主机的发送移位寄存器和接收移位寄存器同时工作。
- 应用场景 :
- 外部Flash(如W25Q64):主机通过MOSI发送读命令和地址,Flash同时通过MISO输出存储数据,吞吐量高。
- 高速ADC/加速度传感器:需要实时读取采样值,并可能同步配置内部寄存器。
- 优点 :效率最高,通信速率拉满。缺点:占用2个数据GPIO,PCB需要布两根线。
2. Half-Duplex Master(半双工主机)------ 单总线双向模式
- 数据线 :1根(复用MOSI引脚,此时MISO引脚被释放,可作为普通IO使用)。
- 数据流向 :分时双向。在同一时刻,这根线要么处于发送(Tx)状态,要么处于接收(Rx)状态,由硬件自动切换。
- 硬件动作 :调用
HAL_SPI_Transmit()时,硬件自动将MOSI脚使能为输出;调用HAL_SPI_Receive()时,硬件自动将MOSI脚释放为输入(高阻态),把总线控制权交给从机。 - 应用场景 :
- 4线SPI接口的屏幕(如ILI9341、SSD1306 OLED) :屏幕通常只有一个
SDA数据脚。初始化时只需写入,调试读ID时需要切换到接收。 - 某些单总线传感器的非标准SPI变种。
- 4线SPI接口的屏幕(如ILI9341、SSD1306 OLED) :屏幕通常只有一个
- 优点 :节省引脚。缺点:收发不能同时进行,极限速度减半。
3. Transmit Only Master(仅发送主机)------ 单向输出模式
- 数据线 :1根(仅MOSI)。MISO引脚被释放。
- 数据流向 :只发不收。主机完全忽略MISO线上的信号。
- 硬件动作:发送移位寄存器工作,接收移位寄存器被禁用。
- 应用场景 :
- WS2812幻彩灯带(逻辑上类似单向传输):主机持续输出RGB颜色数据。
- 廉价DAC(数模转换芯片):主机只需将电压值发送出去,不需要回读芯片状态。
- 项目早期验证:如果确认外设不需要回传任何状态,选择此模式可以简化DMA中断逻辑。
- 优点 :软件逻辑简单。缺点:失去SPI的"交换"特性,无法通过回读校验通信是否正常。
4. Receive Only Master(仅接收主机)------ 纯数据采集模式
- 数据线 :1根(仅MISO)。MOSI引脚虽然在物理上存在,但主机只向外发送"虚拟字节"(如0xFF或0x00)以产生SCK时钟,MOSI线上的数据被忽略。
- 数据流向 :只收不发。主机专注于从MISO采样数据。
- 硬件动作:接收移位寄存器工作,发送寄存器循环发送无意义数据以维持时钟。
- 应用场景 :
- 数字麦克风(如MP34DT05):麦克风内置PLL,只需主机提供时钟,它就会持续从MISO输出PCM音频数据。
- 连续采样ADC:片选拉低后,ADC持续转换并输出数值,主机只需"盲采"。
- 注意 :此模式通常需要与从机的 Transmit Only Slave 配对使用。
5. 从机模式的特例:Transmit Only Slave(仅发送从机)
这是一个容易被忽略的角色。既然主机有"仅接收",从机就有对应的"仅发送"。
- 数据流向:从机只驱动MISO线向外输出数据,完全无视MOSI线上发来的任何指令(相关配置可能通过I2C等其他接口完成)。
- 应用场景 :上述的数字麦克风作为从机时,就是典型的Transmit Only Slave。它不需要主机通过SPI发送命令,只需主机提供时钟,便将音频数据"推"出去。
四、模式选择参考:结合实际外设需求
| 外设类型 | 推荐的STM32模式 | 原因与逻辑 |
|---|---|---|
| 高速Flash存储(W25Q系列) | 全双工主机 | 需要同时发送命令和读取数据,速度优先。 |
| 2.8寸/3.5寸 SPI屏幕(ILI9341) | 半双工主机 | 屏幕只有一根SDA线。多数情况只写,但为了读取ID验证硬件,需保留接收能力。 |
| 单总线LED(WS2812) | 仅发送主机 | 只发送颜色数据,无需回读,GPIO紧张时优先考虑。 |
| 数字麦克风/音频流 | 仅接收主机(配合从机发送) | 只需提供时钟,由DMA后台搬移音频数据,CPU零干预。 |
| 无MISO引脚的廉价DAC | 仅发送主机 | 物理上未连接MISO,只能选择仅发送模式。 |
结语
SPI的方向模式并非玄学,而是根据引脚资源 和通信需求做出的权衡。
- 追求极致速度,且引脚充裕 → 全双工
- 驱动屏幕或传感器,需要节省引脚且偶尔回读 → 半双工
- 驱动纯输出型负载,不关心反馈 → 仅发送
- 采集纯数据流(音频/ADC),不涉及配置 → 仅接收