DSP28335之CAN通信易错点总结

news2024/9/20 14:46:00

一、CAN初始化流程

①接收发送引脚初始化;

②接收和发送邮箱设置;

③邮箱使能;

④波特率配置;

⑤接收掩码设置;

⑥中断配置。

二、几个重要的知识点

①影子寄存器

因为ECanbRegs是不可以单独对位操作,所以需要设置先将其指向影子寄存器,设置影子寄存器的值,然后再把影子寄存器的值指向ECanbRegs,我们可以看到初始化中都是这样的套路;

②CANMD、CANME、CANMC、CANGIM

好几个类似的结构体成员,简直了是不是。。。他们分别是用来设置邮箱接收(1为RX)、使能邮箱(1为使能)、波特率配置、中断配置相关的;

③中断设置

CANA和CANB的中断初始化是不同的,并且每一路CAN都有2路中断线,如果配置错了,就进不了中断。

从上面手册可知,如果你自己的板子电路只使用了CANB,那接受中断就只能使用TNT9.7(中断线0)、或者INT9.8(中断线1),配置为别的都会是错误的。

④发送设置

修改ID前要先禁止邮箱才能往寄存器里面写值,所以假如未禁止邮箱或者寄存器操作错误(我误把ECanbShadow.CANME.bit.ME16 = 0;写成ECanbRegs.CANME.bit.ME16 = 0;结果死活改不了ID),那就肯定达不到效果。

⑤接收设置

要想接收任意ID,只需要设置LAM和AME两个寄存器即可,ECanaMboxes.MBOX0.MSGID.bit.AME = 1;(启用筛选器,如果不启用就默认只能接收自己设置的ID)ECanaLAMRegs.LAM0.all = 0xFFFFFFFF;(接收任意ID)

注意,调试CAN中断接收时,每次烧录后最好把单片机重启,可能筛选ID寄存器未清空,那么即便设置对,也不能接收任意ID,我就遇到了,真坑!

好啦,上面的就是我调试过程中遇到的问题啦,完整代码见下方,有问题评论区讨论吧~

/*
 * can.c
 *
 *  Created on: 2023年12月12日
 *      Author: Cyber.
 */

#include "can.h"


interrupt void ISRECanbRx(void)
{

    PieCtrlRegs.PIEACK.bit.ACK9 = 1;

    Uint16 group;
    Uint32 high;  //用于存储接收邮箱的内容
    Uint32 low;   //用于存储接收邮箱的内容
    Uint32 id;

    volatile struct MBOX* Mailbox;
    group = (ECanbRegs.CANGIF0.all)&0x3F;   //判断是哪个接收邮箱触发的中断
    Mailbox = &ECanbMboxes.MBOX0 + group;   //取触发中断邮箱的地址
    if(Mailbox->MSGID.bit.IDE == 1) {  //IDE =1 收到的消息有扩展标识位
        id =Mailbox->MSGID.all&0x1FFFFFFF;
    } else{
        id = Mailbox->MSGID.bit.STDMSGID;
    }
    switch(group)  //我这里是把0-5号邮箱配置成了接收邮箱,所以下面case的取值是0-5
    {
    case 0:
    	LED1_TOGGLE;
        low     = Mailbox->MDL.all;    //低32位
        high    = Mailbox->MDH.all;   //高32位
        break;
    }
    ECanbRegs.CANRMP.all = 0x0000003F;   //清除GIF0.GMIF位,即中断标志位
}


