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通信的问题

Other Parts Discussed in Thread: TMS570LS3137, HALCOGEN

在做一个小项目,用的是TMS570LS3137 USB开发板,需要不断采集CAN线数据并读取特定位,但是我的程序在读取连续的CAN信号的时候(CANcasexl模拟的),IFDATx寄存器里只能存储第一帧的数据,后面的数据都存储不了,不知道是我的程序有问题还是CAN节点配置的时候有什么特殊配置,盼望指点啊。

  • Hi Zenghong,

        不知道您是如何配置Message Object的, 也不知道是如何读取的数据...所以只能给一些建议。

        1. 如果从总线上接收多个ID的报文,比如,只要是总线上的数据,那么都接收,这样的话,建议尽可能多的配置有效的Message Object (MO)。

            如果只用一个MO,的确可能丢帧的。

        2. 如果使用了IF寄存器来读取CAN的接收数据的话,建议的方式如下,按照HALCoGen生成的代码来操作。

           

    unsigned canGetData(canBASE_t *node, unsigned messageBox, unsigned char * const data)
    {
    unsigned i;
    unsigned size;
    unsigned char *pData = (unsigned char *)data;
    unsigned success = 0U;
    unsigned regIndex = (messageBox - 1U) >> 5U;
    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);

    /* USER CODE BEGIN (10) */
    /* USER CODE END */

    /** - Check if new data have been arrived:
    * - no new data, return 0
    * - new data, get received message
    */
    if (!(node->NWDATx[regIndex] & bitIndex))
    {
    return success;
    }

    /** - Wait until IF2 is ready for use */
    while (node->IF2STAT & 0x80);

    /** - Copy data into IF2 */
    node->IF2NO = messageBox;

    /** - Wait until data are copied into IF2 */
    while (node->IF2STAT & 0x80);

    /** - Get number of received bytes */
    size = node->IF2MCTL & 0xFU;

    /** - Copy RX data into destination buffer */
    for (i = 0U; i < size; i++)
    {
    #ifdef __little_endian__
    *pData++ = node->IF2DATx[i];
    #else
    *pData++ = node->IF2DATx[s_canByteOrder[i]];
    #endif
    }

    success = 1U;

    /** - Check if data have been lost:
    * - no data lost, return 1
    * - data lost, return 3
    */
    if (node->IF2MCTL & 0x4000U)
    {
    success = 3U;
    }

    /** @note The function canInit has to be called before this function can be used.\n
    * The user is responsible to initialize the message box.
    */

    /* USER CODE BEGIN (11) */
    /* USER CODE END */

    return success;
    }

       上面是HALCoGen生成的代码,每次产生CAN接收中断时在ISR中调用即可。

       如果您觉得这样效率不高的话,也可以直接操作CAN的RAM来读取。

     

      

  • Hi,Renton:

    首先谢谢你的指点啊,我使用了IF寄存器来读取CAN的接收数据,也调用了HALCoGen生成的代码的CANgetdata函数,看了你的帖子就是说必须设置CAN中断才可能实现多帧的数据读取?我程序中确实没有设置中断,明天更改下中断设置在试下,再次感谢。

  • 你好,我现在也遇到了同样的问题,就是 CAN接收问题,不知道你的HALGoGen是如何配置的呢?谢谢

  • Hi Yichao,

    请问你CAN接收是用中断吗?碰到什么问题,能否具体描述一下?

    Regards,

    Jay

  • 你好,谢谢你的回复。

    我现在的问题是这个样子。

    我的arm3137通过can与另外一个arm进行通信。

    3137只负责接收,所以我就想调用canGetData方法,接收数据。

    我现在的问题是一直无法接收。

    调用该方法的返回值一直是0,而且相关的寄存器DATAA和DATAB中也无应该接收到的数据。

    谢谢

  • Hi Yichao,

        你接收不到CAN总线的数据,有几个方面的原因,

    1. 首先确认你的CAN总线的通信速率与另一个节点一致。

    2. 确认你选择的messagebox设置位接收,同时如果是选择中断接收的话,记得打开接收中断使能。

    3. 确认你的messagebox 设置的ID和另一个节点一致,不然会被过滤掉,而收不到数据。

    附件里面是我做的一个简单的关于CAN总线接收和发送两个简单的例程,希望对你理解CAN总线有帮助。

    CAN_TEST.7z
  • 谢谢你的回复。

    我有一个问题是我的3137向外发,别的arm可以收到。

    但是,我的3137接收的时候就存在问题。

  • Hi Yichao,

        方便的话,可以把你的工程发给我看一下吗?我的私人邮箱ken-wang@ti.com.

    另外3137接收的CAN ID 是多少?

    Ken

  • 请问您解决这个问题了吗?我也遇到这个问题了

  • 请问你解决这个问题了吗,我也遇到这个问题了 ,想求助您我的邮箱zql19880626@163.com