在做一个小项目,用的是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