2668350209 发表于 2024-3-29 17:15:42

spi从机,接受异常,进入上溢错误

在做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 ,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_GPS_data(SPI1RxData);
                               
                                memset(SPI1RxData,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 ,180 );
}

cubemx内的配置我是这样配的




硬汉哥快帮帮,被折磨疯了

ou513 发表于 2024-3-29 19:53:38

你是循环模式还是单次模式

2668350209 发表于 2024-3-29 23:09:12

DMA开启的普通模式,也就是单次,完成一次接收后在中断中再打开下一次的

2668350209 发表于 2024-4-1 08:25:39

难道说spi只能一次接收8~16个字节,大于这些的只能多次接收?

hpdell 发表于 2024-4-1 08:50:55

2668350209 发表于 2024-4-1 08:25
难道说spi只能一次接收8~16个字节,大于这些的只能多次接收?

搞个缓冲试试看,

ou513 发表于 2024-4-1 13:44:46

还要配置MPU的
页: [1]
查看完整版本: spi从机,接受异常,进入上溢错误