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.

求M3/M4 单芯片CAN收发初始化配置程序。

Other Parts Discussed in Thread: LM3S8962, LM3S2965

如题,请问有没有基于M4单芯片CAN应用的初始化参考代码?包含发送和接收。

  • Hi Toby,

      在我们的M4芯片的TIVA-ware里面有一个example文件夹,在里面的peripheral文件下面有关于CAN总线通信的两个例程。你可以参考一下那里面相关的代码。接收端和发送端都有的。

    如果你没装tiva-ware,我上传了一下几个源文件,你可以下载看一下。

    希望对你有所帮助。

    谢谢

    ken

  • Hi Ken,

    谢谢你的回复!

    TI的库文件我都有,包括example,并且我使用过里面的RX和TX例程,单独使用RX或TX都正常。

    我现在将它们融合到一起 想用一块板子同时实现RX和TX,不知道有没有这样的例程。谢谢。

  • Hi Toby,

      我们现在M4的板子上面基本没带CAN的收发芯片,所以就没有现成的关于CAN通信的例程。

    在我们早期的M3的板子LM3S8962的例程里面有关于CAN通信的几个实例,你可以参考一下。

    另外,你在设计同时使用RX和TX的过程中,具体遇到了什么样的问题呢,我觉得这两个联合起来操作应该不会有太多的问题。

    谢谢

    ken

  • Ken,

    了解,我现在用的LM3S2965的板子。因为对CAN不熟,所以想找找看有没有参考程序。

    如果没有的话,我自己再搞搞看。 谢谢你。

  • Hi Toby,

      Ok, 没问题,你可以先自己搞搞看,到时候有什么具体的问题,可以再提出来,我们可以再讨论。

    谢谢

    ken

  • Hi Ken,

    以下CAN部分初始化代码是我根据LM3S2965的example中的例程修改而来。

    当我屏蔽掉TX或RX其中一个,另一个都能正常工作。

    现在同时使能TX和RX时,可以正常往外发送数据,RX与TX 都能正常进入中断程序,

    并且将接收到的数据用UART发送到电脑,结果发送出来的ID是结构体sCANMessage_TX中的ID信息。

    tCANMsgObject sCANMessage_TX;
    tCANMsgObject sCANMessage_RX;

    // 以下是配置CAN TX部分报文初始化。

    *(unsigned long *)ucMsgData_TX = 0;
    sCANMessage_TX.ulMsgID = 0x000007DF;                                 // CAN message ID - use ECU's ID:0x000007DF
    sCANMessage_TX.ulMsgIDMask = 0;                                            // no mask needed for TX
    sCANMessage_TX.ulFlags = MSG_OBJ_TX_INT_ENABLE;     // enable interrupt on TX
    sCANMessage_TX.ulMsgLen = sizeof(ucMsgData_TX);            // size of message is 8
    sCANMessage_TX.pucMsgData = ucMsgData_TX;                    // ptr to message content

    // 以下代码是配置CAN RX部分报文初始化。
    //
    // Initialize a message object to be used for receiving CAN messages with
    // any CAN ID. In order to receive any CAN ID, the ID and mask must both
    // be set to 0, and the ID filter enabled.
    //

    sCANMessage_RX.ulMsgID = 0;                                                            // CAN msg ID - 0 for any
    sCANMessage_RX.ulMsgIDMask = 0;                                                  // mask is 0 for any ID
    sCANMessage_RX.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
    sCANMessage_RX.ulMsgLen = 8;                                                         // allow up to 8 bytes

    // 以下是CAN RX 数据由UART发送至PC。

    //
    // Print out the contents of the message that was received.
    //
    UARTprintf("Received Msg:ID=0x%08X len=%u data = 0x",
    sCANMessage_RX.ulMsgID, sCANMessage_RX.ulMsgLen);
    for(uIdx = 0; uIdx < sCANMessage_RX.ulMsgLen; uIdx++)
    {
    UARTprintf("%02X ", ucMsgData_RX[uIdx]);
    }
    UARTprintf(" total count = %u\n", g_ulMsgCount_RX);

    不知道还有什么地方没有注意到,才出现这个问题。

  • Hi Toby,

       你是指打印出来的ID是发送报文的ID符是吧,那接收到的报文数据都是正确的吗?

    由于我现在没有板子在手上做测试,我觉得你可以先这样测试一下,首先设定一个端点到接收中断那边,通过单步调试,并通过查询接收数据的寄存器里面是否真正的收到了数据,具体的ID是多少,这个应该再系统寄存器里面可以看得到。

    只有真正确定接收端收到了正确的数据,才好判断问题出在哪。

    明天有空,我会用我手上的板子跑一下CAN的程序,然后再进一步回答你的问题。

    谢谢

    ken

  • Hi Ken,

    按照你的方法测试过,接收数组ucMsgData_RX里面确实没有数据。

    因为MCU同时在向外发送数据,并且有发送中断。我将如下发送数据的语句屏蔽掉之后,接收数组ucMsgData_RX就可以正常收到数据。

    CANMessageSet(CAN0_BASE, 1, &sCANMessage_TX, MSG_OBJ_TYPE_TX);

    怀疑是不是buffer没处理好的问题,导致在发送的同时 接收到的数据处理没处理成功。

  • Hi Toby,

     很高兴看到你的进展。你屏蔽的那句话的作用是设置发送数据到具体的Message OBJ 里面,如果你是把它去掉然后能收到正确的数据的话,那说明你接收数据和发送数据的buffer应该是有冲突了。

    你可以改改接收端或是发送端的buffer定义看看。

    谢谢

    ken

  • Hi Ken,

    确实是buffer定义的问题,现在已经解决了。 谢谢你耐心的指导。

  • Hi Toby,

       不客气,后续有任何关于TI MCU的问题,随时欢迎到我们的论坛里交流。

    谢谢

    ken

  • 朋友是怎么解决CAN里面bufer的问题的,601245579,请帮忙,谢谢