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

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据