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


主机片选从机后一次发送四个字节
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

观察示波器波形

可以从IO的翻转看到只进入了两次中断,在第一个字节接收完后,由于HAL库的中断回调需要一定的时间,导致过了一段时间才进入中断回调函数再次开启中断,因此丢失了第二个字节。在中断回调函数中开启中断后能够收到第三个字节,而第四个字节丢失。由此可见1字节接收中断回调的方式不适用于多字节的接收。
另外需要注意仿真打断点的方式观察进入中断的次数不可取,因为断点停下来时主机的SPI信号仍在持续发送,会丢失数据和无法再次进入中断,CR寄存器中的RXNEIE位被清除后没进中断就没有再被开启。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。