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.

[参考译文] TMS320F28069M:可以在 TMS320F8069M 和 TMS570LS4x 之间进行通信

Guru**** 2541030 points
Other Parts Discussed in Thread: CONTROLSUITE, HALCOGEN, SN65HVD234, ISO1050

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/670701/tms320f28069m-can-communicaton-between-tms320f8069m-and-tms570ls4x

器件型号:TMS320F28069M
主题中讨论的其他器件:controlSUITEHALCOGENSN65HVD234ISO1050

您好!

我使用的是 LAUNCHXL28069M 套件以及开发板、其中包含 用于 CANBus 通信的 TMS570LS4x 微控制器。

 LAUNCHXL28069M 用作接收器端、TMS570LS4x 用作发送器端 CAN。

对于 LAUNCHXL28069M 接收器端、我将引用 C:\ti\controlSUITE_3.4.5\device_support\f2806x\v151\F2806x_examples_ccsv5\eCAN-back2back 示例代码

对于 TMS570LS4x Tx CAN 端 C:\ti\Hercules \HALCoGen\v04.06.01\examples\TMS570LS04x_03x_02x/example_CAN_communication。 我已经使用 HALCogen 工具创建了 caninit 函数。

在这种配置之后,每次接收到的数据不是实际传输的数据时,我都不会在 Rx CAN 端接收到有效数据 。 如果我的 CAN 总线初始化错误、请建议我使用 function.below、它是我的 Tx 和 Rx 端代码。

是否有任何令人不安的问题? 或信号 CANH 和 CANL、因为在 LAUNCHXL28069M sn65hvd234 CAN 收发器 IC 上使用的是次级侧没有5伏 Vcc 的 CAN 收发器、在我的开发板上使用的是5 伏 Vcc2的 ISO1050 CAN 收发器。

>>>>>>>>>>> CAN RX 代码>>>>>>>>>>>>>>>>

LAUNCHXL28069M 接收器端 CAN 代码

 InitECANa();//CAN 从初始化函数
 EALLOW;

 ECANaMboxs.MBOX16.MSGID.ALL = 0x00000001;

 EDIS;

 ECANaRegs.CANMD.ALL = 0xFFFFFF0000;

 ECANaRegs.CANME.ALL = 0xFFFFFFFF;

 EALLOW;
 ECANaRegs.CANMIM.ALL = 0xFFFFFFFF;
 EDIS;

 EALLOW;
 ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
 ECANaShady.CANMC.bit.STM = 0;   //将 CAN 配置为自检模式 1.
 ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
 EDIS;

 for (;;)
 { for (j=16;j<32;j++)        //读取并检查16个邮箱
    {
       mailbox_read (j);        //此 func 读取指定的邮箱数据
       Mailbox_check (TestMbox1、TestMbox2、TestMbox3);//检查接收到的数据
       //mailbox_read (16);
    }

}主函数结束************

void InitECana (void)       //初始化 eCAN-A 模块



   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;
   ECanaShady.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;
   ECanaShady.CANBTC.all =0x000203BD;//0x000503BD = 500k;;0x000203BD;=1Mbps 时钟90MHz
   ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;

   ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
   ECanaShady.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;

>>> Rx 代码结束>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<< CAN Tx 代码 TMS570LS4x <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

canInit();

uint8 CAN_DATA[1]={0xAA};

 while (1)
   {
       canTransmit (canREG1、canMESSAGE_BOX1、&CAN_DATA[0]);
       memset (rx_data、0、sizeof (rx_data));
       等待(0xFFF);
   }图标* 主函数结束***

