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 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中断才可能实现多帧的数据读取?我程序中确实没有设置中断,明天更改下中断设置在试下,再次感谢。
你好,谢谢你的回复。
我现在的问题是这个样子。
我的arm3137通过can与另外一个arm进行通信。
3137只负责接收,所以我就想调用canGetData方法,接收数据。
我现在的问题是一直无法接收。
调用该方法的返回值一直是0,而且相关的寄存器DATAA和DATAB中也无应该接收到的数据。
谢谢
Hi Yichao,
你接收不到CAN总线的数据,有几个方面的原因,
1. 首先确认你的CAN总线的通信速率与另一个节点一致。
2. 确认你选择的messagebox设置位接收,同时如果是选择中断接收的话,记得打开接收中断使能。
3. 确认你的messagebox 设置的ID和另一个节点一致,不然会被过滤掉,而收不到数据。
附件里面是我做的一个简单的关于CAN总线接收和发送两个简单的例程,希望对你理解CAN总线有帮助。
Hi Yichao,
方便的话,可以把你的工程发给我看一下吗?我的私人邮箱ken-wang@ti.com.
另外3137接收的CAN ID 是多少?
Ken