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.

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

Expert 1222 points
Other Parts Discussed in Thread: HALCOGEN, RM48L952

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

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

  • Hi sam,

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

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

    谢谢

  • Hi Ken,

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

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

  • Hi Sam,

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

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

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

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

    谢谢

  • Hi Ken,

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

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

  • 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,

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

  • 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的。

    谢谢