void ECAN_Init(void)
{
    struct ECAN_REGS ECanbShadow;

    //配置引脚
    InitECanbGpio();

    //配置引脚用于CAN
    EALLOW;
    ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
    ECanbShadow.CANTIOC.bit.TXFUNC = 1;
    ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;

    ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
    ECanbShadow.CANRIOC.bit.RXFUNC = 1;
    ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
    EDIS;

    EALLOW;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.STM = 0;		//退出测试模式
    ECanbShadow.CANMC.bit.SCB = 1;    	// eCAN mode (reqd to access 32 mailboxes)
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;


    //设置邮箱是接收还是发送
    ECanbRegs.CANME.all = 0;//先禁用所有邮箱,后面会打开指定使用的邮箱
    EALLOW;
    ECanbShadow.CANMD.all = ECanbRegs.CANMD.all;
    ECanbShadow.CANMD.bit.MD0  = 1;  //Rx
    ECanbShadow.CANMD.bit.MD16 = 0;  //Tx
    ECanbRegs.CANMD.all = ECanbShadow.CANMD.all;

    //设置邮箱使能和禁用
    ECanbShadow.CANME.all = ECanbRegs.CANME.all;
    ECanbShadow.CANME.bit.ME0  = 1;
    ECanbShadow.CANME.bit.ME16 = 1;
    ECanbRegs.CANME.all = ECanbShadow.CANME.all;
    EDIS;

    //波特率设置
    EALLOW;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 1;
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;
    do
    {
        ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    }while(ECanbShadow.CANES.bit.CCE != 1 );

    EALLOW;
    ECanbShadow.CANBTC.all = ECanbRegs.CANBTC.all;
    ECanbShadow.CANBTC.bit.BRPREG = 9;
    ECanbShadow.CANBTC.bit.TSEG2REG = 2 ;
    ECanbShadow.CANBTC.bit.TSEG1REG = 10;
    ECanbShadow.CANBTC.bit.SAM = 1;
    ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;

    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 0;
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;
    do
    {
      ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    } while(ECanbShadow.CANES.bit.CCE != 0 );

    ECanbRegs.CANTA.all = 0xFFFFFFFF;  //清除所有TA位

    //这里是设置接收任意ID的功能
	ECanbLAMRegs.LAM0.all=0xffffffff;//邮箱15的局部验收屏蔽寄存器置位可接收任何id的报文(全局验收屏蔽寄存器用于scc模式)
	ECanbMboxes.MBOX0.MSGID.all=0x40000000;  //AME位为1使能验收屏蔽位

	//中断设置
    EALLOW;
    ECanbRegs.CANGIM.all = 0;
    ECanbRegs.CANMIM.all = 0x003F;  //使能上面的接收邮箱(0-5号邮箱)中断
    ECanbRegs.CANMIL.all = 0;

    ECanbShadow.CANGIM.all = ECanbRegs.CANGIM.all;
    ECanbShadow.CANGIM.bit.I0EN = 1;  //选择中断线0
    ECanbRegs.CANGIM.all = ECanbShadow.CANGIM.all;

    PieCtrlRegs.PIECTRL.bit.ENPIE=1;
    PieCtrlRegs.PIEIER9.bit.INTx7=1;  //9.7
    PieVectTable.ECAN0INTB = &ISRECanbRx;
    IER|=M_INT9;
    EINT;
    EDIS;
}


//注意邮箱编号需要根据实际修改
//CANB 发送函数 Can_Id为CAN_ID, length为CAN数据长度(单位是字节), Data_L为低四位字节,Data_H为高四位字节
void CanBSend(Uint32 Can_Id, char length, Uint32 Data_L, Uint32 Data_H)
{
    struct ECAN_REGS ECanbShadow;

    //修改ID前要禁止邮箱才能往寄存器里面写值
    ECanbShadow.CANME.all = ECanbRegs.CANME.all;
    ECanbShadow.CANME.bit.ME16 = 0;
    ECanbRegs.CANME.all = ECanbShadow.CANME.all;
     /* Write to the MSGID field  */
    ECanbMboxes.MBOX16.MSGID.all = Can_Id; // stand Identifier
    //使能邮箱
    ECanbShadow.CANME.all = ECanbRegs.CANME.all;
    ECanbShadow.CANME.bit.ME16 = 1;
    ECanbRegs.CANME.all = ECanbShadow.CANME.all;

    /* Write to DLC field in Master Control reg */
    ECanbMboxes.MBOX16.MSGCTRL.bit.DLC = length; //8;
    /* Write to the mailbox RAM field */
    ECanbMboxes.MBOX16.MDL.all =Data_L;  //低位4字节
    ECanbMboxes.MBOX16.MDH.all =Data_H ; //高位4字节

    //struct ECAN_REGS ECanbShadow;
    ECanbShadow.CANTRS.all = 0;
    ECanbShadow.CANTRS.bit.TRS16 = 1;             // Set TRS for mailbox under test
    ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;
    do
    {
        ECanbShadow.CANTA.all = ECanbRegs.CANTA.all;
    }while(ECanbShadow.CANTA.bit.TA16 == 0 );   // Wait for TA5 bit to be set..
    ECanbShadow.CANTA.all = 0;
    ECanbShadow.CANTA.bit.TA16 = 1;             // Clear TA5
    ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
}





 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SD-WAN架构:优化连接以提升性能

SD-WAN架构主要分为三种类型,分别为本地架构、支持云的架构、支持云的骨干架构。每一种架构都基于它们利用广域网(WAN)的方式而有其独特的优势。本文将对三种SD-WAN架构进行简要介绍。 SD-WAN本地架构 SD-WAN本地架构是在现场使用SD-WAN盒或…

焦炭冶金工艺3D可视化仿真展示更直观、形象

冶金行业作为重要的工业领域,其岗位实践培训一直面临着诸多挑战,随着web3d开发和VR虚拟仿真技术的不断创新和应用,冶金3D虚拟仿真实践教学平台应运而生,为钢铁生产培训带来了崭新的变革。 冶金3D虚拟仿真实践教学平台采用了先进的…

AIGC专题报告:ChatGPT纪要分享

今天分享的AIGC系列深度研究报告:《AIGC专题报告:ChatGPT纪要分享》。 (报告出品方:久谦中台) 报告共计:135页 OpenAI 高管解密 ChatGPT GPT-3 是一种大型语言模型,被训练用来在给定上下文中…

百度文库下载要用券?Kotlin爬虫几步解决

