STM32 SPI作为从机收发数据

本文验证STM32单片机SPI从机的收发功能,记录过程中遇到的问题。
使用STM32F429的SPI1作为主机,使用STM32F103的SPI1作为从机,二者SPI的配置如下:
STM32 SPI作为从机收发数据_第1张图片
STM32 SPI作为从机收发数据_第2张图片

从机使用HAL库的接收完成中断进行接收数据

主机片选从机后一次发送四个字节


static uint8_t SPI1_TxData[5] = {0x88,0x77,0x66,0x55};
static uint8_t SPI1_RxData[5] = {0};

while (1)
{
	CLR_SPI1_CS;
	HAL_SPI_TransmitReceive(&hspi1,SPI1_TxData,SPI1_RxData,4,100);
	SET_SPI1_CS;
	HAL_Delay(1000);
}

从机开启1字节接收完成中断

HAL_SPI_Receive_IT(&hspi1,&SPI1_RxData[0],1);

接收完成中断回调函数中再次开启1字节中断,同时设置一个IO口进行翻转,方便使用示波器观察进入中断的情况

void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
	static uint32_t i = 1;
	if(hspi == &hspi1)
	{
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
		HAL_SPI_Receive_IT(&hspi1,&SPI1_RxData[i%4],1);
		HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
		i++;
	}
}

我们期望的实验现象是:从机能够进入4次中断,接收到主机发送的四个字节即0x88,0x77,0x66,0x55,实际的现象只交替收到了两个字节0x88和0x66
STM32 SPI作为从机收发数据_第3张图片
观察示波器波形
STM32 SPI作为从机收发数据_第4张图片
可以从IO的翻转看到只进入了两次中断,在第一个字节接收完后,由于HAL库的中断回调需要一定的时间,导致过了一段时间才进入中断回调函数再次开启中断,因此丢失了第二个字节。在中断回调函数中开启中断后能够收到第三个字节,而第四个字节丢失。由此可见1字节接收中断回调的方式不适用于多字节的接收。

另外需要注意仿真打断点的方式观察进入中断的次数不可取,因为断点停下来时主机的SPI信号仍在持续发送,会丢失数据和无法再次进入中断,CR寄存器中的RXNEIE位被清除后没进中断就没有再被开启。

你可能感兴趣的:(STM32单片机,stm32,单片机)