注意事项:
条件编译USE_HAL_SPI_REGISTER_CALLBACKS用来设置使用自定义回调还是使用默认回调,此定义一般放在stm32h7xx_hal_conf.h文件里面设置:
#define USE_HAL_SPI_REGISTER_CALLBACKS 1
通过函数HAL_SPI_RegisterCallback注册回调,取消注册使用函数HAL_SPI_UnRegisterCallback。
这里重点介绍下面几个参数,其它参数主要是HAL库内部使用和自定义回调函数。
SPI_TypeDef *Instance
这个参数是寄存器的例化,方便操作寄存器,比如使能SPI1。
SET_BIT(SPI1 ->CR1, SPI_CR1_SPE)。
SPI_InitTypeDef Init
这个参数是用户接触最多的,在本章节3.2小节已经进行了详细说明。
DMA_HandleTypeDef *hdmatx
DMA_HandleTypeDef *hdmarx
用于SPI句柄关联DMA句柄,方便操作调用。
72.4 SPI总线源文件stm32h7xx_hal_spi.c
此文件涉及到的函数较多,这里把几个常用的函数做个说明:
HAL_SPI_Init
HAL_SPI_DeInit
HAL_SPI_TransmitReceive
HAL_SPI_TransmitReceive_IT
HAL_SPI_TransmitReceive_DMA
72.4.1 函数HAL_SPI_Init
函数原型:
- HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi)
- {
- uint32_t crc_length = 0UL;
- uint32_t packet_length;
- /* 省略未写 */
- /* 如果数据位宽大于16bit,必须是SPI1,SPI2或者SPI3,而SPI4,SPI5和SPI6不支持大于16bit */
- if ((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (hspi->Init.DataSize > SPI_DATASIZE_16BIT))
- {
- return HAL_ERROR;
- }
- /* SPI1,SPI2和SPI3的FIFO大小是16*8bit,而SPI4,SPI5和SPI6的FIFO大小是8*8bit
- 这里是查看设置的缓冲大小是否超出了FIFO支持的大小。
- */
- packet_length = SPI_GetPacketSize(hspi);
- if (((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (packet_length > SPI_LOWEND_FIFO_SIZE)) ||
- ((IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (packet_length > SPI_HIGHEND_FIFO_SIZE)))
- {
- return HAL_ERROR;
- }
- #if (USE_SPI_CRC != 0UL)
- /* 省略未写 */
- #endif
- if (hspi->State == HAL_SPI_STATE_RESET)
- {
- /* 解锁 */
- hspi->Lock = HAL_UNLOCKED;
- /* 使用自定义回调 */
- #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1UL)
- /* 设置默认回调函数 */
- hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback */
- hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback */
- hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback */
- hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */
- hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */
- hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback */
- hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback */
- hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback */
- if (hspi->MspInitCallback == NULL)
- {
- hspi->MspInitCallback = HAL_SPI_MspInit;
- }
- /* 初始化地址硬件: GPIO, CLOCK, NVIC... */
- hspi->MspInitCallback(hspi);
- #else
- /* 初始化底层硬件: GPIO, CLOCK, NVIC... */
- HAL_SPI_MspInit(hspi);
- #endif
- }
- hspi->State = HAL_SPI_STATE_BUSY;
- /* 禁止SPI外设 */
- __HAL_SPI_DISABLE(hspi);
- /*----------------------- SPIx CR1 & CR2 配置---------------------*/
- if ((hspi->Init.NSS == SPI_NSS_SOFT) && (hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.NSSPolarity ==
- SPI_NSS_POLARITY_LOW))
- {
- SET_BIT(hspi->Instance->CR1, SPI_CR1_SSI);
- }
- /* SPIx CFG1配置 */
- WRITE_REG(hspi->Instance->CFG1, (hspi->Init.BaudRatePrescaler | hspi->Init.CRCCalculation | crc_length |
- hspi->Init.FifoThreshold | hspi->Init.DataSize));
- /* SPIx CFG2配置 */
- WRITE_REG(hspi->Instance->CFG2, (hspi->Init.NSSPMode | hspi->Init.TIMode | hspi->Init.NSSPolarity |
- hspi->Init.NSS | hspi->Init.CLKPolarity | hspi->Init.CLKPhase |
- hspi->Init.FirstBit | hspi->Init.Mode | hspi->Init.MasterInterDataIdleness |
- hspi->Init.Direction | hspi->Init.MasterSSIdleness | hspi->Init.IOSwap));
- #if (USE_SPI_CRC != 0UL)
- /*---------------------------- SPIx CRC配置 ------------------*/
- /* 配置SPI CRC */
- if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)
- {
- /* 初始化TX CRC初始值 */
- if (hspi->Init.TxCRCInitializationPattern == SPI_CRC_INITIALIZATION_ALL_ONE_PATTERN)
- {
- SET_BIT(hspi->Instance->CR1, SPI_CR1_TCRCINI);
- }
- else
- {
- CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_TCRCINI);
- }
- /* 初始化RXCRC初始值 */
- if (hspi->Init.RxCRCInitializationPattern == SPI_CRC_INITIALIZATION_ALL_ONE_PATTERN)
- {
- SET_BIT(hspi->Instance->CR1, SPI_CR1_RCRCINI);
- }
- else
- {
- CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_RCRCINI);
- }
- /* 使能 33/17 bit CRC计算 */
- if (((!IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (crc_length == SPI_CRC_LENGTH_16BIT)) ||
- ((IS_SPI_HIGHEND_INSTANCE(hspi->Instance)) && (crc_length == SPI_CRC_LENGTH_32BIT)))
- {
- SET_BIT(hspi->Instance->CR1, SPI_CR1_CRC33_17);
- }
- else
- {
- CLEAR_BIT(hspi->Instance->CR1, SPI_CR1_CRC33_17);
- }
- /* 写CRC多项式到SPI寄存器 */
- WRITE_REG(hspi->Instance->CRCPOLY, hspi->Init.CRCPolynomial);
- }
- #endif
- /* SPI从模式,下溢配置 */
- if (hspi->Init.Mode == SPI_MODE_SLAVE)
- {
- /* 设置默认下溢配置 */
- #if (USE_SPI_CRC != 0UL)
- if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_DISABLE)
- #endif
- {
- MODIFY_REG(hspi->Instance->CFG1, SPI_CFG1_UDRDET, SPI_CFG1_UDRDET_0);
- }
- MODIFY_REG(hspi->Instance->CFG1, SPI_CFG1_UDRCFG, SPI_CFG1_UDRCFG_1);
- }
- #if defined(SPI_I2SCFGR_I2SMOD)
- CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD);
- #endif
- /* 确保AFCNTR bit由SPI主机模式管理 */
- if ((hspi->Init.Mode & SPI_MODE_MASTER) == SPI_MODE_MASTER)
- {
- /* Alternate function GPIOs control */
- MODIFY_REG(hspi->Instance->CFG2, SPI_CFG2_AFCNTR, (hspi->Init.MasterKeepIOState));
- }
- hspi->ErrorCode = HAL_SPI_ERROR_NONE;
- hspi->State = HAL_SPI_STATE_READY;
- return HAL_OK;
- }
复制代码
|