|
STM32G474xx HAL 用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal_spi.c 00004 * @author MCD Application Team 00005 * @brief SPI HAL模块驱动程序。 00006 * 此文件提供固件函数,用于管理串行外设接口 (SPI) 外设的以下功能: 00007 * + 初始化和反初始化函数 00008 * + IO操作函数 00009 * + 外设控制函数 00010 * + 外设状态函数 00011 ****************************************************************************** 00012 * @attention 00013 * 00014 * 版权所有 (c) 2019 STMicroelectronics。 00015 * 保留所有权利。 00016 * 00017 * 本软件受可在本软件组件根目录下的 LICENSE 文件中找到的条款约束。 00018 * 如果本软件未附带 LICENSE 文件,则按原样提供。 00019 * 00020 ****************************************************************************** 00021 @verbatim 00022 ============================================================================== 00023 ##### 如何使用此驱动程序 ##### 00024 ============================================================================== 00025 [..] 00026 SPI HAL驱动程序可按如下方式使用: 00027 00028 (#) 声明一个 SPI_HandleTypeDef 句柄结构体,例如: 00029 SPI_HandleTypeDef hspi; 00030 00031 (#) 通过实现 HAL_SPI_MspInit() API 来初始化 SPI 底层资源: 00032 (##) 使能 SPIx 接口时钟 00033 (##) SPI 引脚配置 00034 (+++) 使能 SPI GPIO 的时钟 00035 (+++) 将这些 SPI 引脚配置为复用功能推挽输出 00036 (##) 如果需要使用中断处理,则进行 NVIC 配置 00037 (+++) 配置 SPIx 中断优先级 00038 (+++) 使能 NVIC SPI IRQ 处理 00039 (##) 如果需要使用 DMA 处理,则进行 DMA 配置 00040 (+++) 为发送或接收流/通道声明一个 DMA_HandleTypeDef 句柄结构体 00041 (+++) 使能 DMAx 时钟 00042 (+++) 配置 DMA 句柄参数 00043 (+++) 配置 DMA Tx 或 Rx 流/通道 00044 (+++) 将初始化好的 hdma_tx(或 _rx)句柄关联到 hspi DMA Tx 或 Rx 句柄 00045 (+++) 配置 DMA Tx 或 Rx 流/通道的传输完成中断的优先级并使能 NVIC 00046 00047 (#) 在 hspi Init 结构体中编程模式、双向模式、数据大小、波特率预分频器、NSS 00048 管理、时钟极性和相位、FirstBit 和 CRC 配置。 00049 00050 (#) 通过调用 HAL_SPI_Init() API 来初始化 SPI 寄存器: 00051 (++) 此 API 还通过调用定制的 HAL_SPI_MspInit() API 来配置底层硬件 GPIO、CLOCK、CORTEX...等。 00052 [..] 00053 循环模式限制: 00054 (#) 当 SPI 配置为以下模式时,不能使用 DMA 循环模式: 00055 (##) 主机 2线 仅接收 00056 (##) 主机 1线 接收 00057 (#) 当使能 DMA 循环模式时,不管理 CRC 功能 00058 (#) 当使用 SPI DMA 暂停/停止功能时,必须仅在 SPI 回调函数中使用以下 API 00059 HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() 00060 [..] 00061 主机接收模式限制: 00062 (#) 在主机单向仅接收模式 (MSTR =1, BIDIMODE=0, RXONLY=1) 或 00063 双向接收模式 (MSTR=1, BIDIMODE=1, BIDIOE=0) 下,为确保 SPI 00064 不启动新的传输,必须遵守以下步骤: 00065 (##) HAL_SPI_DeInit() 00066 (##) HAL_SPI_Init() 00067 [..] 00068 回调注册: 00069 00070 (#) 编译标志 USE_HAL_SPI_REGISTER_CALLBACKS 设置为 1U 时, 00071 允许用户动态配置驱动程序回调。 00072 使用函数 HAL_SPI_RegisterCallback() 来注册中断回调。 00073 00074 函数 HAL_SPI_RegisterCallback() 允许注册以下回调: 00075 (++) TxCpltCallback : SPI 发送完成回调 00076 (++) RxCpltCallback : SPI 接收完成回调 00077 (++) TxRxCpltCallback : SPI 发送接收完成回调 00078 (++) TxHalfCpltCallback : SPI 发送半完成回调 00079 (++) RxHalfCpltCallback : SPI 接收半完成回调 00080 (++) TxRxHalfCpltCallback : SPI 发送接收半完成回调 00081 (++) ErrorCallback : SPI 错误回调 00082 (++) AbortCpltCallback : SPI 中止完成回调 00083 (++) MspInitCallback : SPI Msp 初始化回调 00084 (++) MspDeInitCallback : SPI Msp 反初始化回调 00085 此函数接受 HAL 外设句柄、回调 ID 00086 和指向用户回调函数的指针作为参数。 00087 00088 00089 (#) 使用函数 HAL_SPI_UnRegisterCallback 将回调重置为默认的 00090 弱函数。 00091 HAL_SPI_UnRegisterCallback 接受 HAL 外设句柄、 00092 和回调 ID 作为参数。 00093 此函数允许重置以下回调: 00094 (++) TxCpltCallback : SPI 发送完成回调 00095 (++) RxCpltCallback : SPI 接收完成回调 00096 (++) TxRxCpltCallback : SPI 发送接收完成回调 00097 (++) TxHalfCpltCallback : SPI 发送半完成回调 00098 (++) RxHalfCpltCallback : SPI 接收半完成回调 00099 (++) TxRxHalfCpltCallback : SPI 发送接收半完成回调 00100 (++) ErrorCallback : SPI 错误回调 00101 (++) AbortCpltCallback : SPI 中止完成回调 00102 (++) MspInitCallback : SPI Msp 初始化回调 00103 (++) MspDeInitCallback : SPI Msp 反初始化回调 00104 00105 [..] 00106 默认情况下,在 HAL_SPI_Init() 之后且状态为 HAL_SPI_STATE_RESET 时, 00107 所有回调都设置为相应的弱函数: 00108 例如 HAL_SPI_MasterTxCpltCallback()、HAL_SPI_MasterRxCpltCallback()。 00109 MspInit 和 MspDeInit 函数的例外情况是,仅在这些回调为 null(未预先注册)时, 00110 才在 HAL_SPI_Init()/ HAL_SPI_DeInit() 中重置为传统的弱函数。 00111 如果 MspInit 或 MspDeInit 不为 null,则无论状态如何, 00112 HAL_SPI_Init()/ HAL_SPI_DeInit() 都会保留并使用用户 MspInit/MspDeInit 回调(预先注册)。 00113 00114 [..] 00115 回调只能在 HAL_SPI_STATE_READY 状态下注册/注销。 00116 MspInit/MspDeInit 函数的例外情况是,可以在 HAL_SPI_STATE_READY 或 HAL_SPI_STATE_RESET 状态下注册/注销, 00117 因此注册的(用户)MspInit/DeInit 回调可以在初始化/反初始化期间使用。 00118 然后,用户首先使用 HAL_SPI_RegisterCallback() 注册 MspInit/MspDeInit 用户回调, 00119 然后再调用 HAL_SPI_DeInit() 或 HAL_SPI_Init() 函数。 00120 00121 [..] 00122 当编译定义 USE_HAL_PPP_REGISTER_CALLBACKS 设置为 0 或 00123 未定义时,回调注册功能不可用, 00124 并使用弱(重载)回调。 00125 00126 [..] 00127 使用 HAL 无法在不同 SPI 模式下达到所有支持的 SPI 频率, 00128 下表总结了在数据大小为 8 位/16 位时达到的最大 SPI 频率, 00129 取决于 SPI 实例使用的 APBx 外设时钟频率 (fPCLK)。 00130 00131 @endverbatim 00132 00133 附加表格: 00134 00135 DataSize = SPI_DATASIZE_8BIT: 00136 +----------------------------------------------------------------------------------------------+ 00137 | | | 2线全双工 | 2线仅接收 | 1线 | 00138 | 过程 | 传输模式 |---------------------|----------------------|----------------------| 00139 | | | 主机 | 从机 | 主机 | 从机 | 主机 | 从机 | 00140 |==============================================================================================| 00141 | T | 轮询 | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | 00142 | X |----------------|----------|----------|-----------|----------|-----------|----------| 00143 | / | 中断 | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | 00144 | R |----------------|----------|----------|-----------|----------|-----------|----------| 00145 | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | 00146 |=========|================|==========|==========|===========|==========|===========|==========| 00147 | | 轮询 | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | 00148 | |----------------|----------|----------|-----------|----------|-----------|----------| 00149 | R | 中断 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 | 00150 | X |----------------|----------|----------|-----------|----------|-----------|----------| 00151 | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 | 00152 |=========|================|==========|==========|===========|==========|===========|==========| 00153 | | 轮询 | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 | 00154 | |----------------|----------|----------|-----------|----------|-----------|----------| 00155 | T | 中断 | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 | 00156 | X |----------------|----------|----------|-----------|----------|-----------|----------| 00157 | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 | 00158 +----------------------------------------------------------------------------------------------+ 00159 00160 DataSize = SPI_DATASIZE_16BIT: 00161 +----------------------------------------------------------------------------------------------+ 00162 | | | 2线全双工 | 2线仅接收 | 1线 | 00163 | 过程 | 传输模式 |---------------------|----------------------|----------------------| 00164 | | | 主机 | 从机 | 主机 | 从机 | 主机 | 从机 | 00165 |==============================================================================================| 00166 | T | 轮询 | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | 00167 | X |----------------|----------|----------|-----------|----------|-----------|----------| 00168 | / | 中断 | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | 00169 | R |----------------|----------|----------|-----------|----------|-----------|----------| 00170 | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | 00171