stm32的SPI发送和接收与hal库SPI阻塞问题

一、stm32的SPI发送和接收原理

在这里插入图片描述
The data register is split(分开) into 2 buffers - one for writing (Transmit Buffer) and another one for reading (Receive buffer). A write to the data register will write into the Tx buffer and a read from the data register will return the value held in the Rx buffer.理解最后一句话需要看stm32的电路结构。
在这里插入图片描述

SPI寄存器有16位,其中8位用于读操作,另8位用于写操作。往DR寄存器写数据,该数据将被装载到图上所示的TX缓冲区,在缓存区中的数据将通过MOSI引脚发射出去;相反的,如果读取DR寄存器,RX缓冲区中的数据将返回给程序员用于处理,RX缓冲区中的数据来自MISO引脚。

二、hal库函数SPI阻塞

2.1 涉及到的函数

HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)

2.2 解释

HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size,uint32_t Timeout)函数发送Size大小的数据并且需要接收到Size大小的数据才会结束,否则阻塞在while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U))这个位置,直到接收计数值等于0,此时代表接收了SIZE大小的数据,在此之前,后续程序无法被执行,而是等待SPI接收数据完成。

猜你喜欢

转载自blog.csdn.net/weixin_43810563/article/details/111028826