用RM48开发的两个板子,板子间采用CAN通信,但是在实际调试时,只能接收到messagebox的ID,但是却接收不到message中的内容。如图所示:can_rx2_data和can_rx3_data是两个接收数组,内容为空。请指教
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.
用RM48开发的两个板子,板子间采用CAN通信,但是在实际调试时,只能接收到messagebox的ID,但是却接收不到message中的内容。如图所示:can_rx2_data和can_rx3_data是两个接收数组,内容为空。请指教
Hi ml0943,
抱歉回复晚了。
您可以尝试下面的办法:
1. 先确认在canGetData接口中,是否有下面这段代码:
/** - set up read artribute of IF2 **/
node->IF2CMD = 0x7F;
如果没有,那么请下载最新版本的HALCoGen。
或者手动加入这个代码在node->IF2NO = messageBox;之前。
2. 请打开调试界面中的memory窗口,并观察0xFF1C0000以及之后的地址。
这里是真正的MessageObject的RAM,每8个32bit word为一个单元,从MsgObj[0]开始。
你可以看看这里有没有希望获得的数据,如果这里有,而IF寄存器中读取不到,那么就是前面所说的IFxCMD寄存器的问题。
如果连这里都没有预期的数据,那么说明CAN没有收到这个数据,可能是通信设置不正确的缘故。
Hi ml0943,
看了一下ato_test的代码,发现几个问题:
1. 从sys_main.c的代码中来看,目标好像是要使用DCAN2的message object 2 发送,再用DCAN2的message object 1 接收。
2. 但是从can.c的初始化代码中来看,用户把message object 1作为发送而message object 2作为接收了,是否配置错误?
3. 而且在初始化中,MO1的ID是1U, 而MO2的ID是2U,两个ID不一致,无法互相接收到数据。
4. 如果单独在DCAN2上实现自发自收,需要把DCAN2配置为自检测模式的loopback模式。这个工作好像没有做?
5. main()里面做发送和接收的工作是分别在两个while(1)中进行的,但是没有看到类似break一样的指令,不知道第二个while(1)怎么进去?
你好,今天又尝试了,在HALcode generator v3.03.01中生成代码,在IAR中,编译,下载到板子后,一切正常,没有错误。
同样的程序,我用HALcode generator v3.05.00重新打开,点击file --->generate code ,重新生成代码,在IAR中,编译,出现错误
Error[Li005]: no definition for "vimInit" [referenced from D:\ATO_test2\ato_soft\ato_test\Debug\Obj\sys_startup.o]
这是什么原因呢?个人认为前面的问题都是软件版本的不同造成的。
Hi ml0943,
哦,不太明白你的意思啊...
1. 有没有尝试使用前面提供的sys_startup_modified.c呢?这个文件是在你前面发出的那个文件基础上屏蔽了安全性相关的代码得来的。完全采用你原来的配置。不需要从新生成代码。
2. "在IAR中,编译,下载到板子后,一切正常,没有错误。"是指编译无误,还是连前面那个CAN通信的问题也不存在了?
3. Error[Li005]: no definition for "vimInit" [referenced from D:\ATO_test2\ato_soft\ato_test\Debug\Obj\sys_startup.o] 从字面上看是没有定义vimInit,那么就进入到sys_startup.c中看一下是否有定义这个函数即可。