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通信

Other Parts Discussed in Thread: HALCOGEN

用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没有收到这个数据,可能是通信设置不正确的缘故。

       

  • 你好,can.C里面没有node->IF2CMD = 0x7F;我按照建议 手动加入这个代码,编译OK后,下载。在watch窗口还是没有内容,memory窗口里0xFF1C0000后,没有接收到想要的数据。

  • Hi ml0943,

        那就不太容易判断了...

        如果0xFF1C0000后面没有任何数值的话,说明你的message object没有正确设置。

        方便的话,可以把工程发上来看一下。

  • 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)怎么进去?

  • Hi ml0943,

        另外,两个板子上都有CAN的transceiver吗?

  • 你好,我将程序中,多余无用的代码注释了。如附件所示。采用了三个电路板,板间采用CAN2通信,流程图所示。

  • Hi ml0943,

        我看了下,你主程序中的发送部分被屏蔽了哈?

        应该是其他板子发给这个板子来接收?

        这样不太容易找到原因...

        不过可以先尝试一下把附件中的文件替换原有的sys_startup.c来试试看。

  • 你好,今天又尝试了,在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中看一下是否有定义这个函数即可。

  • 1回答:你发的那个还没有尝试,

    2回答:最近一直用台式机,今天用笔记本电脑(安装的是HAL code generator v3.03.01版本),打开程序,重新生成代码,在IAR中编译调试,没有错误,下载到板子后,设置断点调试,能接收到预期的messagebox内容和ID。can通信正常。

    3回答:有vimInit(); 这个函数

  • Hi ml0943,

        OK,了解。

        1. 那么请尝试使用前面附件中的startup文件。

        2. 那么CAN的接收问题已经不存在了?

        3. 你上传的图片是vimInit()被调用的位置,我想知道工程中有没有它的定义?如果有,那么应该是在调用之前没有做声明的缘故;如果没有,说明可能文件或工程不完整,请使用HALCoGen重新生成。