主题:controlSUITE中讨论的其他部件
您好,
我正在尝试为 eCAN通信配置两个TMS320f2.8035万。(CANTX的MCU0和CANRX的MCU1)
我使用了controlSuit中DSP和环回示例的数据表来配置通信,步骤如文档末尾所写。
通过监视窗口,当我从MCU0传输单字节数据时,我正在MCU1上接收正确的数据。 但当我只关闭MCU0电源时 ,MU1中的MDL和MDH注册显示了我在以前的收件中收到的旧数据。 这就是为什么我在 MCU1 MDL和MDH寄存器中连续看到数据 的原因,即使 MCU0 没有发送。这就是为什么我要在下一个接收字节之前清除MCU1中的MDL和MDH寄存器。那么我该怎么做? 这意味着当我关闭唯一的MCU0时,我不想接收以前的数据。
这是我的代码。
参考:C:\ti\controlSUITE\DEVICE_SUPPORT\F2803x\V130\DSP2803x_Examples_ccsv5\eCAM_back2back</s>2803
MCU0发射器侧代码:
Void主(void)
{
UINT16 j;
结构ECAN_regs ECanaShadow;
InitSysCtrl();
InitECanGpio();
色调;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectorTable();
MessageReceivedCount =0;
ErrorCount = 0;
PassCount = 0;
InitECana();// 初始化eCAN-A模块
//邮箱一次可以写入16位或32位
//写入到Transmit mailboxe MBOX0的MSGID字段
ECanaMboxes.MBOX0.MSGID.ALL = 0x9555AAA0;
//将邮箱0配置为Tx,将16配置为Rx
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
ECanaRegs.CANMD.ALL = 0xFFFF0000;
//启用所有邮箱*/
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
ECanaRegs.CANME.ALL = 0xFFFFFFFF;
//指定将发送/接收8位
ECanaMcboxes.MBOX0.MSGCTRL.bit.DLC = 8;
//写入MBOX0 -15的邮箱RAM字段
ECanaMboxes.MBOX0.MDL.ALL = 0x9555AAA0;
ECanaMbboxes.MBOX0.MDH.all = 0x89ABCDEF;
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
EALLOW;
ECanaRegs.CANMIM.ALL = 0xFFFFFFFF;
//将eCAN配置为自检模式
//启用eCAN的增强功能。
EALLOW;
ECanaShade.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShadow.CANmc.bit.stm = 1; //将CAN配置为自检模式
ECanaRegs.CANMC.ALL = ECanaShadow.CANMC.ALL;
EDIS;
//开始传输
对于(;;)
{
ECanaRegs.CANTRS.ALL = 0x0000FFFF; //为所有传输邮箱设置TRS
while (ECanaRegs.Canta.all != 0x0000FFFF ){}// 等待设置所有Tan位。
ECanaRegs.Canta.all = 0x0000FFFFFF; //清除所有Tan
消息接收计数+;
Delay_us (90万)
}
}
/*************************************************************************** /
/*************************************************************************** /
MCU1接收器侧代码:
Void主(void)
{
UINT16 j;
结构ECAN_regs ECanaShadow;
InitSysCtrl();
InitECanGpio();
色调;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectorTable();
MessageReceivedCount =0;
ErrorCount = 0;
PassCount = 0;
InitECana();// 初始化eCAN-A模块
//写入到Receive mailboxe MBOX16的MSGID字段
ECanaMboxes.MBOX16.MSGID.ALL = 0x9555AAA0;
//将邮箱0配置为Tx,将16配置为Rx
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
ECanaRegs.CANMD.ALL = 0xFFFF0000;
//启用所有邮箱*/
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
ECanaRegs.CANME.ALL = 0xFFFFFFFF;
//指定将发送/接收8位
ECanaMcboxes.MBOX0.MSGCTRL.bit.DLC = 8;
//因为此写入是到整个寄存器(而不是位
//字段)不需要影子寄存器。
EALLOW;
ECanaRegs.CANMIM.ALL = 0xFFFFFFFF;
//将eCAN配置为自检模式
//启用eCAN的增强功能。
EALLOW;
ECanaShade.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShadow.CANmc.bit.stm = 1; //将CAN配置为自检模式
ECanaRegs.CANMC.ALL = ECanaShadow.CANMC.ALL;
EDIS;
//开始接收
对于(;;)
{
//从接收邮箱读取并开始检查数据*/
对于(j=16;j<17;j++) //读取并检查16个邮箱
{
mailbox_read(j); //此功能读取指定的邮箱数据
mailbox_check (TestMbox1,TestMbox2,TestMbox3);//检查接收到的数据
}
DELAY _US(90万) ;
}
}
//此函数读取所示的内容
//按邮箱号码(MBXnbr)。
void mailbox_read(Int16 MBXnbr)
{
易失性结构MBOX *邮箱;
邮箱=&ECanaMcboxes.MBOX0 + MBXnbr;
TestMbox1 =邮箱->MDL.all;//= 0x9555AAAn (n是MBX编号)
TestMbox2 =邮箱->MDH.ALL;//= 0x89ABCDEF (A常量)
TestMbox3 =邮箱->MSGID.ALL;//= 0x9555AAAn (n是MBX编号)
}// rcv MBX的MSGID作为MDL数据传输。
void mailbox_check (Int32 T1, Int32 T2, Int32 T3)
{
IF ((T1 != T3)||(T2 != 0x89ABCDEF))
{
ErrorCount++;
}
否则
{
PassCount++;
}
}
谢谢。