硬汉嵌入式论坛

 找回密码
 立即注册
查看: 228|回复: 5
收起左侧

[SPI/QSPI] spi从机,接受异常,进入上溢错误

[复制链接]

8

主题

14

回帖

38

积分

新手上路

积分
38
发表于 2024-3-29 17:15:42 | 显示全部楼层 |阅读模式
在做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内的配置我是这样配的
屏幕截图 2024-03-29 171135.png
屏幕截图 2024-03-29 171208.png
屏幕截图 2024-03-29 171236.png

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

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2024-3-29 19:53:38 | 显示全部楼层
你是循环模式还是单次模式
回复

使用道具 举报

8

主题

14

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2024-3-29 23:09:12 来自手机 | 显示全部楼层
DMA开启的普通模式,也就是单次,完成一次接收后在中断中再打开下一次的
回复

使用道具 举报

8

主题

14

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2024-4-1 08:25:39 来自手机 | 显示全部楼层
难道说spi只能一次接收8~16个字节,大于这些的只能多次接收?
回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2024-4-1 08:50:55 | 显示全部楼层
2668350209 发表于 2024-4-1 08:25
难道说spi只能一次接收8~16个字节,大于这些的只能多次接收?

搞个缓冲试试看,
回复

使用道具 举报

44

主题

562

回帖

699

积分

金牌会员

积分
699
发表于 2024-4-1 13:44:46 | 显示全部楼层
还要配置MPU的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 05:49 , Processed in 0.189361 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表