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实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作