DSPCAN通讯程序中文说明
- 格式:docx
- 大小:22.44 KB
- 文档页数:6
dsp调试can一点心得dsp调试can一点心得调试的过程也就是学习的过程,无前人领路,只有自己摸索,不免要耗费更多的时间和精力,从看书到调试到完全调通,用了差不多一星期的时间,当然不是全满,嘿嘿,偶尔还是要玩玩,在这里总结一下,脑子不好用,日后必定就忘记了这宝贵的经历。
1:如何配置can的问题首先要按照书上所讲的做基本配置,(ECanaShadow == ECanaRegs)GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; //定义为can功能GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; //定义为can功能ECanaShadow.CANTIOC.bit.TXFUNC = 1; //定义为can发送功能ECanaShadow.CANRIOC.bit.RXFUNC = 1; //定义为can接收功能然后再不使能邮箱的情况下作如下设置:ECanaRegs.CANME.all = 0; //不使能邮箱ECanaRegs.CANMD.all = 0xFFFF0000; /*0~15 is TX,16~31 is RX*/设置邮箱ID号:/*发送邮箱的ID号*/ECanaMboxes.MBOX0.MID.all = 0xa0000000; //mid.aam=1 自动应答模式ECanaMboxes.MBOX1.MID.all = 0x9555AAA1;ECanaMboxes.MBOX2.MID.all = 0x9555AAA2;ECanaMboxes.MBOX3.MID.all = 0x9555AAA3;ECanaMboxes.MBOX4.MID.all = 0x9555AAA4;ECanaMboxes.MBOX5.MID.all = 0x9555AAA5;ECanaMboxes.MBOX6.MID.all = 0x9555AAA6;ECanaMboxes.MBOX7.MID.all = 0x9555AAA7;ECanaMboxes.MBOX8.MID.all = 0x9555AAA8;ECanaMboxes.MBOX9.MID.all = 0x9555AAA9;ECanaMboxes.MBOX10.MID.all = 0x9555AAAA;ECanaMboxes.MBOX11.MID.all = 0x9555AAAB;ECanaMboxes.MBOX12.MID.all = 0x9555AAAC;ECanaMboxes.MBOX13.MID.all = 0x9555AAAD;ECanaMboxes.MBOX14.MID.all = 0x9555AAAE;ECanaMboxes.MBOX15.MID.all = 0x9555AAAF;/*接收邮箱的ID号*/ECanaMboxes.MBOX16.MID.all = 0x80000000;ECanaMboxes.MBOX17.MID.all = 0x9555AAA1;ECanaMboxes.MBOX18.MID.all = 0x9555AAA1;ECanaMboxes.MBOX19.MID.all = 0x9555AAA1;ECanaMboxes.MBOX20.MID.all = 0x9555AAA1;ECanaMboxes.MBOX21.MID.all = 0x9555AAA1;ECanaMboxes.MBOX22.MID.all = 0x9555AAA1;ECanaMboxes.MBOX23.MID.all = 0x9555AAA1;ECanaMboxes.MBOX24.MID.all = 0x9555AAA1;ECanaMboxes.MBOX25.MID.all = 0x9555AAA1;ECanaMboxes.MBOX26.MID.all = 0x9555AAA1;ECanaMboxes.MBOX27.MID.all = 0x9555AAA1;ECanaMboxes.MBOX28.MID.all = 0x9555AAA1;ECanaMboxes.MBOX29.MID.all = 0x9555AAA1;ECanaMboxes.MBOX30.MID.all = 0x9555AAA1;ECanaMboxes.MBOX31.MID.all = 0x9555AAA1;在这里,邮箱号可以自己随便设定,就是一个标识符,要注意的是,该MID寄存器种地30~31位有特殊含义,参照书上所讲设定。
DSP与CAN总线的测速和远程传送一体化速度测量是控制工程的基本问题之一。
在许多情况下,测速信号需要远距离传送。
实现这个问题的一个主要方法是使用SoC(片上系统)芯片。
它所带的丰富外设改变了关于硬件和软件的观念。
搭建硬件系统变为对硬件结构的理解掌握,软件的编程也从算法编制为主变为部件设置为主,具有简捷、完整的特点,体现了芯片的技术优势。
SoC类的TMS320LF2407DSP芯片在测速和远程传送应用中的简捷一体化设计也体现了这一点。
1 相关系统结构 TMS320LF240 速度测量是控制工程的基本问题之一。
在许多情况下,测速信号需要远距离传送。
实现这个问题的一个主要方法是使用SoC(片上系统)芯片。
它所带的丰富外设改变了关于硬件和软件的观念。
搭建硬件系统变为对硬件结构的理解掌握,软件的编程也从算法编制为主变为部件设置为主,具有简捷、完整的特点,体现了芯片的技术优势。
SoC类的TMS320LF2407DSP芯片在测速和远程传送应用中的简捷一体化设计也体现了这一点。
1 相关系统结构TMS320LF2407所带有的事件管理器和CAN控制器模块为测速和远程传送提供了便利。
TMS320LF2407有2个事件管理器EVA和EVB,各有3个捕获单元。
对应6个捕获输入引脚CAPX(对EVA,X=1,2,3;对EVB,X=4,5,6)。
6个捕获输入引脚分别与QEPl/IOPA3、QEP2/IOPA4、IOPA5、QEP3/IOPE37、QEP4/IOPFO和IOPFl 共用。
当捕获输入引脚CAPX上检测到所选的跳变时,所选的GP定时器的计数值被捕获并存入到一个2级深的FIFO堆栈中。
TMS320LF2407的CAN控制器模块包括有邮箱和相应的控制/状态寄存器。
共有6个邮箱:2个接收邮箱(MBOX0、1),2个发送邮箱(MBOX4、5),2个可配置为接收或发送邮箱(MBOX2、3)。
TM$320LF2407的CAN控制器模块完全支持CAN2.0B协议。
基于DSP的电动汽车CAN总线通讯技术设计德国Bosch公司为了解决现代车辆中众多的控制和数据交换问题,开发出一种CAN(Controller AreaNetwork) 现场通讯结构. 硬件衔接容易,有良好的牢靠性、实时性和性能价格比. CAN总线能够满足现代通讯的需要,已成为工业数据总线通讯领域中最为活要跃的一支.其主要特点是: ①CAN总线为多主站总线,各节点均可在随意时刻主动向网络上的其它节点发送信息,不分主从,通信灵便; ②CAN总线采纳独特的非破坏性总线仲裁技术,优先级高的节点优先传送数据,能满足实时性要求; ③CAN总线具有点对点,一点对多点及全局广播传送数据的功能; ④CAN总线上每帧有效字节数最多为8个,并有CRC及其它校验措施,数据出错率极低,万一某一节点浮现严峻错误,可自动脱离总线,总线上的其它操作不受影响; ⑤CAN总线惟独两根导线,系统扩充时,可挺直将新节点挂在总线上即可,因此走线少,系统扩充简单,改型灵便;⑥CAN总线传输速度快,在传输距离小于40m时,最大传输速率可达1Mb/s. 正是因为CAN总线具有这些其它通信方式无法比拟的优点,使之成为控制系统的抱负总线.1 电动汽车对通讯网络的需求电动汽车因为储能设备容量有限,在运行过程中对能源的管理非常严格. 效率是衡量电动汽车系统性能的重要指标,国家863“十五”电动汽车重大专项要求系统额定效率为85% ,控制器的额定效率达到95%. 电动控制系统的动态信息必需具有实时性,各子系统需要将车辆的公共数据实时分享,如电机转速、车轮转换、油门踏板位置和刹车踏板位置等. 但不同控制单元的控制周期不同,数据转换速度、各控制指令优先级也不同,因此需要一种具有优先权竞争模式的数据交换网络,并且本身具有极高的通信速率. 此外,作为一种载人交通工具,电动汽车必需具有较好的舒服性,整车通讯系统必需具有很强的容错能力和迅速处理能力.目前,电动汽车的进展得到了各国的高度重视.电动汽车成为将来汽车进展的主流方向. 电动汽车内电气元件极多,需要实时传输和分享的数据无数.如何提高电动汽车通讯的实时性、牢靠性和应急处理能力成为电动汽车通讯的难点所在. 我们采纳TMS320LF2407型DS作为电动汽车通讯系统的主处理器,利用良好的迅速处理能力提高数据处理速度,从而提高通讯的实时性;利用DSP内嵌的CAN总线模块作为CAN的控制器,削减硬件的复杂性,从而提高通讯的牢靠性;通过软件设计紧张时刻屏蔽次要因素来提高电动汽车的应急处理能力.2 控制计划电动汽车总成控制我们采纳先进的含糊控制,采纳的控制器也是TMS320LF2407型的DSP. 对采集到的刹车信号,加速信号和反馈回的转速信号举行含糊处理,得到期望的转速信号,并将得到的转速值通过CAN 总线传送到电动机的控制机构,对电动机举行控制,满足驾驶员的驾驶意图. 同时管理灯光系统和屏幕显示系统. 屏幕显示系统实时显示电动汽车的运行状态. 详细控制计划1 所示. 图1 电动汽车控制系统结构框图3 电动汽车CAN总线通讯计划电动汽车控制需要良好的通讯协调性和运行牢靠性. 良好的通讯系统是实现电动汽车牢靠运行的关键. CAN总线结构是一种有效支持分布式控制或实时控制的串行通讯网络. 图2 是一个典型的电动汽车CAN 总线结构暗示图,包括整车动力部分的主电动机控制器、电池组管理系统、电动汽车屏幕显示系统等多个设备,这些子系统之间通过CAN举行数据通讯和指令传输. 每个节点设备都能够在脱离CAN 总线的状况下自立完成自身系统的运行,从而满足车辆运行平安性的需要. 同时,CAN总线也不会由于某个设备的脱离而浮现系统结构崩溃的现象.图2 电动汽车CAN 总线结构图4 CAN总线模块CAN 总线模块是DSP的一个16位的外设,是一个完整的CAN 控制器.除具有CAN 总线的基本功能外,还有一些特有功能,如:对象有六个邮箱,其数据长度为0~8 个字节,其中两个接收邮箱(0、1) ,两个发送邮箱(4、5) ,两个可配置为接收或发送邮箱(3、4) ;自动回复远程哀求功能;可编程的CAN 总线唤醒功能;自测试模式功能等. 对CAN 总线的拜访分为控制/ 状态寄存器的拜访和邮箱的RAM 拜访.CAN 总线控制模块的内存空间分配图3 所示.图3 CAN 总线内存空间分配CAN 控制器发送的信息帧有两种,一种是发送数据帧,一种是发送远程帧. 发送邮箱有邮箱4 和邮箱5以及被配置为发送方式的邮箱2 和邮箱3. 发送数据帧时,在数据写到发送邮箱的数据区后,假如相应的发送哀求位使能,则数据帧被发送到CAN 总线上. 数据帧的数据区可以通过软件设置成1~8 个字节. 数据帧的格式4 所示. 图4 CAN 总线数据帧CAN 总线控制器的接收邮箱有邮箱0和邮箱1及被配置为接收方式的邮箱2 和邮箱3. CAN 控制器在接收信息时,首先要将接收信息的标记符与相应接收邮箱的标记符举行比较,惟独标记符相同的信息才干被接收. CAN 总线控制器的接收寄存器使得接收邮箱可以忽视更多的位来接收信息. 但是,假如当接收屏蔽使能位(AME) 为0 时,则局部接收屏蔽寄存器将失效. 惟独配置为发送方式的邮箱2 和邮箱3 才可以接收自动应答远程帧. 当邮箱接收到远程帧后,接收节点将自动发送一个数据帧作为应答.5 接口电路设计因为DSP 本身内带CAN 总线模块,所以不需要特地的CAN 控制器,DSP 本身不具有CAN ,需要外接CAN 收发器82C250 ,中间用法光电隔离器6N137. 假如距离很短,可以不用法光电隔离器. DSP与光电隔离器和CAN 收发器硬件衔接图5 所示.图5 DSP 与CAN 总线硬件衔接图6 电动汽车总成控制器CAN通讯的软件实现电动汽车总成控制器是电动汽车的心脏,它需要常见的接收和发送数据对电动汽车举行实时控制和检测. 发送信息采纳查询方式,接收信息采纳中断方式. 通过设定不同大事的不同优先级来确定信息的接收和发送挨次,同时增强紧张大事处理程序来提高控制器处理紧张大事的能力,保证车辆和人身平安. 紧张大事处理程序是当紧张大事发生时,如执行器件损坏,急刹车和急转弯等,通过临时屏蔽低优先级大事,如电池电量检测, 显示系统等,使控制器有足够的时光处理紧张大事,以提高控制器的实时控制能力和应急处理能力. 控制器软件流程图6 所示.图6 控制器软件流程图7 结论目前,现场总线在自动化领域中迅速进展,CAN总线作为一种很有影响的现场总线,采纳了许多新的技术和设计,使CAN 总线成为最有进展前途的现场总线之一. CAN 总线以其高实时性、高牢靠性和高灵便性,在工业自动化控制中得到了越来越多的应用. 本文应用DSP 控制器作为CAN 总线的微处理器,利用DSP 很强的数据处理能力和CAN 总线传输速率高、牢靠性高的特点,对电动汽车内复杂的通讯系统提出解决计划. 试验证实,本系统不但解决了电动汽车通讯对实时性的要求,而且牢靠性和稳定性都得到了提高.。
Electronic Component&Device Applications doi:10.3969/j.issn.1563-4795.2010.02.02266Vol.12No.2Feb.2010第12卷第2期2010年2月 2010.2ElectronicComponent&DeviceApplications度、采样次数等参数。
当完成以上CAN配置之后,还需按照图5所示的流程图来完成数据的发送与接收配置,同时初始化邮箱。
邮箱初始化主要是设置邮箱的标识符和控制域(即发送的是远程帧还是数据帧),以及对相应的邮箱赋初值。
数据接收时,所接收到的信息的标识符必须与相应的接收邮箱的标识符相同,否则该信息将被滤除。
这里,数据的发送与接收请求均采用标志位查询方式。
按照以上步骤设置好后,接着就是对数据的发送与接收请求进行配置。
数据接收可采用中断方式,中断配置可在主程序流程中进行配置。
正确配置中断入口地址及中断函数,并开放CAN接收中断后,还要分别配置不同的数据帧,包括标准帧和扩展帧,以及数据帧和远程请求帧。
图6表示为上位机接收数据的调试界面。
可以看到,CAN通信和下位机间的数据通信,可以写数据并发送给下位机,同时也可接收下位机的数据来验证电路及软件的正确性。
5结束语利用TMS320F2812内嵌的eCAN模块可使得硬件电路设计更为简单而可靠,而且性能也较已有的DSP内嵌的CAN控制器有较大的提高。
同时,采用C语言编程,则可使得程序的设计难度降低,提高程序的可维护性并缩短开发时间。
(a)CAN发送流程(b)CAN接收流程图5CAN系统的发送和接收流程(上接第65页)68。
Can.cpp模块设计说明1. 总则:传送故障记录数据或运行记录数据时,不传送参数数据和实时数据。
传送参数数据和实时数据可同时传送。
在界面层:1.读故障记录数据BUTTON和运行记录数据BUTTON和记录实时数据BUTTON没有按下,参数没有操作时,才能按下读故障记录数据BUTTON或运行记录数据BUTTON。
否则弹出信息框。
2.按下故障记录数据BUTTON后,把运行记录数据BUTTON和记录实时数据BUTTON变灰,参数MENU和参数界面上的读和修改BUTTON变灰,故障记录数据读完后,上述按钮复原。
对按下运行记录数据BUTTON作同样处理。
3.按下记录实时数据BUTTON时,把故障记录数据BUTTON和运行记录数据BUTTON变灰。
按下停止记录实时数据BUTTON时,把故障记录数据BUTTON和运行记录数据BUTTON复原。
4.对参数上载和修改时,把故障记录数据BUTTON和运行记录数据BUTTON变灰,完成操作后把故障记录数据BUTTON和运行记录数据BUTTON复原。
CAN和以太网类似,相应7种事件:关闭CAN、实时数据请求、读参数、写参数、发送心跳报文,读故障记录,读运行记录。
2 功能模块类名为:Class Can类对象定义在Can.cpp中,是一个全局对象。
Class Lan g_Can;该模块的功能为:1.通过USB转CAN与下位机进行实时数据请求和参数的上传下载, 读故障记录,读运行记录;2.通过PCI插卡与下位机进行实时数据请求和参数的上传下载, 读故障记录,读运行记录;3.出错处理。
3 流程逻辑CAN部分由线程CanThread()完成5个事件。
OpenCan(DWORD DevType,DWORD DevIndex,DWORD Reserved)函数通过调用API函数VCI_OpenDevice(DWORD DevType,DWORD DevIndex,DWORD Reserved)打开CAN;CloseCan(DWORD DevType,DWORD DevIndex)函数通过调用API函数VCI_CloseDevice(DWORD DevType,DWORD DevIndex)关闭CAN;StartCanThread()函数用于开启Can线程;SuspendedCanThread()函数用于关闭线程;CanThread()为Can线程函数,用于执行五种事件:关闭Can、发送实时数据请求、读参数、写参数和发送心跳报文。
计算机与现代化 2009年第12期J I S UANJ I Y U X I A NDA I HUA总第172期文章编号:100622475(2009)1220130203收稿日期:2009210212作者简介:鹿卉芬(19662),女,江苏徐州人,徐州师范大学现代教育技术中心实验师,研究方向:计算机应用;刘洪模(19832),男,江苏徐州人,上海理工大学光电信息与计算机工程学院硕士研究生,研究方向:嵌入式系统。
基于DSP 的C AN 总线网络与Ethernet 数据实时通信实现鹿卉芬1,刘洪模2(1.徐州师范大学现代教育技术中心,江苏徐州221009;2.上海理工大学光电信息与计算机工程学院,上海200093)摘要:针对Ethernet 通信响应的不确定性这个缺点,对实现CAN 总线网络与Ethernet 数据实时通信做了深入的研究,提出了C AN 总线网络与Ethernet 数据实时通信方案。
采用当今最先进的DSP 技术,从硬件和软件设计两个方面提出了可行策略,保证网络高速率通信及实时性。
关键词:CAN 总线;DSP;Ethernet;数据通信中图分类号:TP332;TP393 文献标识码:A do i:10.3969/j .issn .100622475.2009.12.036Rea l 2ti m e Comm un i ca ti on Between CAN Bus Network and Ethernet Da t a Ba sed on D SPLU Hui 2fen 1,L I U Hong 2mo2(1.Modern Educati onal Technol ogy Center of Xuzhou Nor mal University,Xuzhou 221009,China;2.School of Op tical 2Electrical and Computer Engineering,University of Shanghai for Science and Technology,Shanghai 200093,China )Abstract:The uncertainty of Ethernet communicati on is one of the most maj or obstacles .I n vie w of existing obstacles,the paper deep ly studies the real 2ti m e data communicati on bet w een C AN bus and Ethernet,p r oposes a real 2ti m e communicati on p r ogram of C AN bus net w ork and Ethernet data,and puts for ward a DSP 2based viable strategy fr om both hard ware design and s oft w are design t o ensure high 2s peed and real 2ti m e net w ork communicati on .Key words:C AN field bus;DSP;Ethernet;data communicati on0 引 言长期以来,以太网通信响应的不确定性是它在工业现场设备中应用的致命弱点和重要障碍之一。
#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File// Prototype statements for functions found within this file.void mailbox_check(int32 T1, int32 T2, int32 T3);void mailbox_read(int16 i);// Global variable for this exampleUint32 ErrorCount;Uint32 PassCount;Uint32 MessageReceivedCount;Uint32 TestMbox1 = 0;Uint32 TestMbox2 = 0;Uint32 TestMbox3 = 0;void main(void){Uint16 j;// eCAN控制寄存器需要使用32位的读/写访问。
因此,为此示例创建一组影子寄存器。
这些影子寄存器将用于确保访问是32位而不是16位。
struct ECAN_REGS ECanbShadow;// 步骤1.初始化系统控制:PLL,看门狗,启用外设时钟。
该示例功能可在DSP2833x_SysCtrl.c文件中找到。
InitSysCtrl();// 步骤2.初始化GPIO:在DSP2833x Gpio.c文件中找到该示例函数,并说明如何将GPIO设置为默认状态。
// InitGpio(); // Skipped for this example// 在这个例子中,使用GPIO寄存器在这里配置CAN引脚。
这个函数在DSP2833x_ECan.c中找到InitECanGpio();// 步骤3。
清除所有中断并初始化PIE矢量表:禁用CPU中断DINT;// 将PIE控制寄存器初始化为默认状态。
默认状态是禁止所有的PIE中断并清除标志。
这个函数可以在DSP2833x_PieCtrl.c文件中找到。
InitPieCtrl();// 禁用CPU中断并清除所有CPU中断标志:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes.// The shell ISR routines are found in DSP2833x_DefaultIsr.c.// This function is found in DSP2833x_PieVect.c.InitPieVectTable();// 步骤4.初始化所有器件外设:此功能可在DSP2833x_InitPeripherals.c中找到.// InitPeripherals(); // Not required for this example// 第5步。
用户特定的代码,启用中断:MessageReceivedCount = 0;ErrorCount = 0;PassCount = 0;// eCAN控制寄存器需要32位访问。
如果要写入单个位,编译器可能会将此访问分解为16位访问。
此处介绍的一种解决方案是使用影子寄存器来强制32位访问。
// 将整个寄存器读入一个影子寄存器。
这个访问将是32位。
更改所需的位并将其值复制到32位写入的eCAN寄存器。
// 为eCAN传输配置eCAN RX和TX引脚EALLOW;ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all; //eCAN I/O控制寄存器ECanbShadow.CANTIOC.bit.TXFUNC = 1; //CANTX引脚用于CAN发送功能 ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all; //eCAN I/O控制寄存器ECanbShadow.CANRIOC.bit.RXFUNC = 1; //CANRX引脚用于CAN发送功能 ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;EDIS;//禁用所有的邮箱。
//因为写入整个寄存器(而不是一个位域),影子寄存器是不需要的。
ECanbRegs.CANME.all = 0; //邮箱激活寄存器:激活或者屏蔽独立的邮箱//邮箱可以一次写入16位或32位。
写入TRANSMIT邮箱的MSGID字段MBOX0-15。
ECanbMboxes.MBOX0.MSGID.all = 0x9555AAA0; //邮箱标识符寄存器ECanbMboxes.MBOX1.MSGID.all = 0x9555AAA1;ECanbMboxes.MBOX2.MSGID.all = 0x9555AAA2;ECanbMboxes.MBOX3.MSGID.all = 0x9555AAA3;ECanbMboxes.MBOX4.MSGID.all = 0x9555AAA4;ECanbMboxes.MBOX5.MSGID.all = 0x9555AAA5;ECanbMboxes.MBOX6.MSGID.all = 0x9555AAA6;ECanbMboxes.MBOX7.MSGID.all = 0x9555AAA7;ECanbMboxes.MBOX8.MSGID.all = 0x9555AAA8;ECanbMboxes.MBOX9.MSGID.all = 0x9555AAA9;ECanbMboxes.MBOX10.MSGID.all = 0x9555AAAA;ECanbMboxes.MBOX11.MSGID.all = 0x9555AAAB;ECanbMboxes.MBOX12.MSGID.all = 0x9555AAAC;ECanbMboxes.MBOX13.MSGID.all = 0x9555AAAD;ECanbMboxes.MBOX14.MSGID.all = 0x9555AAAE;ECanbMboxes.MBOX15.MSGID.all = 0x9555AAAF;// 写入RECEIVE邮箱的MSGID字段MBOX16-31ECanbMboxes.MBOX16.MSGID.all = 0x9555AAA0;ECanbMboxes.MBOX17.MSGID.all = 0x9555AAA1;ECanbMboxes.MBOX18.MSGID.all = 0x9555AAA2;ECanbMboxes.MBOX19.MSGID.all = 0x9555AAA3;ECanbMboxes.MBOX20.MSGID.all = 0x9555AAA4;ECanbMboxes.MBOX21.MSGID.all = 0x9555AAA5;ECanbMboxes.MBOX22.MSGID.all = 0x9555AAA6;ECanbMboxes.MBOX23.MSGID.all = 0x9555AAA7;ECanbMboxes.MBOX24.MSGID.all = 0x9555AAA8;ECanbMboxes.MBOX25.MSGID.all = 0x9555AAA9;ECanbMboxes.MBOX26.MSGID.all = 0x9555AAAA;ECanbMboxes.MBOX27.MSGID.all = 0x9555AAAB;ECanbMboxes.MBOX28.MSGID.all = 0x9555AAAC;ECanbMboxes.MBOX29.MSGID.all = 0x9555AAAD;ECanbMboxes.MBOX30.MSGID.all = 0x9555AAAE;ECanbMboxes.MBOX31.MSGID.all = 0x9555AAAF;// 将邮箱0-15配置为Tx,将16-31配置为Rx// 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。
ECanbRegs.CANMD.all = 0xFFFF0000; //邮箱方向寄存器// 启用所有邮箱// 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。
ECanbRegs.CANME.all = 0xFFFFFFFF;// 指定8位将被发送/接收ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8; //消息控制寄存器,DLC位中的数字决定了被发送或接受的字节数,合适的范围是0-8. ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX2.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX3.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX4.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX5.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX6.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX7.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX8.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX9.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX10.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX11.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX12.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX13.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX14.MSGCTRL.bit.DLC = 8;ECanbMboxes.MBOX15.MSGCTRL.bit.DLC = 8;// 设置为没有请求远程帧// 由于RTR位在复位时未定义,因此必须将其初始化为适当的值ECanbMboxes.MBOX0.MSGCTRL.bit.RTR = 0; //消息控制寄存器远程发送请求位ECanbMboxes.MBOX1.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX2.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX3.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX4.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX5.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX6.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX7.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX8.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX9.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX10.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX11.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX12.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX13.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX14.MSGCTRL.bit.RTR = 0;ECanbMboxes.MBOX15.MSGCTRL.bit.RTR = 0;// 写入邮箱MBOX0-15的RAM字段// 消息数据寄存器ECanbMboxes.MBOX0.MDL.all = 0x9555AAA0;ECanbMboxes.MBOX0.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX1.MDL.all = 0x9555AAA1;ECanbMboxes.MBOX1.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX2.MDL.all = 0x9555AAA2;ECanbMboxes.MBOX2.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX3.MDL.all = 0x9555AAA3;ECanbMboxes.MBOX3.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX4.MDL.all = 0x9555AAA4;ECanbMboxes.MBOX4.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX5.MDL.all = 0x9555AAA5;ECanbMboxes.MBOX5.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX6.MDL.all = 0x9555AAA6;ECanbMboxes.MBOX6.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX7.MDL.all = 0x9555AAA7;ECanbMboxes.MBOX7.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX8.MDL.all = 0x9555AAA8;ECanbMboxes.MBOX8.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX9.MDL.all = 0x9555AAA9;ECanbMboxes.MBOX9.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX10.MDL.all = 0x9555AAAA;ECanbMboxes.MBOX10.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX11.MDL.all = 0x9555AAAB;ECanbMboxes.MBOX11.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX12.MDL.all = 0x9555AAAC;ECanbMboxes.MBOX12.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX13.MDL.all = 0x9555AAAD;ECanbMboxes.MBOX13.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX14.MDL.all = 0x9555AAAE;ECanbMboxes.MBOX14.MDH.all = 0x89ABCDEF;ECanbMboxes.MBOX15.MDL.all = 0x9555AAAF;ECanbMboxes.MBOX15.MDH.all = 0x89ABCDEF;// 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。