在开始介绍HC32F460的SPI驱动之前,先重点对SPI总线的功能与特点进行说明。
1、SPI总线简介
SPI(Serial Peripheral Interface,串行外设接口),是摩托罗拉提出的同步串行通信总线,属于短距离、板内高速通信,广泛用于 MCU 和 Flash、ADC、DAC、LCD、隔离芯片、FPGA 等外设之间。
标准4线SPI采用SCK(串行时钟)、MOSI(主发从收)、MISO(主收从发)、NSS/CS(片选)。其中串行时钟SCK由主机提供,收发双方共用同一个时钟信号,不需要像串口一样约定波特率。
SPI的通信速率由SCK时钟决定,与传统USART相比,速度极快,一般能做到数兆到数十兆Hz。
此外SPI为全双工通信接口,SCK每走一个时钟,主机发送1 bit的同时也会收到1bit。也即是即使只想发送,也会收到数据,同样即使只想接收,也需要同时发送数据。
1.1 工作模式
SPI具有4种模式,由CPOL(时钟极性)决定空闲时的SCK电平;CPAL(时钟相位)决定在哪个边沿采样数据。
- CPOL(时钟极性):空闲时 SCK 电平
- CPOL=0:空闲低电平
- CPOL=1:空闲高电平
- CPHA(时钟相位):在哪一个边沿采样数据
- CPHA=0:第一个时钟沿采样
- CPHA=1:第二个时钟沿采样

1.2 片选
需要说明的是:SPI 的片选(CS/NSS)确实有初始化和复位的作用,它不仅是"选不选从设备"的开关,还承担着界定一次通信事务、触发从设备内部状态复位的功能。很多从机芯片内部有状态机,靠 CS 的上升沿复位逻辑、锁存数据。比如 SPI Flash,如果片选时序不对,读出来的数据可能错位,且复位不干净。
1.3 数据宽度
SPI的数据宽度决定了每帧传输的位数,而每帧之间的NSS(片选信号)需要根据从设备的要求来设置帧间间隔。 数据宽度常见有8位和16位,帧间NSS的拉高时间由从设备的时序要求决定,不能随意缩短。
NSS拉低表示通信开始,拉高表示结束。每帧之间NSS必须经历完整拉高-拉低过程,从设备靠此识别帧边界。
需要注意的是:在MCU自动控制NSS的时候,会在每帧传输后进行一次完整的拉高、拉低的进程。可能会导致从机误判,因此当需要连续传输多字节时,还是采用软件NSS为好(即GPIO控制)。
2、HC32F460的SPI
- HC32F460 片上集成 4 路硬件 SPI 外设;其中 SPI2、SPI3 仅具备一路硬件片选 NSS0,SPI0、SPI1 支持 NSS0~NSS3 四路硬件片选。
- 支持主机、从机模式配置;从机模式工程应用场景较少,本驱动库仅实现主机功能。
- 支持标准四线模式与三线时钟同步运行模式。三线时钟同步模式不再使用 NSS 作为帧同步信号,仅依靠 SCK 时钟边沿完成帧同步;NSS0 引脚会被释放,可配置为普通 GPIO 使用。
- 数据位宽支持 4~32bit 灵活配置。
- 校验位紧跟在一帧数据的最后一位之后,属于同一 NSS 周期内的最后一 bit。SPI 标准本身未定义校验位,校验位是否占用数据位宽由芯片设计决定。HC32F460 的 SPI 校验位由硬件集成在帧结构内:若配置 32bit 数据宽度并开启校验,有效数据位将变为 31bit。
- 支持 MSB、LSB 两种移位顺序:MSB 为高位优先传输,LSB 为低位优先传输。