百度作为国内知名的网站,尤其是文库里面有各种丰富的内容,对我们学习生活都有很大的帮助,就因为其内容丰富,如果看见好用有意思的文章还用复制粘贴等方式就显得有点落后了,今天我将用我所学的爬虫知识给你们好好上一课…

Mac 下 Python+Selenium 自动上传西瓜视频

背景 研究下 PythonSelenium 自动化测试框架,简单实现 Mac 下自动化批量上传视频西瓜视频并发布,分享给需要的同学(未做过多的异常处理)。 脚本实现 首先通过手工手机号登录,保存西瓜视频网站的 cookie 文件 之后加载…

有什么项目可以大量使用c++实现?

有什么项目可以大量使用c实现? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「c的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!&#x…

《opencv实用探索·十七》calcBackProject直方图反向投影

在了解反向投影前需要先了解下直方图的概念,可以看我上一章内容:opencv直方图计算calcHist函数解析 直方图反向投影是一种图像处理技术,通常用于目标检测和跟踪。通过计算反向投影,可以将图像中与给定模式(目标对象&a…

工作流程flowable(二)流程节点跟踪

flowable 节点跟踪 一、发起1-1 流程模型1-1-1 流程模型定义1-1-2 部署流程模型 {modelId} 1-2 部署管理1-2-1 流程定义列表查询 新的改变 二、我的申请新的改变 三、我的待办新的改变 三、我的已办新的改变 一、发起 1-1 流程模型 1-1-1 流程模型定义 1-1-2 部署流程模型 {…

我的隐私计算学习——隐私集合求交(2)

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具,经由自己阅读后整理而成。 前篇可见:我的隐私计算学习——隐私集合求交(1) (三)PSI应用场景问题 ​在目前的实际应用中,衍生出一些新…

美食大赛的题解

目录 原题描述: 题目描述: 输入格式: 输出格式: 样例输入: 样例输出: 数据规模: 题目大意: 主要思路: 注: 代码: 原题描述&#xff1a…

updateBatch批量更新

java代码 Dao层 int updateBatch(Param("userList") List<User> userList);sql配置文件 <update id"updateBatch" parameterType"java.util.List" ><foreach collection"userList" item"user" separator&quo…

Next.js中的App Router与Page Router,各自的作用和使用方式,如何理解和配置使用?

App Router介绍 Next.js中的App Router是全局的路由器&#xff0c;它用于在应用程序的所有页面之间进行导航。它可以用于在页面之间传递状态和数据&#xff0c;类似于React中的Context。 App Router是通过_app.js文件中的getInitialProps方法来配置的。 在 Next.js 中&#xf…

算法通关村第十三关—数学与数学基础问题(青铜)

数学与数学基础问题 一、统计专题 1.1 符号统计 LeetCode1822给定一个数组&#xff0c;求所有元素的乘积的符号&#xff0c;如果最终答案是负的返回-1&#xff0c;如果最终答案是正的返回1&#xff0c;如果答案是0返回0。  题目比较简单&#xff0c;正数对结果完全没影响&…

RK3568驱动指南|第八篇 设备树插件-第75章ConfigFS的核心数据结构

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【Docker】进阶之路:(九)Docker网络

【Docker】进阶之路&#xff1a;&#xff08;九&#xff09;Docker网络 Docker网络模式简介bridge网络模式host网络模式none网络模式container网络模式user-defined网络模式1.创建自定义的bridge网络2.使用自定义网络 高级网络配置docker network命令 为什么要了解容器的网络模…

谈谈MYSQL主从复制原理

目录 概述 要点binlog日志 主从复制过程 总结 概述 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。 MySQL 默认采用异步复制方式。从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0…

Python应用利器:缓存妙用,让你的程序更出色更快速!

在 Python 应用程序中&#xff0c;使用缓存能够显著提高性能并降低资源消耗。本文将详细介绍如何在 Python 中实现缓存机制&#xff0c;包括内置 functools 模块提供的 lru_cache 装饰器以及自定义缓存机制。 使用 functools 模块的 lru_cache functools 模块提供了 lru_cach…

【CDP】CDP 集群通过Knox 访问Yarn Web UI,无法跳转到Flink Web UI 问题解决

一、前言 记录下在CDP 环境中&#xff0c;通过Knox 访问Yarn Web UI&#xff0c;无法跳转到Flink Web UI 的BUG 解决方法。 二、问题复现 登录 Knox Web UI 找到任一 Flink 任务 点击 ApplicationMaster 跳转 Flink WEB UI 出问题 内容空白&#xff0c;无法正常跳转到…

【MySQL】mysql | mysql5.7升级8.0注意事项

一、说明 1、应公司要求&#xff0c;mysql5.7安全漏洞较多&#xff0c;需要升级到8.0 2、记录注意事项备不时之需 二、注意事项 1、加密算法 1&#xff09;加密算法8.0改了&#xff0c;导致navicat无法连接 2&#xff09;解决&#xff1a; use mysql; ALTER USER root% IDENT…