完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
CAN 中断接收数据,但是能接收到设备的发过来的数据.但是通过canGetiD(canREG2, canMESSAGE_BOX2); 来读取发送设备的ID号..
发现这个ID号数值比较大。与发送设备的ID不符...怎么回事?? |
|
相关推荐
8个回答
|
|
Hi sam,
你提到的canGetID()这个函数是HALCOGEN自动生成的,还是你自己定义的呢?我印象中我们的HALCOGEN没有生成类似的函数。 方便看下你这个函数的定义吗?ID数值比较大,需要注意通信过程中ID是11位还是29位,另外提取报文中的ID是否需要移位操作等相关问题。 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-6-21 19:32 Hi Ken, CanGetID()函数是HALCOGEN自动生成的.. 如果没有生成这个函数. 那通过什么方式可以获取发送设备的ID? |
|
|
|
Hi Sam, 我刚下载了新版的HALCOGEN, 确实里面是有这个函数了,以前我用V3.6之前的版本都是没有的。 在没有这个函数之前,我做过这样的测试,我用TMS570监听CAN总线上的所有报文,包括读取ID和相应的报文数据。 我当时是用使能IF3的自动更新,然后从IF3的ARB寄存器里读取相应的ID符。当然这里针对ID符会有一个移位的操作。 你现在用这个函数具体会得到什么样的ID呢,会比发送端的真实ID差多少?能具体给个你测得的数值吗? 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-6-21 20:03 Hi Ken, 我现在用这个函数会返回一个ID值, ID = 0x42000000, 是个这么大的值.. 发现要向右移18位后,ID 会变得靠谱(设备的真实ID还不知道)。 但是这个函数是HALCOGEN自动生成的. 你应该发现此函数没有向右移位吧。。难道需要我自己再增加移位?? |
|
|
|
60user25 发表于 2018-6-21 20:14 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; 如果你发送端是工作在标准帧的情况下的话,你的函数需要修改一下了。 谢谢 BR, KEN |
|
|
|
lining870815844 发表于 2018-6-21 20:27 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.. |
|
|
|
60user25 发表于 2018-6-21 20:46 Hi sam, 谢谢你的信息,确实我们的cangetID函数是需要右移18位来接收标准ID符的。这个正如我们昨晚分析的一样。 另外你提出的关于ID的另一个问题,我的理解是这样的,你两个CAN设备之间进行通信,肯定一个设备发送messagebox的ID要和另一个接收messagebox的ID符一样,反之亦然,只有这样,双方的信息才能正常接收。当然,接收端不设置ID过滤的情况,就另算了。 在我们的CAN模块里面,你可以把接收和发送的ID设置成不一样,然后根据你设定的通信协议,进行报文的交互。所以,要么你的CAN1修改ID,要么你的CAN2接收端不进行ID过滤。 关于canUpdateID()函数,我看了一下,应该也是可以修改发送端的ID的吧,它输入参数你可以选择发送端的messagebox的。不用这个函数,其实自己也可以修改的,我以前做过测试,是能修改发送ID的。 谢谢 BR, KEN |
|
|
|
只有小组成员才能发言,加入小组>>
336 浏览 1 评论
529 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
774 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
651 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1130 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
56浏览 29评论
133浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
252浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
201浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
57浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 03:25 , Processed in 1.635009 second(s), Total 94, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号