描述 #
该文件包含 CH32V00x 系列微控制器 SPI 外设固件库的所有函数原型、常量定义、枚举类型和结构体定义。SPI(串行外设接口)是一种高速、全双工、同步的通信协议,广泛用于连接微控制器与传感器、存储器、显示器等外设。本库支持主从模式切换、CRC 校验、DMA 传输、软件 NSS 管理、单双线模式等高级功能,特别针对 CH32V00x 系列的硬件特性进行了优化。注意:在从模式下发送数据时,必须将 SPI_CPOL 设置为高电平(SPI_CPOL_High),这是由芯片内部时序逻辑决定的硬性要求。
常量 #
SPI_data_direction
#
指定 SPI 数据传输方向,支持全双工、单向接收、单向发送和半双工模式。
在半双工模式下,通过 SPI_BiDirectionalLineConfig() 动态切换收发方向,适用于节省引脚资源的场景。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_Direction_2Lines_FullDuplex |
0x0000 |
全双工模式,使用独立的 MISO 和 MOSI 引脚 |
SPI_Direction_2Lines_RxOnly |
0x0400 |
仅接收模式,MOSI 引脚禁用,仅使用 MISO |
SPI_Direction_1Line_Rx |
0x8000 |
单线接收模式,仅使用一根数据线(MISO),发送被禁用 |
SPI_Direction_1Line_Tx |
0xC000 |
单线发送模式,仅使用一根数据线(MOSI),接收被禁用 |
SPI_Direction_Rx |
0xBFFF |
用于 SPI_BiDirectionalLineConfig(),切换至接收方向(清除发送位) |
SPI_Direction_Tx |
0x4000 |
用于 SPI_BiDirectionalLineConfig(),切换至发送方向(设置发送位) |
以上所有值都强制转换为
uint16_t
SPI_mode
#
配置 SPI 工作模式为主机或从机。
主模式下由 SPI 控制时钟(SCK),从模式下时钟由外部主机提供。从模式下若需主动发送数据,必须确保 SPI_CPOL=1 以匹配主机时钟极性。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_Mode_Master |
0x0104 |
主机模式,主动产生时钟 |
SPI_Mode_Slave |
0x0000 |
从机模式,被动响应时钟 |
以上所有值都强制转换为
uint16_t
SPI_data_size
#
设置每次传输的数据帧大小。
CH32V00x 的 SPI 支持 8 位和 16 位两种帧格式,16 位模式下可一次传输两个字节,提高吞吐率,但需确保外设兼容。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_DataSize_16b |
0x0800 |
16 位数据帧格式 |
SPI_DataSize_8b |
0x0000 |
8 位数据帧格式(默认) |
以上所有值都强制转换为
uint16_t
SPI_Clock_Polarity
#
设置 SPI 时钟的稳态电平(CPOL)。
CPOL=0 表示空闲时钟为低电平,CPOL=1 表示空闲时钟为高电平。在从模式下发送数据时,必须与主机的 CPOL 一致,否则通信失败。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_CPOL_Low |
0x0000 |
时钟空闲时为低电平 |
SPI_CPOL_High |
0x0002 |
时钟空闲时为高电平(从模式发送数据时必须设置) |
以上所有值都强制转换为
uint16_t
SPI_Clock_Phase
#
设置时钟相位(CPHA),决定数据采样发生在时钟的第几个边沿。
CPHA=0:第一个时钟边沿采样;CPHA=1:第二个时钟边沿采样。必须与主机配置一致。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_CPHA_1Edge |
0x0000 |
在时钟第一个边沿采样数据 |
SPI_CPHA_2Edge |
0x0001 |
在时钟第二个边沿采样数据 |
以上所有值都强制转换为
uint16_t
SPI_Slave_Select_management
#
配置 NSS(从机选择)信号的管理方式。
硬件管理由芯片自动控制 NSS 引脚,软件管理通过 SPI_NSSInternalSoftwareConfig() 手动控制 SSI 位,适用于多从机或无物理 NSS 引脚的场景。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_NSS_Soft |
0x0200 |
软件管理 NSS,使用 SSI 位控制 |
SPI_NSS_Hard |
0x0000 |
硬件管理 NSS,使用外部引脚 |
以上所有值都强制转换为
uint16_t
SPI_BaudRate_Prescaler
#
设置 SPI 时钟分频系数,决定 SCK 频率。
SCK = PCLK / (prescaler),主模式下有效。从模式下时钟由主机决定,此参数仅影响发送速率。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_BaudRatePrescaler_2 |
0x0000 |
分频系数为 2 |
SPI_BaudRatePrescaler_4 |
0x0008 |
分频系数为 4 |
SPI_BaudRatePrescaler_8 |
0x0010 |
分频系数为 8 |
SPI_BaudRatePrescaler_16 |
0x0018 |
分频系数为 16 |
SPI_BaudRatePrescaler_32 |
0x0020 |
分频系数为 32 |
SPI_BaudRatePrescaler_64 |
0x0028 |
分频系数为 64 |
SPI_BaudRatePrescaler_128 |
0x0030 |
分频系数为 128 |
SPI_BaudRatePrescaler_256 |
0x0038 |
分频系数为 256 |
以上所有值都强制转换为
uint16_t
SPI_MSB_LSB transmission
#
设置数据传输的起始位顺序。
注意:SPI_FirstBit_LSB 在从模式下不被支持,仅在主模式下可用。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_FirstBit_MSB |
0x0000 |
先发送最高位(MSB) |
SPI_FirstBit_LSB |
0x0080 |
先发送最低位(LSB),仅主模式支持 |
以上所有值都强制转换为
uint16_t
SPI_I2S_DMA_transfer_requests
#
配置 SPI 的 DMA 请求使能,用于高速数据传输。
DMA 可在后台自动完成数据收发,避免 CPU 轮询,提高系统效率。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_I2S_DMAReq_Tx |
0x0002 |
使能发送 DMA 请求 |
SPI_I2S_DMAReq_Rx |
0x0001 |
使能接收 DMA 请求 |
以上所有值都强制转换为
uint16_t
SPI_NSS_internal_software_management
#
软件控制 NSS 信号的内部状态(SSI 位)。
仅在 SPI_NSS_Soft 模式下有效,用于模拟从机选择信号。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_NSSInternalSoft_Set |
0x0100 |
将内部 NSS 信号置为低电平(选中从机) |
SPI_NSSInternalSoft_Reset |
0xFEFF |
将内部 NSS 信号置为高电平(取消选中) |
以上所有值都强制转换为
uint16_t
SPI_CRC_Transmit_Receive
#
指定读取 CRC 寄存器的类型(发送或接收)。
用于调试或校验 CRC 值,配合 SPI_GetCRC() 使用。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_CRC_Tx |
0x00 |
读取发送 CRC 寄存器(TCRCR) |
SPI_CRC_Rx |
0x01 |
读取接收 CRC 寄存器(RCRCR) |
以上所有值都强制转换为
uint8_t
SPI_direction_transmit_receive
#
用于 SPI_BiDirectionalLineConfig() 的方向控制掩码,与 SPI_Direction_Tx/Rx 一致。
在半双工模式下,通过此常量切换数据线方向,实现单线双向通信。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_Direction_Rx |
0xBFFF |
设置为接收方向(清除发送位) |
SPI_Direction_Tx |
0x4000 |
设置为发送方向(设置发送位) |
以上所有值都强制转换为
uint16_t
SPI_I2S_interrupts_definition
#
SPI/I2S 中断标志位定义,用于 SPI_I2S_ITConfig() 和 SPI_I2S_GetITStatus()。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_I2S_IT_TXE |
0x71 |
发送缓冲区空中断 |
SPI_I2S_IT_RXNE |
0x60 |
接收缓冲区非空中断 |
SPI_I2S_IT_ERR |
0x50 |
错误中断(包含 OVR、CRCERR、MODF) |
SPI_I2S_IT_OVR |
0x56 |
溢出中断(接收缓冲区被覆盖) |
SPI_IT_MODF |
0x55 |
模式故障中断(主机/从机模式冲突) |
SPI_IT_CRCERR |
0x54 |
CRC 校验错误中断 |
I2S_IT_UDR |
0x53 |
I2S 下溢中断(仅在 I2S 模式下有效) |
以上所有值都强制转换为
uint8_t
SPI_I2S_flags_definition
#
SPI/I2S 状态标志位定义,用于 SPI_I2S_GetFlagStatus()。
| 名称 | 值 | 简述 |
|---|---|---|
SPI_I2S_FLAG_RXNE |
0x0001 |
接收缓冲区非空 |
SPI_I2S_FLAG_TXE |
0x0002 |
发送缓冲区空 |
I2S_FLAG_CHSIDE |
0x0004 |
I2S 通道侧标志(左/右声道) |
I2S_FLAG_UDR |
0x0008 |
I2S 下溢标志 |
SPI_FLAG_CRCERR |
0x0010 |
CRC 校验错误 |
SPI_FLAG_MODF |
0x0020 |
模式故障标志 |
SPI_I2S_FLAG_OVR |
0x0040 |
接收溢出标志 |
SPI_I2S_FLAG_BSY |
0x0080 |
SPI 忙状态标志(传输中) |
以上所有值都强制转换为
uint16_t
枚举 #
无
结构体 #
SPI_InitTypeDef
#
SPI 初始化结构体,用于配置 SPI 外设的所有工作参数。
该结构体在 SPI_Init() 中被读取并写入 SPI 控制寄存器,SPI_StructInit() 会将其所有成员初始化为默认值。
| 名称 | 类型 | 简述 |
|---|---|---|
SPI_Direction |
uint16_t |
指定数据传输方向,如全双工、单线发送等 |
SPI_Mode |
uint16_t |
指定主/从模式 |
SPI_DataSize |
uint16_t |
指定数据帧大小(8位或16位) |
SPI_CPOL |
uint16_t |
指定时钟极性(空闲电平) |
SPI_CPHA |
uint16_t |
指定时钟相位(采样边沿) |
SPI_NSS |
uint16_t |
指定 NSS 管理方式(硬件或软件) |
SPI_BaudRatePrescaler |
uint16_t |
指定时钟分频系数,控制 SCK 频率 |
SPI_FirstBit |
uint16_t |
指定数据传输起始位(MSB 或 LSB) |
SPI_CRCPolynomial |
uint16_t |
指定 CRC 计算使用的多项式(默认为 7) |
函数 #
SPI_I2S_DeInit
#
void SPI_I2S_DeInit(SPI_TypeDef *SPIx)
将指定的 SPI 外设寄存器恢复为复位默认值。通过复位 APB2 总线上的 SPI 时钟实现,确保寄存器状态完全清除。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
返回值:
无
SPI_Init
#
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct)
根据传入的初始化结构体配置 SPI 外设。该函数会将结构体中的所有参数写入 SPI 控制寄存器(CTLR1 和 CRCR),并自动启用 SPI。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_InitStruct |
SPI_InitTypeDef * |
指向包含配置参数的结构体指针 |
返回值:
无
注意:在从模式下发送数据时,必须确保
SPI_CPOL=1,否则通信将失败。
SPI_StructInit
#
void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct)
将 SPI_InitTypeDef 结构体的所有成员初始化为默认值,便于用户按需修改。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPI_InitStruct |
SPI_InitTypeDef * |
指向待初始化的结构体指针 |
返回值:
无
默认配置:全双工、从模式、8位数据、CPOL=0、CPHA=0、分频=2、MSB 优先、CRC 多项式=7。
SPI_Cmd
#
void SPI_Cmd(SPI_TypeDef *SPIx, FunctionalState NewState)
启用或禁用 SPI 外设。通过设置或清除 CTLR1 寄存器中的 SPE 位实现。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
SPI_I2S_ITConfig
#
void SPI_I2S_ITConfig(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState)
启用或禁用指定的 SPI 中断源。通过设置或清除 CTLR2 寄存器中的对应中断使能位实现。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_IT |
uint8_t |
中断源,如 SPI_I2S_IT_TXE、SPI_I2S_IT_RXNE 等 |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
SPI_I2S_DMACmd
#
void SPI_I2S_DMACmd(SPI_TypeDef *SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState)
启用或禁用 SPI 的 DMA 传输请求。DMA 可在后台自动收发数据,减轻 CPU 负担。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_DMAReq |
uint16_t |
DMA 请求类型:SPI_I2S_DMAReq_Tx 或 SPI_I2S_DMAReq_Rx |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
SPI_I2S_SendData
#
void SPI_I2S_SendData(SPI_TypeDef *SPIx, uint16_t Data)
向 SPI 数据寄存器写入待发送数据,触发一次传输。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
Data |
uint16_t |
要发送的数据(8位或16位,取决于 SPI_DataSize) |
返回值:
无
SPI_I2S_ReceiveData
#
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef *SPIx)
读取 SPI 数据寄存器中的最近接收数据。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
返回值:
uint16_t:接收到的数据值(8位或16位,取决于配置)
SPI_NSSInternalSoftwareConfig
#
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef *SPIx, uint16_t SPI_NSSInternalSoft)
在软件管理 NSS 模式下,通过 SSI 位手动控制从机选择信号。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_NSSInternalSoft |
uint16_t |
SPI_NSSInternalSoft_Set(选中)或 SPI_NSSInternalSoft_Reset(取消) |
返回值:
无
SPI_SSOutputCmd
#
void SPI_SSOutputCmd(SPI_TypeDef *SPIx, FunctionalState NewState)
启用或禁用 SPI 主模式下的 SS(从机选择)输出引脚。仅在主模式下有效。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
SPI_DataSizeConfig
#
void SPI_DataSizeConfig(SPI_TypeDef *SPIx, uint16_t SPI_DataSize)
动态修改 SPI 数据帧大小(8位或16位),无需重新初始化整个外设。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_DataSize |
uint16_t |
SPI_DataSize_8b 或 SPI_DataSize_16b |
返回值:
无
SPI_TransmitCRC
#
void SPI_TransmitCRC(SPI_TypeDef *SPIx)
在下一次传输中自动发送 CRC 校验值。需先启用 CRC 计算(SPI_CalculateCRC())。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
返回值:
无
SPI_CalculateCRC
#
void SPI_CalculateCRC(SPI_TypeDef *SPIx, FunctionalState NewState)
启用或禁用 SPI 在传输过程中自动计算 CRC 校验值。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
NewState |
FunctionalState |
ENABLE 或 DISABLE |
返回值:
无
SPI_GetCRC
#
uint16_t SPI_GetCRC(SPI_TypeDef *SPIx, uint8_t SPI_CRC)
读取 SPI 的发送或接收 CRC 寄存器值,用于校验或调试。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_CRC |
uint8_t |
SPI_CRC_Tx(发送 CRC)或 SPI_CRC_Rx(接收 CRC) |
返回值:
uint16_t:CRC 寄存器的当前值
SPI_GetCRCPolynomial
#
uint16_t SPI_GetCRCPolynomial(SPI_TypeDef *SPIx)
读取 SPI 的 CRC 多项式寄存器值,用于验证配置是否正确。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
返回值:
uint16_t:CRC 多项式值(默认为 7)
SPI_BiDirectionalLineConfig
#
void SPI_BiDirectionalLineConfig(SPI_TypeDef *SPIx, uint16_t SPI_Direction)
在单线半双工模式下切换数据线方向(发送或接收)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_Direction |
uint16_t |
SPI_Direction_Tx 或 SPI_Direction_Rx |
返回值:
无
注意:仅在
SPI_Direction_1Line_Rx或SPI_Direction_1Line_Tx模式下有效。
SPI_I2S_GetFlagStatus
#
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG)
检查指定的 SPI 状态标志是否被置位。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_FLAG |
uint16_t |
标志位,如 SPI_I2S_FLAG_RXNE、SPI_I2S_FLAG_BSY 等 |
返回值:
FlagStatus:SET(标志置位)或 RESET(标志未置位)
SPI_I2S_ClearFlag
#
void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG)
清除指定的 SPI 状态标志。
注意:
OVR和MODF标志需特殊清除序列,详见函数注释。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_FLAG |
uint16_t |
要清除的标志,如 SPI_FLAG_CRCERR |
返回值:
无
SPI_I2S_GetITStatus
#
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT)
检查指定的 SPI 中断是否发生(中断标志 + 中断使能位)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_IT |
uint8_t |
中断源,如 SPI_I2S_IT_RXNE、SPI_IT_CRCERR 等 |
返回值:
ITStatus:SET(中断发生)或 RESET(未发生)
SPI_I2S_ClearITPendingBit
#
void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT)
清除指定的 SPI 中断挂起位。
注意:
OVR、MODF、UDR等中断需配合读取寄存器才能清除,详见注释。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
SPIx |
SPI_TypeDef * |
选择 SPI 外设,仅支持 SPI1 |
SPI_I2S_IT |
uint8_t |
要清除的中断,如 SPI_IT_CRCERR |
返回值:
无