MCU上调试CAN总线问题汇总(包含接收中断不生效和GD MCU的过滤功能)

2023-12-06 08:40

本文主要是介绍MCU上调试CAN总线问题汇总(包含接收中断不生效和GD MCU的过滤功能),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

问题一:两个can设备无法相互间收发数据

原因:

问题二:can接收中断接收不到数据

解决方案:

    (1)方案1

    (2)方案2

问题三:GD32的can的过滤功能怎么用呢

    列表模式过滤标准帧的流程(使用can0总线):

    1、选选择过滤器,设置模式为列表模式,位宽为32位    

    2、过滤指定id    

    3、通过过滤器后绑定到FIFO0并使能过滤    


问题一:两个can设备无法相互间收发数据

板子的两个can总线对接,收发正常,can分析仪的两个can总线对接,收发也正常。偏偏将板子接到分析仪上,收发均有问题。


原因:

波特率不同,分析仪的波特率好设置,在软件界面中选好,主要侦测波特率也要选择正确。
板子的波特率是根据主频和can芯片几个寄存器的值算出来的,计算公式为:BaudRate = APBCLK/BRP*(1+BS1+BS2)      APBCLK由sysclk倍频而来,有软件在输入APBCLK之后,可以计算出对应的BRP BS1和BS2的值。


问题二:can接收中断接收不到数据

我遇到过两种情景:
1、有接收过滤filter,去掉过滤条件或者把期待接收的报文id加入过滤条件中便能解决
2、硬件断电重启后无法进入can的接收中断,当硬件reset后接收中断恢复正常:
猜测原因:

(我的硬件环境是mcu外接8M晶振)。硬件上电和硬件reset两种场景下,硬件的初始化时序不一样:系统时钟启动之后,多等待一段时间,等待时钟稳定了,再倍频到APB1,最后再初始化APB1总线上的can资源。
硬件上电时系统时钟还没准备好就初始化can总线,can的接收中断无法触发。上电后,时钟已经ok,硬件reset后can相应的初始化自然能生效。


解决方案:


    方案有两个:


    (1)方案1

上电后执行NVIC_SystemReset()做软重启,这种方法导致程序反复重启。除非硬件上电有一个独一无二的条件出现,并且软件能感知到。


    (2)方案2

在设置系统时钟之后,增加2秒的延时时间。问题成功解决!!!


问题三:GD32的can的过滤功能怎么用呢


    列表模式好操作,掩码模式难点:
    列表模式就是只接收指定id的报文,掩码模式是接收id在某个段内的报文。


    列表模式过滤标准帧的流程(使用can0总线):


    1、选选择过滤器,设置模式为列表模式,位宽为32位
    

can_filter_parameter_struct can_filter;
can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);    //初始化为0
can_filter.filter_number = 0;    // GD32F4xxx有28个过滤器,这里选择0
can_filter.filter_mode = CAN_FILTERMODE_LIST;
can_filter.filter_bits = CAN_FILTERBITS_32BIT;


    2、过滤指定id
    

can_filter.filter_list_high = 0x5A5 << 5; // 0x5A5可以通过该过滤器;
can_filter.filter_list_low = 0x0000;


    can_filter.filter_mask_high和can_filter.filter_mask_low使用初始化值即可
    filter_list_high和filter_list_low分别表示过滤器单元有2个寄存器CAN_FxDATA0和CAN_ FxDATA1,而两者加起来共32位,CAN_FxDATA0存放SFID(标准帧的ID)的低11位。
    为什么要左移5位呢,0x5A5 << 5之后刚好可以存放在16位的CAN_FxDATA0中。


    3、通过过滤器后绑定到FIFO0并使能过滤
    

can_filter.filter_fifo_number = CAN_FIFO0;  
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);


    关于标准帧的掩码模式,我有一个可用的demo,但是暂时还没搞清楚原理。
    

can_filter_parameter_struct can_filter;
can_struct_para_init(CAN_FILTER_STRUCT, &can_filter);    //初始化为0
can_filter.filter_number=1;                             // 过滤器序号1
can_filter.filter_mode = CAN_FILTERMODE_MASK;           // 掩码模式
can_filter.filter_bits = CAN_FILTERBITS_32BIT;          // 使用32位模式
can_filter.filter_list_high = 0x4FF << 5;
can_filter.filter_list_low = 0x0000;
can_filter.filter_mask_high = (0x700 << 5) ;  // 0x400-0x4FF可以通过该过滤器;
can_filter.filter_mask_low = (1U << 2);                //必须匹配
can_filter.filter_fifo_number = CAN_FIFO0;       //通过过滤器后绑定到FIFO0
can_filter.filter_enable = ENABLE;
can_filter_init(&can_filter);

 

这篇关于MCU上调试CAN总线问题汇总(包含接收中断不生效和GD MCU的过滤功能)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461182

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依