工具/软件:Code Composer Studio
您好!
我想使用 C2000 F28069M ECAN 将 CAN 总线收发器与 Arduino Due 相连。
对于硬件部件、收发器 TX/RX 引脚与每个 Due TX/RX 引脚连接、CANH/CANL 与 F28069M CANH/CANL 连接。
对于软件部分、我已经成功运行 了 F28069M ECanBack2Back 自检、但现在我需要与 Due 进行通信、所以我注释掉 ECanaShadow.CANMC.bit.STM = 1;
对于 My test、我将 Mailbox0设置为 transmit、由于它是接收器、当 CCS 处于调试模式时、调试调用堆栈始终停止、如下所示、这意味着 transmit 不起作用。
另一方面、我还尝试将 Mailbox0设置为 接收 器、 并将其设置为发送、但 F28069M 不接收任何数据。
这是我从 controlsuit F28069M ECanBack2Back 示例中获取的代码、并迁移到 motorware proj.1。
#include //模块 #include "sw/modules/math/src/32b/math.h" #include "sw/modules/Memcopy/src/Memcopy.h" #include "sw/drivers/Can/src/32b/f28x/f2806x/can.h" #structure ma data_section (EcanaRegs、"Ecana_review") ;#volatile exeMECt/ematile drivers/es/ ematile pragram_ex/es/ eect.h prages/#structures/#structures/#structures/ reviewchines/#structions./es/ volatile plates/ emines/ reviews #structions.prages/ reviews #reviews #reviews #reviewchines/ emines/ emines/ eminations.prages //定义 #define LED_BLINK FREQ_Hz 5 // //全局变量 uint_least32_t gLEDcnt = 0; //用于对 ISR 速率进行分频的计数器、用于使 LED HAL_Handle 目测闪烁; //逆变器硬件抽象层 USER_Params gUserParams 的句柄; //包含 user.h 设置 HAL_PwmData_t gPwmData ={0、0、0}; //包含全局 Q 格式 HAL_AdcData_t gAdcData ={0、0、0、0、0、0、0}的 PWM 占空比; //包含全局 Q 格式的电流和电压 ADC 读数 volatile motor_Vars_t gMotorVars = motor_Vars_init; #ifdef 闪存 //用于在闪存中运行后台,以及 RAM 中的 ISR extern uint_least16_t_t * 错误 RamfuncsSpiStart、* RamfuncsLoadEnd、* RamfuncsStart、* Ramfuncsstunt Start、* Ramfuncsv301 v1spi_lev/v8301 v32_dift_di_rfuv301spi_rf_rf_rf_rf_v8v301spi_d/#v8t_di_rf_r uint_least32_t PassCount; uint_least32_t MessageReceivedCount; uint_least32_t TestMbox1 = 0; uint_least32_t TestMbox2 = 0; uint_least32_t TestMbox3 = 0; int I、j; 长循环计数= 0; int MBX_DATA[32];//此数组存储要传输的数据 // // 此文件中找到的函数的函数// prototype 语句。 void mailbox_check (int_least32_t t1、int_least32_t t2、int_least32_t t3); void mailbox_read (int_least16_t i); void InitECana (void); void main (void) { uint_least16_t j; MessageReceivedCount = 0; 错误计数= 0; PassCount = 0; struct ECAN_REGS ECanaShadow; //仅在从闪存运行时使用 //请注意变量 FLASH 由工程 #ifdef FLASH 定义 //将时间关键代码和闪存设置代码复制到 RAM // RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart //链接器创建符号。 请参阅链接器文件。 Memcopy ((uint_least16_t_t *)&RamfuncsLoadStart、(uint_least16_t_t *)&RamfuncsLoadEnd、(uint_least16_t_t *)&RamfuncsRunErrorStart; #endif //初始化硬件层 halHandle = Ut_UserCode (如果 用户代码不是变量)/UserUserCode、则为全局变量/getCode (错误)/UserCode)/UserCode (如果用户代码)/UserOutputs (如果用户代码)、则为错误代码/getCode (错误) { for (;;) { gMotorVars.Flag_enableSys = false; } } //初始化用户参数 user_setParams (&gUserParams); //设置硬件抽象层参数 HAL_setParams (halHandle、&gUserParams); #ifdef Launchpad //设置 GPIO 0和1作为仅在项目 lab1中使用的输出。 //这是 Launchpad 特有的、因为 PWM 通道也使用 LaunchPad 的 LED。 HAL_setupLaunchPadGpio0and1 (halHandle); #endif //设置故障 HAL_setupFos箱(halHandle); //初始化中断矢量表 HAL_initIntVectorTable (halHandle); //启用 ADC 中断 HAL_enableAdcInts (halHandle); //启用全局中断 HAL_initInteHandle (halt ) ;//启用 v301 veHandle (halt veSpinvoltle);//启用 veSpinvoltle v1v301v1 vePhorePhorePhorePhorePhorePhorePhorePhoreSpinvolts (env1);//启用 v1 v1 vehalls (envePhoreSpinvolts (env1) #endif InitECANA (); ECANaMboxes.MBOX0.MSGID.all = 0x9555AAA0; ECANaRegs.CANMD.bit.md0 = 0 //0 -> Tx 1 -> Rx //启用所有邮箱*// 因为此写入是对整个寄存 器的(而不是位//字段)。 ECanaShady.CANME.ALL = ECanaRegs.CANME.ALL; ECanaShadure.CANME.ALL = 0xFFFFFFFF; ECanaRegs.CANME.ALL = ECanaShady.CANME.ALL; ECanaMboxs.MBOX0.MSGCTRL.bit.DLC = 8; EALLOW; /******** 注释掉部分******** /*ECANaRegs.CANMIM.ALL = 0xFFFFFFFF; //将 eCAN 配置为自检模式 //启用 eCAN 的增强功能。 EALLOW; ECANaShady.CANMC.ALL = ECANaRegs.CANMC.ALL; ECANShady.CANMC.bit.STM = 1;//将 CAN 配置为自检模式 ECANaRegs.CANMC.ALL = ECANaShadure.CANMC.ALL; EDIS;*/ for (;) { ECANaMboxs.MBOX0.MDL.ALL = 12345678; ECANaMboxs.MBOX0.MDH.ALL = 0x89ABCDEF; ECANaRegs.CANTRS.bit.TRS0 = 1; while (ECanaRegs.Canta.bit.TA0!= 1){}//等待所有 Tan 位被置位。 ECanaRegs.Canta.bit.TA0 = 1;//清除所有 Tan for (j=0;j<1;j++) //读取并检查16个邮箱 { mailbox_read (j); //此 func 读取指定的邮箱数据 Mailbox_check (TestMbox1、TestMbox2、TestMbox3);//检查接收到的数据 } } 中断无效 mainISR (void) { //切换状态 LED if (gLEDcnt++>(uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK FREQ_Hz) ){ HAL_TOGLELed (halHandle、(GPIO_Number_e) HAL_GPIO_LED2); gLEDcnt = 0; } //确认 ADC 中断 HAL_acqAdcInt (halHandle、ADC_IntNumber_1); //转换 ADC 数据 HAL_readAdcData (halHandle、&gAdcData); // ADC 处理和 PWM 结果代码在此处// 写入 PWM 比较值 HAL_writePwmData (halt、&gAdcData );// volatile rupt_mrupt_misr (nstend) 邮箱=&ECanaMboxs.MBOX0 + MBXnbr; TestMbox1 = Mailbox->MDL.all;//= 0x9555AAn (n 是 MBX 编号) TestMbox2 = Mailbox->MDH.all;//= 0x89ABCDEF (常量) TestMbox3 =->MMSx n = 0xMQDN/ MQn =所有的数据传输为0xMMBx。 void mailbox_check (int_least32_t t1、int_least32_t t2、int_least32_t t3) { if ((T1!= T3)||(T2!= 0x89ABCDEF)) { 错误计数++; } 其他 { PassCount++; } } 空 InitECana (空) //初始化 eCAN-A 模块 { /*为 CAN 控制寄存器创建影子寄存器结构。 这是 因为只允许对这些寄存器进行32位访问。 16位访问 这些寄存器可能会损坏寄存器内容或返回 错误数据。 * struct eCAN-regs ECanaShadow; EALLOW; // asm (" asm (" EALLOW")")启用对受保护位的访问 /*使用 eCAN 寄存器为 CAN 操作配置 eCAN RX 和 TX 引脚*/ ECanaShady.CANTIOC.ALL = ECanaRegs.CANTIOC.ALL; ECanaShady.CANTIOC.bit.TXFUNC = 1; ECANaRegs.CANTIOC.ALL = ECANaShady.CANTIOC.ALL; ECanaShady.CANRIOC.ALL = ECanaRegs.CANRIOC.ALL; ECanaShady.CANRIOC.bit.RXFUNC = 1; ECANaRegs.CANRIOC.ALL = ECANaShady.CANRIOC.ALL; /*将 eCAN 配置为 HECC 模式-(需要访问邮箱16至31)*/ // HECC 模式也启用时间戳功能 ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL; ECanaShading.CANMC.bit.SCB = 1; ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL; /*将"消息控制寄存器"的所有位初始化为零*// MSGCTRL 寄存器的某些位出现在未知状态。 为了正常运行 、// MSGCTRL 的所有位(包括保留位)必须初始化为零 ECANaMboxs.MBOX0.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX1.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX2.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX3.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX4.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX5.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX6.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX7.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX8.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX9.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX10.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX11.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX12.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX13.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX14.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX15.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX16.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX17.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX18.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX19.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX20.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX21.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX22.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX23.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX24.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX25.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX26.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX27.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX28.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX29.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX30.MSGCTRL.ALL = 0x00000000; ECANaMboxs.MBOX31.MSGCTRL.ALL = 0x00000000; // Tan、RMPn、GIFn 位在复位时都为零、并且作为 预防措施再次被清零//。 ECANARegs.CANTA.ALL = 0xFFFFFFFF;//清除所有 Tan 位*/ ECANaRegs.CANRMP.ALL = 0xFFFFFFFF;//清除所有 RMPn 位*/ ECANaRegs.CANGIF0.ALL = 0xFFFFFFFF;//清除所有中断标志位*/ ECANaRegs.CANGIF1.ALL = 0xFFFFFFFF; /*为 eCANA*/配置位定时参数 ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL; ECanaShading.CANMC.bit.CCR = 1; //设置 CCR = 1 ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL; //等待 CPU 被授予更改配置寄存器的权限 操作 { ECanaShady.canes.all = ECanaRegs.canes.all; } while (ECanaShading.canes.bit.CCE!= 1); //等待 CCE 位被置位。 ECanaShady.CANBTC.ALL = 0; /*以下块用于80MHz SYSCLKOUT。 (40MHz CAN 模块时钟位速率= 1Mbps 请参阅文件末尾的注释。 * ECanaShady.CANBTC.bit.BRPREG = 1; ECANaShady.CANBTC.bit.TSEG2REG = 4; ECANaShady.CANBTC.bit.TSEG1REG = 13; ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL; EALLOW; ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL; ECanaShading.CANMC.bit.CCR = 0; //设置 CCR = 0 ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL; //等待 CPU 不再具有更改配置寄存器的权限 操作 { ECanaShady.canes.all = ECanaRegs.canes.all; } while (ECanaShading.canes.bit.CCE!= 0); //等待 CCE 位被清零。 /*禁用所有邮箱*/ ECANaRegs.CANME.ALL = 0; //在写入 MSGID 之前需要 //EDIS; }
对于 Arduino 代码、我使用来自 GitHub 的 Collin80/D到期 CAN - CAN_Echo 测试示例。
有人可以帮助我完成沟通吗?
谢谢!
