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..
TI中文支持网

