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.

[参考译文] RM42L432:RM42L432上的 CAN 存在问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048388/rm42l432-problem-with-can-on-rm42l432

器件型号:RM42L432
主题中讨论的其他器件:CCStudioHALCOGENTCAN337

我的 TI HERCULE (RM42L432PZ)的 CAN 存在问题。

我添加了一个 CAN 收发器(TCAN337)、我按照 Halcogen 和 CCStudio 上的 tutto 来为我的 TI HERCULE 生成 CAN 的库和驱动程序。

但是当我使用函数 canTransmit()发送数据时,不会发生任何情况,CAN1的输出没有信号。 我的程序中没有任何错误、我的函数返回成功。 此外、我还使用 Arduino 测试了 TCAN37、我没有遇到任何问题。

我不知道问题是在哪里出现的。

Matheo S.

void Send(uint8_t *tab_TX){
   while(1){                                                           /*Infinite loop*/
        canTransmit(canREG1, canMESSAGE_BOX1, *tab_TX);               /* Transfer data on CAN's port*/
        sciSend(scilinREG, 15, (unsigned char *)"SEND CAN TRAM\n\r"); /*Send on Serial's console information*/
        delay_second(5);
   }}


void main(void)
{   _enable_IRQ();
    canInit();
    sciInit();
    uint8_t data[8]={'D','A','T','A','S','E','N','D'};
    Send(data);
}

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

    请仔细阅读 TCAN337数据表。 在原理图中、交换了 TX 和 RX 信号。   

    TCAN337的引脚1应为 TXD、引脚4应为 RXD

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

    感谢您的 QJ Wang 笔记。

    但是、当我编写该原理图时、这只是一个错误。 当我测试我的驱动程序时、TX 和 RX 没有交换。

    抱歉、我更正了原理图。

    如果您有任何其他遵从或注释,您能评论吗?

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

    是否启用了 mailbox1?

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

    是的、我已经启用了这个邮箱。

    下面、我在图中添加了我对 Halcogen 所做的所有修改:

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

    您好、Siagh、

    在该配置中、使用 CAN1高优先级:

    但在 VIM 表配置中、CAN1高优先级中断未启用。 请检查通道16 (CAN1 0级)。

       

    如果 CAN 收发器正确连接到 MCU、您应该能够在 CAN 总线上看到传输的消息。

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

    谢谢王、现在我可以发送消息了。

    但我无法接收消息、

    我发送一个连续 CAN 帧、但接收不起作用。 奇怪的是、我可以很好地发送数据。 我将我的代码放在下面。

    提前感谢。

    此致 Matho。

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

    我的函数 canIsRxMessageArrived 返回0和我的函数 canGetData 返回0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="5027" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048388/rm42l432-problem-with-can-on-rm42l432/3909011 #3909011"]

    现在、我可以发送消息。

    但我无法接收消息、

    [/报价]

    RM42仅用于传输 CAN 消息、对吧? 哪个器件将接收由 RM42传输的 CAN 消息?

    [引用 userid="5027" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048388/rm42l432-problem-with-can-on-rm42l432/3909063 #3909063"]我的函数 canIsRxMessageArrived 返回0和我的函数 canGetData 返回0

    函数  canIsRxMessageArrived()由 HALCoGen 生成。 它用于检查 Rx 消息框是否包含待处理的 Rx 数据、返回 0标志未设置。 您是否还使用 RM42接收由 RM42 CAN1发送的 CAN 消息?

    是的、您可以将 RM42 CAN1连接到 RM42 CAN2进行通信。 需要两个 CAN 收发器:一个用于 CAN1模块、一个用于 CAN2模块。 每个 CAN 模块都充当 CAN 节点。

    RX 邮箱的消息 ID 应与收发消息的消息 ID 相同。

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

    感谢您提供更快的答案、

    首先、它是两个 RM42之间的通信、一个是发送通信、另一个是接收通信。

    其次、我希望每张卡都能发送和接收到另一张卡。 每个卡的 CAN1上都有一个 CAN 收发器(TCAN337)连接。

    我向您发送我的代码和我的 Halcogen、它们位于两个 RM42L432中。

    我的第一项测试是将带有一个 RM42和一个 Arduino (1)的 CAN 帧发送到另一个 Arduino (2)。  在示波器中、我可以看到 CAN 的帧、Arduino (2)接收来自 TI 和 Arduino (1)的不同消息。

    我的第二项测试是将具有一个 RM42(1)和一个 Arduino (1)的 CAN 帧发送到另一个 RM42(2)。 在示波器中、我可以看到 CAN 的帧、但 RM42 (2)不接收任何内容、Arduino (1)的 CAN 帧和 RM42 (1)的 CAN 帧也不接收。  

    当我进行调试 时,canIsRxMessageArrived()返回0, 而 canGetData() 不会填充我的表。 我将此消息加入我的字体接收和主函。

    是否可以用两张差分卡发送和接收? 或者我的代码或/和 halcogen 有问题?

    void main(void){
    
        _enable_IRQ();
        sciInit();
        canInit();
        
        Receive();
    
    }
    
    
    void Receive()
    {
        int i=0 ;
        uint8 buf[8]={0};
    
        while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX2))
        {
            canGetData(canREG1, canMESSAGE_BOX2, buf);
            delay_second(2);
            sciSend(scilinREG, 19,(unsigned char *)"DATA RECEIVED: \r\n");             /*Send a message when data is arrived*/
    
            for(i=0;i<8;i++)
            {
                sciSend(scilinREG, sizeof(buf), (char)buf[i]);                             /*Print the data received*/
                sciSend(scilinREG, 4, "    ");
            }
            sciSend(scilinREG, 4, "\r\n");
        }
    
            sciSend(scilinREG, 21,"DATA NO RECEIVED \r\n");
            sciSend(scilinREG, 4, "\r\n");
            delay_second(2);
    
    
    }

    此致 Matho

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

    谢谢 Matheo、

    [报价 userid="5027" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048388/rm42l432-problem-with-can-on-rm42l432/3909841 #3909841"]是否可以使用两张差分卡发送和接收?

    是的

    [引用 userid="5027" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1048388/rm42l432-problem-with-can-on-rm42l432/3909841 #3909841"]我的代码或/和 halcogen 有问题?[/quot]

    在您的 CAN 配置中、mailbox2用于接收消息、消息 ID 为2。 来自另一个 RM42的已发送消息 ID 是否为0x2? 否则、消息将不会通过接受筛选。   

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

    是的、两个 RM42的 ID 为0x01。

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

    以下是代码中的 CAN 节点配置:

    CAN 节点1:#1 RM42

       邮箱1发送到 TX 消息、ID = 1

       和

       邮箱2是 RX 消息、ID = 2

     

    2. CAN 节点2:#2 RRM42

      邮箱1到 TX 消息、ID = 1

      和

      邮箱2到 RX 消息、ID = 1

    不允许网络上的两个节点发送具有相同 ID 的消息。  

    您可以将消息 ID #2 RM42更改为0x2吗?

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

    感谢 QJ Wang、

    我解决了我的问题,现在我可以发送和接收消息。

    此致 SIVGH MATHEO。