空 canInit (空)

   /**-设置控制寄存器
   *    -禁用总线活动时的自动唤醒
   *    -禁用本地断电模式
   *    -禁用 DMA 请求线路
   *    -启用全局中断线路0和1
   *    -禁用调试模式
   *    -从软件复位中释放
   *    -启用/禁用奇偶校验或 ECC
   *    -启用/禁用计时器上的自动总线
   *    -进入调试状态之前设置消息完成
   *    -设置正常操作模式
   *    -请求对配置寄存器的写入访问
   *    -设置消息的自动重新传输
   *    -禁用错误中断
   *    -禁用状态中断
   *    -进入初始化模式
   *
   CANREG1->CTL =(UINT32) 0x00000000U
                |(UINT32) 0x00000000U
                |(UINT32)((UINT32) 0x00000005U << 10U)
                |(UINT32) 0x00020043U;

   /**-清除所有挂起的错误标志并重置当前状态*/
   canREG1->ES |= 0xFFFFFFU;

   /**-为消息分配中断级别*/
   CANREG1->INTMUXx[0U]=(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U
                        |(UINT32) 0x00000000U;

   /**-在定时器周期上设置自动总线*/
   canREG1->ABOTR =(uint32) 0U;

   /**-初始化消息1.
   *    -等待 IF1就绪可供使用
   *    -设置消息掩码
   *    -设置消息控制字
   *    -设置消息仲裁
   *    -设置 IF1控制字节
   *    -设置 IF1消息编号
   *
   /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
   while ((canREG1->IF1STAT & 0x80U)=0x80U)
   {
   }/*等待*/


   CANREG1->IF1MSK = 0xC0000000U |(UINT32)((UINT32)((UINT32) 0x00007FFU &(UINT32) 0x1FFFFFFFU)<<(UINT32) 0U);
   CANREG1->IF1ARB =(uint32) 0x800000U |(uint32) 0x40000000U |(uint32) 0x20000000U |(uint32)(((uint32) 1U &(uint32) 0x1FFFFFFFU)<<(uint32) 0U);
   CANREG1->IF1MCTL = 0x00001000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 0x00000000U |(UINT32) 8U;
   CANREG1->IF1CMD =(uint8) 0xF8U;
   canREG1->IF1NO  = 1U;

   /**-设置 IF1以进行数据传输
   *    -等待 IF1就绪可供使用
   *    -设置 IF1控制字节
   *
   /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
   while ((canREG1->IF1STAT & 0x80U)=0x80U)
   {
   }/*等待*/
   CANREG1->IF1CMD = 0x87U;

   /**-设置 IF2以读取数据
   *    -等待 IF1就绪可供使用
   *    -设置 IF1控制字节
   *
   /*SAFETYMCUSW 28 D MR:NA "找到可能无限的循环-执行序列的硬件状态检查"*/
   while ((canREG1->IF2STAT & 0x80U)=0x80U)
   {
   }/*等待*/
   CANREG1->IF2CMD = 0x17U;

   /**-设置位时序
   *    -设置波特率预分频器扩展
   *    -设置 TSeg2
   *    -设置 TSeg1
   *    -设置样本跳转宽度
   *    -设置波特率预分频器
   *
   canREG1->BTR =(uint32)((uint32) 0U << 16U)|
                  (uint32)((uint32)(1U-1U)<<12U)|
                  (uint32)((uint32)((7U + 1U)- 1U)<<8U)|
                  (uint32)((uint32)(1U-1U)<<6U)|
                  (uint32) 7U;


    /**- CAN1端口输出值*/
   canREG1->TIOC = (UINT32)((UINT32) 1U <<18U)
                  |(uint32)((uint32) 0U <<17U)
                  |(uint32)((uint32) 0U <<16U)                
                  |(uint32)((uint32) 1U <<3U)  
                  |(uint32)((uint32) 1U <<2U)    
                  |(uint32)((uint32) 1U <<1U);
                  
   canREG1->RIOC = (UINT32)((UINT32) 1U <<18U)    
                  |(uint32)((uint32) 0U <<17U)  
                  |(uint32)((uint32) 0U <<16U)   
                  |(uint32)((uint32) 1U <<3U)  
                  |(uint32)((uint32) 0U <<2U)
                  |(uint32)((uint32) 0U <<1U);        

   /**-离开配置和初始化模式 */
   canREG1->CTL &=~(uint32)(0x00000041U);


提前感谢..

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

    Sameer、

               是否有 CAN 总线分析仪工具连接到总线? 还是连接到28069的 CANRX 引脚的示波器? 如果是、您可以轻松地验证 总线上传输的内容。 这将帮助您快速隔离问题。 您会说"每次接收的数据不是我实际传输的数据"。 我认为这意味着 F28069确实接收到一些数据。 它能够接收"一些"数据、这一事实告诉我、这不太可能是硬件问题。 问题很可能出在 TMS570方面。

     

    如果您在28069侧使用滤波、请下载我的 app.note SPRA876并查看示例 CAN_LAM.C. 它显示了如何设置接受屏蔽的多种情形。

     

    我希望附件能解决您对混合使用3.3V 和5V 收发器的问题。

     


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

    非常感谢您提供有关 CAN 通信和示例代码的出色文档。

    现在我的问题已经解决了。所有问题都能正常工作。