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

RM48L952 CAN接收发送设备的ID问题;

CAN 中断接收数据,但是能接收到设备的发过来的数据.但是通过canGetID(canREG2, canMESSAGE_BOX2); 来读取发送设备的ID号..

发现这个ID号数值比较大。与发送设备的ID不符…怎么回事??

Ken Wang:

Hi sam,

  你提到的canGetID()这个函数是HALCOGEN自动生成的,还是你自己定义的呢?我印象中我们的HALCOGEN没有生成类似的函数。

方便看下你这个函数的定义吗?ID数值比较大,需要注意通信过程中ID是11位还是29位,另外提取报文中的ID是否需要移位操作等相关问题。

谢谢

Sam:

回复 Ken Wang:

Hi Ken,

CanGetID()函数是HALCOGEN自动生成的..

如果没有生成这个函数. 那通过什么方式可以获取发送设备的ID?

Ken Wang:

回复 Sam:

Hi Sam,

   我刚下载了新版的HALCOGEN, 确实里面是有这个函数了,以前我用V3.6之前的版本都是没有的。

在没有这个函数之前,我做过这样的测试,我用TMS570监听CAN总线上的所有报文,包括读取ID和相应的报文数据。

我当时是用使能IF3的自动更新,然后从IF3的ARB寄存器里读取相应的ID符。当然这里针对ID符会有一个移位的操作。

你现在用这个函数具体会得到什么样的ID呢,会比发送端的真实ID差多少?能具体给个你测得的数值吗?

谢谢

Sam:

回复 Ken Wang:

Hi Ken,

我现在用这个函数会返回一个ID值, ID = 0x42000000, 是个这么大的值.. 发现要向右移18位后,ID 会变得靠谱(设备的真实ID还不知道)。

但是这个函数是HALCOGEN自动生成的. 你应该发现此函数没有向右移位吧。。难道需要我自己再增加移位??

Ken Wang:

回复 Sam:

Hi Sam,

  我刚才试了一下设置标准帧和扩展帧两种工作方式,然后查看了一下canGetID()函数,貌似这个函数有点问题。要得到CAN报文的ID符应该是要进行右移操作的,如果是11位标准的ID,你需要右移18位,如果是29位的标准ID的话,你则不需要移。

我以前测试都是标准的11位ID符测试,得到ID的变成语句格式如下:

#define CAN_MESSAGE_ID_BITS 0x1FFC0000#define CAN_MESSAGE_ID_SHIFT 18

newMessage.canid = ((canREG1->IF3ARB) & CAN_MESSAGE_ID_BITS) >> CAN_MESSAGE_ID_SHIFT;

如果你发送端是工作在标准帧的情况下的话,你的函数需要修改一下了。

谢谢

Sam:

回复 Ken Wang:

Hi Ken,

明天上班后,再修改下,如果有消息,第一时间通知你。

Sam:

回复 Sam:

Hi Ken,

按照你上述方法,可以得到正确ID, 所以说HALCOGEN自动生成CanGetID() 函数需要增加向右移18位…

还有一个关于ID的问题:

如果RM48L952 (它ID = 0X00, 有设置MASK = 0x7FFF) CAN1 向ID = 0x55 另一设备发送消息, 这样ID = 0X55的设备是收不到消息的..

此时需要把RM48L952的 ID改成0x55( 如canREG2->IF1ARB  = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x55U & (uint32)0x000007FFU) << (uint32)18U);)  后接收设备才能收到消息;  这样RM48L952 CAN1向设备发送消息不是每次都要改自己的ID吗?

请教有更改好的方法吗?

还有canUpdateID () 此函数的用法? 貌似是修改接收端的ID.. 

 

赞(0)
未经允许不得转载:TI中文支持网 » RM48L952 CAN接收发送设备的ID问题;
分享到: 更多 (0)