TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LS3137 CAN通信的问题

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

Renton:

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来读取。

 

  

zenghong wen:

回复 Renton:

Hi,Renton:

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

Yichao Jiang:

回复 zenghong wen:

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

Jay:

回复 Yichao Jiang:

Hi Yichao,

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

Regards,

Jay

Yichao Jiang:

回复 Jay:

你好,谢谢你的回复。

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

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

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

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

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

谢谢

Ken Wang:

回复 Yichao Jiang:

Hi Yichao,

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

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

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

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

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

Yichao Jiang:

回复 Ken Wang:

谢谢你的回复。

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

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

Ken Wang:

回复 Yichao Jiang:

Hi Yichao,

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

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

Ken

qilin zeng:

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

qilin zeng:

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LS3137 CAN通信的问题
分享到: 更多 (0)