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.

[参考译文] TMS570LS3137:CAN TX ID:更改 TX 的 CAN MessageBox ID 时遇到困难

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/569647/tms570ls3137-can-tx-id-difficulties-to-change-can-messagebox-id-for-tx

器件型号:TMS570LS3137
主题中讨论的其他器件:HALCOGEN

您好!

我正在尝试使用多个模块来管理 CAN 总线、这些模块具有正确的 ModID (100、110、120...)。
每个模块有9种数据包类型(模块1的 ID 100至108、模块2的 ID 110至118)。
其中五个数据包 ID 用于从主器件到模块的消息、其余四个是模块到主器件的消息。

我使用 HalCoGen (TMS570+FreeRTOS)为 RX 配置具有掩码的消息多路复用器。 在 RTM 和此论坛的帮助下、我设法获取 RX 的 CAN ID (函数如下)。


但我对 TX ID 有一些困难。 我知道我需要编辑 IFxCMD 来设置 ARB 以更改 IFxARB、但我认为我这样做是错误的、因为 ID 没有更改。


这是我的 TX 函数,是否有人可以帮助我?

uint32_t canTransmitID (canBASE-t *节点、uint32_t MessageBox、const uint8_t *数据、uint32_t msgBoxID)

   uint32_t i;
   uint32_t Success = 0U;
   uint32_t regIndex =(MessageBox - 1U)>> 5U;
   uint32_t bitIndex = 1U <<((MessageBox - 1U)& 0x1FU);

   /**-检查待处理消息:
   *    -待处理消息、返回0
   *    -无待处理消息、开始新传输
   *
   IF (节点->TXRQx[regIndex]和位索引)
   {
       返回成功;
   }

   /**-等待 IF1准备就绪可供使用*/
   while (node->IF1STAT & 0x80);

   /**-将 TX 数据复制到 IF1中*/
   对于(I = 0U;I < 8U;I++)
   {
#ifdef __little_endian__
       NODE->IF1DATx[i]=*数据++;
其他
       NODE->IF1DATx[s_canByteOrder[i]=*数据++;
#endif
   }

   NOD->IF1CMD |= 0x200000U;

   NOE->IF1ARB &= 0xE0000000U;
   NODe->IF1ARB |=(msgBoxID 和0x1FFFFFFFU);

   /**-将 TX 数据复制到消息框中*/
   节点->IF1NO = MessageBox;

   成功= 1U;
   返回成功;


uint32_t canGetID (canBASE-t *节点、uint32_t MessageBox)

   uint32_t  msgBoxID = 0U;

   /**-等待 IF2就绪可供使用*/
   while (node->IF2STAT & 0x80);

   /**-为配置 IF2
   *    -消息方向-读取
   *    -数据读取
   *    -清除报文对象中的 NewDat 位。
   *
   NOD->IF2CMD = 0x20U;

   /**-将数据复制到 IF2中*/
   节点->IF2NO = MessageBox;

   /**-等待数据被复制到 IF2中*/
   while (node->IF2STAT & 0x80);

   /*从仲裁寄存器读取消息框 ID。 *
   msgBoxID =(节点->IF2ARB & 0x1FFFFFFFU);

   返回 msgBoxID;




谢谢、
此致、
Jean-Marie

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

    我想知道、由于 RTOS 在用户模式下运行时寄存器受到特权保护、对1F1ARB 的写入是否被阻止。 请注意、IFxCMD 和 IFxARB 是受特权保护的寄存器。 您需要处于系统模式才能写入这些寄存器。 是否使用了 xTaskCreate()。 如果是,请改为使用"xTaskCreateRestricted()"创建在系统模式下运行的任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的回答。

    是的,我使用 xTaskCreate()。 我不知道 xTaskCreateRestricted(),我将做一些研究来使用它。


    在本例中、TX 函数暂时在中断"canMessageNotification"中调用。

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

    您好、再说一次、

    所以,我尝试了 xTaskCreateRestricted,但没有成功。 我执行了一项特权任务、但 TX ID 不变。 我对 MPU 不满意、因此我可能没有正确配置任务(代码如下)。

    我在函数 canTransmitID 中使用 CAN 寄存器可能是错误的(代码位于主题的第一篇文章中、以红色显示)。 我是否正确地使用 IFxCMD?

    谢谢、

    静态 portSTACK_type xTaskStack[128];
    char cSendMsgCANArray[512];

    静态常量 xTaskParameters xTaskDefinition =

       vSendMsgCAN、
       "SendMsgCAN"、
       128、    
       null、
       (1UL | portPRIVILEGE_BIT)、
       xTaskStack、
       {
           {cSendMsgCANArray、512、MPU_PRIV_RW_USER_RW_EXEC}
       }
    };

    /* SendMsgCAN */
    void vSendMsgCAN (void *pvParameters)

       const portTickType xDelay1s = PDM_TO_TICKs (1001);
       uint8_t i = 0;
       for (;;)
       {
          TX_numMsg[0]= I;
          TX_numMsg[1]= I+1;
          TX_numMsg[2]= I+2;
          TX_numMsg[3]= I+3;
          dataGlobal. uelMin++;

          canTransmitID (canREG2、canMESSAGE_BOX1、TX_numMsg、I);

          I =(i+1)%240;

           vTaskDelay (xDelay1s);
       }



    在 main()中:
    xTaskCreateRestricted (&xTaskDefinition,NULL);

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

    我有我的解决方案!


    我的代码中有两个问题。

    首先,我执行的是 NOD->IF1CMD |= 0x200000U;而不是 NOD->IF1CMD |= 0x20U;

    我认为 IF1CMD 是命令寄存器(32位)、但它只是2个命令字节。

    第二,我正在执行 NOE->IF1ARB &= 0xE0000000U;而不是 NOE->IF1ARB = 0xE0000000U;

    我没有在写入模式(位 Dir)下初始化 ARB 寄存器。

    感谢你能抽出时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您的问题得到解决。 很抱歉、我没有通过阅读您的代码来发现错误。