This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8035万:TMS2.8035万双向CAN通信

Guru**** 2595805 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/667283/tms320f28035-tms28035-two-way-can-communication

部件号:TMS320F2.8035万
主题: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++;
   }
}

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    阿卜杜勒
    CAN邮箱类似于RAM。 也就是说,存储在该位置的任何数据都将保留在该位置,直到新数据覆盖它。 读取数据时,数据不会"消失"。 如果您不希望"旧"数据继续保留在RAM中,则应用程序需要用一些已知值(例如,所有零)覆盖它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,感谢您的回复。
    但我所面对的问题是,当我关闭发送器端微控制器时,接收器端微控制器检查可以接收功能,这就是为什么我在接收器端连续接收数据,即使发送器不发送。在这种情况下,我如何接收虚拟数据 或全零。 以上代码均正确,或需要进行一些更改,如果代码有任何错误,请予以更正。

    这就是我在接收器端清除MDL和MDH寄存器的原因,但没有成功。
    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编号)

    /******************************* /
    mailbox->mDL.all=0;
    邮箱->mDH.all=0;
    /******************************* /
    }// rcv MBX的MSGID作为MDL数据传输。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    阿卜杜勒

               我意识到我在上一个职位上发言有误。 CPU对接收邮箱RAM没有写访问权限。 只有CAN模块(接收到数据帧时)可以写入Receive-MBX-RAM。

     

    否,您不是"在接收器端连续接收数据,即使发射器未发送数据"。 如前所述,收到的内容将保留在mailbox-RAM中,直到新数据覆盖它。 这就是你所看到的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请尝试此实验。 立即重新配置MBX传输方向,查看这两个指令是否将MBX RAM归零。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    阿卜杜勒
    我有一段时间没有收到您的信息,所以我想您能够了解问题所在。 如果情况并非如此,请告诉我。 我将继续并关闭帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉回复延迟...实际上我正在忙于另一个项目。
    什么是重新配置。这意味着我必须将TX邮箱方向更改为Rx邮箱,反之亦然。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    否。您提到您希望阅读完Rcv中的数据后将其"清除"。 您可以通过将其配置为TX邮箱并清除RAM来执行此操作。 但在这段时间里,您会冒丢失消息的风险。 我对您为何要清除RCV MBX RAM感到困惑。 您可以在以下两种情况下读取RCV MBX RAM:(a)收到邮箱中断或(b)轮询RMP位并看到它切换到1。 在这两种情况下,操作仅在收到新数据时启动,因此无法读取"旧"数据。 我强烈建议您查看我的app.note SPRS876中的示例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,你说的对,如果我轮询RMP位,会更好。 让我尝试一下,然后我就会说出我的结果
    非常感谢。请提供您的app.note SPRS876的链接或pdf。实际上,我在互联网上搜索但尚未找到。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sameer,

    它是SPRA876。 我对错误输入LIT #表示非常抱歉。 链接是 http://www.ti.com/lit/an/spra876b/spra876b.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,我将检查此文档。