当前位置:   article > 正文

STM32 SPI作为从机收发数据_spi作为从机如何接收数据

spi作为从机如何接收数据

本文验证STM32单片机SPI从机的收发功能,记录过程中遇到的问题。
使用STM32F429的SPI1作为主机,使用STM32F103的SPI1作为从机,二者SPI的配置如下:
在这里插入图片描述
在这里插入图片描述

从机使用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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

HAL_SPI_Receive_IT(&hspi1,&SPI1_RxData[0],1);
  • 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++;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号