跳过正文

ch32v00x_spi.h

目录
Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 16: 本文

描述
#

该文件包含 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 ENABLEDISABLE

返回值:

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_TXESPI_I2S_IT_RXNE
NewState FunctionalState ENABLEDISABLE

返回值:

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_TxSPI_I2S_DMAReq_Rx
NewState FunctionalState ENABLEDISABLE

返回值:

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 ENABLEDISABLE

返回值:

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_8bSPI_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 ENABLEDISABLE

返回值:

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_TxSPI_Direction_Rx

返回值:

注意:仅在 SPI_Direction_1Line_RxSPI_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_RXNESPI_I2S_FLAG_BSY

返回值:
FlagStatusSET(标志置位)或 RESET(标志未置位)

SPI_I2S_ClearFlag
#

void SPI_I2S_ClearFlag(SPI_TypeDef *SPIx, uint16_t SPI_I2S_FLAG)
清除指定的 SPI 状态标志。

注意:OVRMODF 标志需特殊清除序列,详见函数注释。

参数:

名称 类型 简述
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_RXNESPI_IT_CRCERR

返回值:
ITStatusSET(中断发生)或 RESET(未发生)

SPI_I2S_ClearITPendingBit
#

void SPI_I2S_ClearITPendingBit(SPI_TypeDef *SPIx, uint8_t SPI_I2S_IT)
清除指定的 SPI 中断挂起位。

注意:OVRMODFUDR 等中断需配合读取寄存器才能清除,详见注释。

参数:

名称 类型 简述
SPIx SPI_TypeDef * 选择 SPI 外设,仅支持 SPI1
SPI_I2S_IT uint8_t 要清除的中断,如 SPI_IT_CRCERR

返回值:

Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 16: 本文

相关文章

ch32v00x.h

该文件是 CH32V003 微控制器的外设访问层头文件,定义了所有外设寄存器的内存映射、位域常量、中断向量、时钟配置、GPIO 控制结构及系统级常量。它为标准外设库提供底层硬件抽象,使开发者可通过结构体指针直接访问寄存器,或通过位掩码配置外设功能。本文件不包含函数原型,仅提供寄存器定义与常量,是所有外设驱动开发的基础。

ch32v00x_adc.h

该文件定义了 CH32V00x 系列微控制器 ADC 外设的固件库所有函数原型、常量、枚举和结构体。ADC(模数转换器)支持单通道与多通道扫描转换、注入通道、模拟看门狗、DMA 请求、软件与外部触发等多种模式,适用于高精度模拟信号采集场景。本库通过寄存器掩码操作实现灵活配置,所有常量均以 uint32_t 或 uint8_t 类型定义,确保与硬件寄存器位域精确匹配。函数设计遵循标准外设库风格,支持初始化、启动、中断、校准、偏移设置等完整功能链,适用于工业控制、传感器接口、电源管理等嵌入式应用。

ch32v00x_dma.h

该文件定义了 CH32V00x 系列微控制器 DMA(直接存储器访问)外设的固件库函数原型、数据结构及常量宏。DMA 用于在不占用 CPU 资源的情况下实现外设与内存、内存与内存之间的高效数据传输,适用于高速数据采集、串口/ADC 缓冲、图像处理等场景。本库支持 7 个 DMA 通道,每个通道可独立配置传输方向、数据宽度、地址递增模式、优先级和循环模式,极大提升系统并发处理能力。