OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4686|回复: 7

STM32F4 CAN1 fifo上溢了怎么处理

[复制链接]

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
发表于 2021-1-8 12:07:17 | 显示全部楼层 |阅读模式
50金钱
我用的是STM32F4探索者开发板

配置的是CAN1,过滤器0,关联FIFO 0 ,在测试中发现FIFO 0 存在上溢

请问一下,FIFO上溢的后果是什么?是不是会导致接收的数据不完整呢?
如果是的话,怎么解决呢?
我尝试配置了过滤器1,用过滤器1关联FIFO 1,我以为FIFO 0 上溢后数据会自动保存到 FIFO 1,但是测试下来好像行不通

希望高人指点一下!谢谢!!

最佳答案

查看完整内容[请看2#楼]

随会在中断里面打印的?牛人,把打印去掉
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
716
金钱
716
注册时间
2015-5-23
在线时间
136 小时
发表于 2021-1-8 12:07:18 | 显示全部楼层
随会在中断里面打印的?牛人,把打印去掉
回复

使用道具 举报

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
 楼主| 发表于 2021-1-8 13:02:14 | 显示全部楼层
顶一下!求高人指点!!!
回复

使用道具 举报

2

主题

369

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4241
金钱
4241
注册时间
2020-7-24
在线时间
714 小时
发表于 2021-1-9 15:27:47 | 显示全部楼层
CAN接收报文的过程是FIFO空->收到有效报文->挂号,STM32的CAN有3级邮箱深度的 FIFO,也就是如果收到了三次有效报文都没有读取,下次有新的报文就会产生FIFO溢出的,所以必须在 FIFO 溢
出之前,读出至少 1 个报文,否则下个报文到来,将导致 FIFO 溢出,从而出现报文丢失的情况
回复

使用道具 举报

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
 楼主| 发表于 2021-1-12 14:11:25 | 显示全部楼层
GJJ1999 发表于 2021-1-9 15:27
CAN接收报文的过程是FIFO空->收到有效报文->挂号,STM32的CAN有3级邮箱深度的 FIFO,也就是如果收到了三次 ...

我在接收中断中读取了FIFO数据,一有数据就读取了,但感觉还是速度不够,还是有上溢

void CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
        int i=0;       
        if(SET == CAN_GetITStatus(CAN1,CAN_IT_FOV0))
        {
                CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);
                printf("CAN1 fifo shangyi\r\n");
        }
        else if(CAN_GetITStatus(CAN1,CAN_IT_FMP0))
        {
                CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
               
                CAN_Receive(CAN1, 0, &RxMessage);
                for(i=0;i<RxMessage.DLC;i++)
                {
                        printf("%x ",RxMessage.Data);
                }       
                printf("\r\n");
        }
}
回复

使用道具 举报

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
 楼主| 发表于 2021-1-13 13:48:09 | 显示全部楼层
有没有高手可以帮我解答一下呀
回复

使用道具 举报

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
 楼主| 发表于 2021-1-19 10:06:20 | 显示全部楼层
denike 发表于 2021-1-13 17:12
随会在中断里面打印的?牛人,把打印去掉

void CAN1_RX0_IRQHandler(void)
{
  CanRxMsg RxMessage;
        int i=0;       
        if(SET == CAN_GetITStatus(CAN1,CAN_IT_FOV0))
        {
                CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);
        }
        else if(CAN_GetITStatus(CAN1,CAN_IT_FMP0))
        {
                CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
               
                CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
               
                for(i=0;i<RxMessage.DLC;i++)
                {
                        databuf=RxMessage.Data;
                }
                sign = RxMessage.DLC;       
        }
}


我修改了中断函数,去除了打印,就做赋值操作,通过sign标志位来判断收到的数据,然后在主函数里打印,还是获取不到完整的数据。。。
回复

使用道具 举报

20

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1180
金钱
1180
注册时间
2018-9-11
在线时间
132 小时
 楼主| 发表于 2021-1-19 18:56:50 | 显示全部楼层
denike 发表于 2021-1-8 12:07
随会在中断里面打印的?牛人,把打印去掉

感谢楼主!确实是中断函数中的打印操作引起的处理速度不够 从而导致FIFO上溢!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 01:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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