|
在做SPI从机过程中遇到的大坑,主机给我发送一个大约200个字节的数据,单片机作为从机接收,但是只要一打开数据接受,进入spi中断服务函数就会报上溢错误,全是乱码
使用了FreeRTOS系统,开设了一个任务用于处理发来的数据
任务函数我是这样写的
void GPS_REC_task(void *argument)
{
/* USER CODE BEGIN GPS_REC_task */
osStatus_t err;
uint32_t len = 0;
HAL_SPI_Receive_DMA(&hspi1 , SPI1RxData[SPI1_fifo.usRxWrite] ,180 );
/* Infinite loop */
for(;;)
{
err = osMessageQueueGet (SPI1_recv_semp_queueHandle, &len, 0, GPS_REC_block_time); //调试阶段未使用,正式阶段将阻塞时间设置为1000
if(err == osOK)
{
if(len != 0)
{
// printf("%s\r\n",SPI1RxData[SPI1_fifo.usRxRead]);
SPI1_GPS_data(SPI1RxData[SPI1_fifo.usRxRead]);
memset(SPI1RxData[SPI1_fifo.usRxRead],0,SPI1_Max_Rxbuf_size);
if (++SPI1_fifo.usRxRead >= SPI1_fifo.usRxBufSize)
{
SPI1_fifo.usRxRead = 0;
}
}
else //说明只是为了来解除阻塞,以此判断是否超时
printf("解除阻塞\r\n");
}
else
{
}
osDelay(1);
}
/* USER CODE END GPS_REC_task */
}
接受中断回调函数我是这样写的
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
static uint16_t data_len = 180;
if (++SPI1_fifo.usRxWrite >= SPI1_fifo.usRxBufSize)
{
SPI1_fifo.usRxWrite = 0;
}
if (osMessageQueueGetCount(SPI1_recv_semp_queueHandle) < SPI1_fifo.usRxBufSize)
{
osMessageQueuePut(SPI1_recv_semp_queueHandle,&data_len,0,0);
}
HAL_SPI_Receive_DMA(&hspi1 , SPI1RxData[SPI1_fifo.usRxWrite] ,180 );
}
cubemx内的配置我是这样配的
硬汉哥快帮帮,被折磨疯了
|
|