文章

SPI接口HAL库函数转寄存器

直接使用HAL库的函数为:

1
2
3
4
5
6
7
8
9
10
11
12
/**
  * @brief  Transmit and Receive an amount of data in blocking mode.
  * @param  hspi pointer to a SPI_HandleTypeDef structure that contains
  *               the configuration information for SPI module.
  * @param  pTxData pointer to transmission data buffer
  * @param  pRxData pointer to reception data buffer
  * @param  Size amount of data to be sent and received
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,
                                          uint32_t Timeout)

如果使用大量的数据一次性发送还好,如果调用这个系统函数只发送1个字节的数据对于通信速度来说就有点慢了。

如果只发送1个字节的数据使用寄存器的方式来发送就会快一些,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
uint8_t SPI_WriteByte(SPI_HandleTypeDef *hspi, uint8_t byte)
{
    /* Check if the SPI is already enabled */
    if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE)
    {
        /* Enable SPI peripheral */
        __HAL_SPI_ENABLE(hspi);
    }

    while (!__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE))
        ;                      /* 等待发送区空 */ 
    hspi->Instance->DR = byte; /* 发送一个byte */ 
    while (!__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE))
        ;                      /* 等待接收完一个byte */ 
    return hspi->Instance->DR; /* 返回收到的数据 */ 
}

这里需要开启SPI的使能,因为HAL库在初始化SPI的时候并没有直接使能SPI接口。

如果这里没有使能会导致数据发送异常,卡死,当然,也可以在初始化的时候进行SPI的使能。

本文由作者按照 CC BY 4.0 进行授权