DSP28335的CAN总线通讯

DSP28335的CAN总线通讯本文将演示 DSP28335 的 CAN 通讯 并用示波器验证 CAN 总线 CAN 模块的 RX TX 管脚的电压波形 话不多说 直接上代码 Uint32TestMb 0 用来接收 mailbox 里面的值 Uint32TestMb 0 Uint32TestMb 0 Uint32TestMb 0 Uint32TestMb 0 Uint3

本文将演示DSP28335的CAN通讯,并用示波器验证CAN总线、CAN模块的RX、TX管脚的电压波形。话不多说,直接上代码

Uint32 TestMbox1 = 0;//用来接收mailbox里面的值 Uint32 TestMbox2 = 0; Uint32 TestMbox3 = 0; Uint32 TestMbox4 = 0; Uint32 TestMbox5 = 0; Uint32 TestMbox6 = 0; Uint32 received1[20]; Uint32 received2[20]; Uint32 cnt=0; Uint32 i1=0; Uint32 j1=0; interrupt void ECAN1Receiver(void) { if(ECanbRegs.CANRMP.bit.RMP25==1){ Mailbox1 = &ECanbMboxes.MBOX0 + 25; //CANB读数据 TestMbox1 = Mailbox1->MDL.all; // = 0x (n is the MBX number) TestMbox2 = Mailbox1->MDH.all; // = 0x (a constant) received1[i1]=TestMbox1; received1[i1+1]=TestMbox2; i1=i1+2; TestMbox3 = Mailbox1->MSGID.all;// = 0x (n is the MBX number) ECanbRegs.CANRMP.bit.RMP25=1; } if(ECanbRegs.CANRMP.bit.RMP26==1){ Mailbox2 = &ECanbMboxes.MBOX0 + 26; //CANB读数据 TestMbox4 = Mailbox2->MDL.all; // = 0x (n is the MBX number) TestMbox5 = Mailbox2->MDH.all; // = 0x (a constant) TestMbox6 = Mailbox2->MSGID.all;// = 0x (n is the MBX number) received2[j1]=TestMbox4; received2[j1+1]=TestMbox5; j1=j1+2; ECanbRegs.CANRMP.bit.RMP26=1; } PieCtrlRegs.PIEACK.bit.ACK9=1; } void main(){ struct ECAN_REGS ECanbShadow;//因为CAN的控制寄存器需要32位寻址,不能单独对位操作,所以定义一个中间的寄存器 InitSysCtrl(); InitECanbGpio();//这里使用Ecan模块的b模块,直接用例程的,代码就不贴了 DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; ECanbRegs.CANGIM.bit.I0EN=1;//中断线0使能 PieVectTable.ECAN0INTB=&ECAN1Receiver;//关联中断子函数,CAN模块的中断线有0和1,这里我使用了0中断线 EDIS; InitECan();//这个是Ecan模块的初始化部分,这里直接抄例程的,代码就不贴出来了。波特率设置为500k baud/s Eallow; ECanbRegs.CANMIM.bit.MIM25=1;//邮箱中断使能 ECanbRegs.CANMIM.bit.MIM26=1;//邮箱中断使能 ECanbRegs.CANMIL.all=0;//邮箱中断级别,设置为0则对应在中断线0出产生中断 ECanbRegs.CANGIF0.all=0xffffffff;//全局中断标志寄存器,写1清0 PieCtrlRegs.PIEIER9.bit.INTx7=1; IER |=0x0100; IFR=0x0000; EDIS; EINT; ERTM; ECanbMboxes.MBOX24.MSGID.all = 0x;//扩展帧,标识符29位 ECanbMboxes.MBOX25.MSGID.all = 0x;//扩展帧,标识符29位 ECanbMboxes.MBOX26.MSGID.all = 0x; //扩展帧,标识符29位 ECanbShadow.CANMD.all = ECanbRegs.CANMD.all; ECanbShadow.CANMD.bit.MD24=0;//配置24作为发送 ECanbShadow.CANMD.bit.MD25 = 1;//配置eCANB的25和26号作为接收邮箱 ECanbShadow.CANMD.bit.MD26=1; ECanbRegs.CANMD.all = ECanbShadow.CANMD.all; //在配置标识符之前必须unable,然后在enable ECanbShadow.CANME.all = ECanbRegs.CANME.all; ECanbShadow.CANME.bit.ME24 = 1; ECanbShadow.CANME.bit.ME25 = 1; ECanbShadow.CANME.bit.ME26 = 1; ECanbRegs.CANME.all = ECanbShadow.CANME.all;//使能邮箱 ECanbMboxes.MBOX24.MSGCTRL.bit.DLC = 8;//8字节的发送数据 ECanbMboxes.MBOX24.MDL.all = 0xAABBCCDD;//发送的数据 ECanbMboxes.MBOX24.MDH.all = 0xDDCCBBAA; for(i=0; i < 20; i++){ //连发20帧数据 ECanbShadow.CANTRS.all = 0; ECanbShadow.CANTRS.bit.TRS24 = 1; // TRS一旦被置位,则立即发送 ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all; do { ECanbShadow.CANTA.all = ECanbRegs.CANTA.all; } while(ECanbShadow.CANTA.bit.TA24 == 0 ); // Wait for TA5 bit to be set..//如果线没有连接,如果线连接错误 ECanbShadow.CANTA.all = 0; ECanbShadow.CANTA.bit.TA24 = 1; // Clear TA5 ECanbRegs.CANTA.all = ECanbShadow.CANTA.all; } } 

