CAN 中断接收数据,但是能接收到设备的发过来的数据.但是通过canGetID(canREG2, canMESSAGE_BOX2); 来读取发送设备的ID号..
发现这个ID号数值比较大。与发送设备的ID不符...怎么回事??
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.
Hi sam,
你提到的canGetID()这个函数是HALCOGEN自动生成的,还是你自己定义的呢?我印象中我们的HALCOGEN没有生成类似的函数。
方便看下你这个函数的定义吗?ID数值比较大,需要注意通信过程中ID是11位还是29位,另外提取报文中的ID是否需要移位操作等相关问题。
谢谢
Hi Sam,
我刚下载了新版的HALCOGEN, 确实里面是有这个函数了,以前我用V3.6之前的版本都是没有的。
在没有这个函数之前,我做过这样的测试,我用TMS570监听CAN总线上的所有报文,包括读取ID和相应的报文数据。
我当时是用使能IF3的自动更新,然后从IF3的ARB寄存器里读取相应的ID符。当然这里针对ID符会有一个移位的操作。
你现在用这个函数具体会得到什么样的ID呢,会比发送端的真实ID差多少?能具体给个你测得的数值吗?
谢谢
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;
如果你发送端是工作在标准帧的情况下的话,你的函数需要修改一下了。
谢谢
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..
Hi sam,
谢谢你的信息,确实我们的cangetID函数是需要右移18位来接收标准ID符的。这个正如我们昨晚分析的一样。
另外你提出的关于ID的另一个问题,我的理解是这样的,你两个CAN设备之间进行通信,肯定一个设备发送messagebox的ID要和另一个接收messagebox的ID符一样,反之亦然,只有这样,双方的信息才能正常接收。当然,接收端不设置ID过滤的情况,就另算了。
在我们的CAN模块里面,你可以把接收和发送的ID设置成不一样,然后根据你设定的通信协议,进行报文的交互。所以,要么你的CAN1修改ID,要么你的CAN2接收端不进行ID过滤。
关于canUpdateID()函数,我看了一下,应该也是可以修改发送端的ID的吧,它输入参数你可以选择发送端的messagebox的。不用这个函数,其实自己也可以修改的,我以前做过测试,是能修改发送ID的。
谢谢