DSP28335之CAN通信易错点总结

一、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;
}





 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP操作ZIP之ZipArchive类以及如何避免生成压缩文件带有目录层级的问题

常用的方法 php ZipArchive可以说是php自带的一个函数了,他可对对文件进行压缩与解压缩处理,但是使用此类之前我们必须在php.ini中把extensionphp_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。 ziparchive 可选参数…

嵌入式培训-Linux系统及C编程高级-DAY1718-编译器

GCC编译器 GCC简介 GCC 原名为 GNU C 语言编译器(GNU C Compiler),只能处理 C 语言。但其很快扩展,变得可处理 C,后来又扩展为能够支持更多编程语言,如 Fortran、Pascal、Objective -C、Java、Ada、Go 以及…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

作业12.12

1.闹钟 主函数 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);t new QTimer(this);idstartTimer(1000);speecher new QTextToSpeech(this); }Widget::~Wid…

IO进程线程day8

作业 1> 使用三个程序来完成输出 ABCABCABCABCABC #include<myhead.h> #include"sem.h" #define PAGE_SIZE 4096 int main(int argc, const char *argv[]) {int semidcreate_sem(3);printf("semid%d\n",semid);if(semid-1){perror("create…

WPF-附加属性《十二》

非常重要 依赖属性和附加属性&#xff0c;两者是有关系的&#xff0c;也是有些区别的&#xff0c;很多时候&#xff0c;可能会把两者混淆了。 附加属性&#xff08;Attach Property&#xff09; 顾名思义&#xff0c;就是附加上面的属性&#xff0c;自身是没有的&#xff0c;…

boost graph之基础

结构 属性相关 #mermaid-svg-PZQvKfbwNSnyXO9g {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-icon{fill:#552222;}#mermaid-svg-PZQvKfbwNSnyXO9g .error-text{fill:#552222;stroke:#5522…

21、pytest参数化中标记单独的测试用例

官方实例 # content of test_expectation_xfail import pytestpytest.mark.parametrize("test_input, expected",[("35",8),("24",6),pytest.param("6*9",42,markspytest.mark.xfail)], ) def test_eval(test_input, expected):asser…

2023-12-12 AIGC-AI工具的基本工作原理

摘要: 2023-12-12 AIGC-AI工具的基本工作原理 AI工具的基本工作原理 AI工具的基本工作原理涉及到一系列复杂的技术和算法。这些原理可以根据不同类型的AI工具进行概括&#xff0c;包括机器学习、自然语言处理、图像识别等。以下是一些关键的AI工具及其工作原理的概述&#xff…

类加载机制与反射

类加载机制与反射 一.虚拟机类加载机制 1.虚拟机类加载机制概述 虚拟机把描述类的数据从class文件加载到内存 将类的数据进行校验,转换解析和初始化 形成可以被java虚拟机直接使用的java类型 2.类加载过程 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加…

WEB渗透—PHP反序列化(一)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

Datawhale聪明办法学Python(task2Getting Started)

一、课程基本结构 课程开源地址&#xff1a;课程简介 - 聪明办法学 Python 第二版 章节结构&#xff1a; Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…

手拉手探索JSONCrack数据可视化

JSON Crack数据可视化工具 官网&#xff1a;https://jsoncrack.com/ 项目地址&#xff1a;https://github.com/AykutSarac/jsoncrack.com SON Crack 是一个很方便的 JSON 数据可视化工具。 该项目不是简单的展示 JSON 数据,而是将其转化为类似思维导图的形式,支持放大/缩小、展…

华为或荣耀手机禁止强制升级鸿蒙系统的终极方法

需要有数据传输的usb线.打开usb调试模式. 进这个链接下载华为ADB一键卸载VS重装软件 按里面的视频说明,输入88 然后回车即可 https://download.csdn.net/download/viqecel/12161462

Course2-Week4-决策树

Course2-Week4-决策树 文章目录 Course2-Week4-决策树1. 决策树的直观理解2. 构建单个决策树2.1 熵和信息增益2.2 构建决策树——二元输入特征2.3 构建决策树——多元输入特征2.4 构建决策树——连续的输入特征2.5 构建回归树——连续的输出结果(选修)2.6 代码实现-递归构建单个…

数据库范式(详细介绍)

目录 第一范式&#xff08;原子性&#xff09; 第二范式&#xff08;主键唯一性&#xff09; 第三范式&#xff08;原子性主键唯一性&#xff09; BC范式(3NFplus) 第一范式&#xff08;原子性&#xff09; 确保每列保证原子性&#xff0c;保证这个属性&#xff08;字段&am…

未来智能座舱中的人机交互

智能车辆人机交互的发展是中国智能车辆企业品牌升级的重要突破点。通过不断整合人与车辆之间的相互作用&#xff0c;未来的智能车辆将能够提供更全面的沉浸式体验&#xff0c;推动新的互动方式和技术的成熟。这些交互技术不仅满足基本的安全需求&#xff0c;还能满足更深层次的…

马赛克,克星,真来了!v2.0

大家好&#xff0c;今天继续聊聊 AI 开源项目 AI 开源项目 1、DemoFusion AI 绘画的潜力还没有充分挖掘出来&#xff0c;仍然还有上升的空间。 DemoFusion 就是这么一个开源项目&#xff0c;继续深挖了 AI 绘画在高分辨率图片生成的效果。 提高分辨率&#xff0c;马赛克&a…

【JUC】二十五、ThreadLocal内存泄漏问题(强软弱虚四种引用)

文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收&#xff0c;就是内存泄露&#xff08;累积可能导致OOM&#xff09;。 1、引用之…

Echarts小问题汇总

文章目录 Echarts小问题汇总1.柱状图第一条柱子遮挡Y轴解决方法2.在大屏渲染后 拖到小屏变模糊3.相邻柱状图中间不要有空隙4.实现echarts图表自适应5.单个柱状图最大宽度 Echarts小问题汇总 记录工作中使用Echarts的遇见的一些小问题&#xff0c;后续会不断进行补充 1.柱状图…