当然实际中的CAN不会这么简单。

1. 考虑多个邮箱同时发送,这是要对邮箱设置优先级
2. 同时向总线请求发送时,这时涉及竞争机制。即比较标识符的位
3. 当接收邮箱不断接收到值时,是否覆盖原来的值,这也是需要考虑的问题
4. 使能接收屏蔽,标识符匹配才能被正确的接收。如果只需要一部分匹配,那就要设置接受屏蔽寄存器
5. 另外,此次发了8 byte个数据,不过我发现如果前面发送i byte个数据,再发送j byte个数据,其中i>j,那么后面的数据只会替代掉属于它的那几个byte,有几个byte还是上一次发送i 个byte时候的数据。这个问题暂时还没有解决。还望大家指导下。
6. 最后一点也是最近调试的时候发现了,当CAN 总线上检测出现5个相同的电平位之后,会自动发送一个相反的电平位。这个要注意下










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175979.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:57
下一篇 2026年3月26日 下午10:58


相关推荐

  • python笔记系列:IP地址处理模块IPy

    python笔记系列:IP地址处理模块IPyIP 地址处理模块 IPywgethttps pypi python org packages source I IPy IPy 0 81 tar gzno check certificatet zxvfIPy 0 81 tar gzcdIPy 0 81pythonsetu pyinstallIP 10 0 0 0 8 version IP 1 versi

    2026年3月18日
    2
  • 大屏数据可视化案例「建议收藏」

    大屏数据可视化案例「建议收藏」数据可视化:把相对复杂的、抽象的数据通过可视的、交互的方式进行展示,从而形象直观地表达数据蕴含的信息和规律。数据可视化是数据空间到图形空间的映射,是抽象数据的具象表达。数据可视化交互的基本原则:总览为先,缩放过滤按需查看细节。大屏数据可视化是当前可视化领域的一项热门应用,通常可以分为信息展示类、数据分析类及监控预警类。大屏数据可视化应用的难点并不在于图表类型的多样化,而在于如何能在…

    2022年6月27日
    35
  • 百度地图的开发版sha1和发布版sha1的获取方式「建议收藏」

    百度地图的开发版sha1和发布版sha1的获取方式「建议收藏」百度地图SDK在实际开发中也算是最常用的SDK之一,但是不少新手开发者对申请密钥时,填写SHA1有不少疑问,在此解答进入百度地图SDK申请密钥会看到这样的场景这里不得不说几件事在安卓开发中,打包生成APK时,我们通常有两种方式重点:也就是所谓的debug版本和release版本,这两个签名方式是不一样的。调试(

    2022年8月10日
    7
  • 智能体 (AI Agent) 是什么?从核心架构、关键应用到未来趋势的终极指南 (2025年版)

    智能体 (AI Agent) 是什么?从核心架构、关键应用到未来趋势的终极指南 (2025年版)

    2026年3月16日
    3
  • AI写作-Deepseek高效使用指南,1分钟学会

    AI写作-Deepseek高效使用指南,1分钟学会

    2026年3月16日
    3
  • 常见的路由协议「建议收藏」

    常见的路由协议「建议收藏」常见的路由协议可以分为两种类型一、内部网关协议内部网关协议(IGP:InteriorGatewayProtocol),适用于单个ISP的统一路由协议的运行,一般由一个ISP运营的网络位于一个AS(自治系统)内,有统一的ASnumber(自治系统号),用来处理内部路由。RIP、IGRP(Cisco私有协议)、EIGRP(Cisco私有协议)、OSPF、IS-IS等都是内部网关协议。1、…

    2025年8月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号