• STM32canopen调试


    问题1:用usbcan监测不到can口的报文

    属于接线问题

    CANopen程序总使用的是can1 对应的接下口在J1的1和2口,而其接口排序是从外向里排序,故最外面的为1号接口,由于接线时,按照左边的顺序来数的(左右接口排序对称),把can1H接到了can2L上,can1L接到了can2H上。最后通过用万用表测can收发器的引脚与接口的通断找到了对应的接口。

    问题2:还是收不到报文  

    此时注意到用于can收发的定时器TIM4的配置没更改过来

    问题3: 当读数据的时候  while循环可以退出,但当写数据的时候 while循环不能退出

    在解决前两个问题时,把定时器设置好了,但是在设置定时器时,最后一个还是没改成TIM4,就是虽然吧TIM4配置好了,但最后还是没打开,导致TIM4的中断还是没开启 

    而读数据的循环之所以能够退出是因为他的退出条件是

    while (getReadResultNetworkDict (&ObjDict1_Data, 0x04, &rdata, &size,&abortCode) == SDO_UPLOAD_IN_PROGRESS);

    而getReadResultNetworkDict函数可以返回值有3种情况

    可以返回 SDO_TINISHED 这种情况是SDO处理过程完全正确

                d->transfers[line].state  这个值通常返回的是SDO_UPLOAD_IN_PROGRESS,所以又会返回来循环执行

                SDO_ABORTED_INTERNAL  这个属于中断退出  

    实际上根据while的条件,退出while循环的可能有两种,一种是正常处理完毕 一种是中断退出

    后来分析得到的结果是虽然这里退出了  但属于终断退出  

    而getWriteResultNetworkDict函数可以返回值有2种情况

     SDO_TINISHED 或者非 SDO_TINISHED

    因此,当中断时,写的while循环会一直等待。

    问题4:  可以读到数据,但在写的时候从站返回05 04 00 00 错误码,也就是SDO协议超时

    最后发现是can口在配置时 没有配置滤波器参数,打开滤波器参数之后,可以写数据成功

    问题5:从上面发现,有些报文后面,主站还是会发出80 00 00 00 的错误码,其属于通用型的错误  而且虽然can口监测到了冲站返回的报文,但是对象字典里面并没有数据,也就是数据并没有存到对象字典中,查看while循环退出后的返回值为0x85,表明也是中断退出。

     尝试几次之后发现,如果所读的对象字典的数据的长度不为4个字节(小于4),则会返回错误码  如果数据长度为4个字节,则不会返回错误码,如果数据长度大于4个字节,则while循环不会退出。推测这个可能是SDO读取数据没完成,因为跟踪readNetworkDict函数发现 里面有件SDO数据的长度固定为8个字节

    但后来想了  can在传输数据时,每次只能传输8个字节。但能否把SDO的数据长度改为可变的,当数据长度小于4个字节时,can口一次性传完,当数据长度大于4个字节时,分多次连续传输。

    但是后来又发现,即使所读取的对象字典的数据长度为4个字节,主站不会发送错误代码,但如果数据不是4个NUS8类型的数据,读完之后,对象字典里面的数据仍然全为0,这说明数据在保存的时候也出了问题

  • 相关阅读:
    Mongodb---记一次事故故障
    扎克伯格的中文夜:想要成功就不能放弃
    TTS-零基础入门之停止列表中单条语音播报
    卡尔曼滤波(Kalman Filter) 的进一步讨论
    2014.8.12-AKKA和Actor model 分布式开发环境学习小结
    c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用
    Spring源代码解析和配置文件载入
    java调用c++ dll出现中文乱码
    Android任务栈TaskStack
    应用中清理缓存应用实现
  • 原文地址:https://www.cnblogs.com/wujing-hubei/p/5293977.html
Copyright © 2020-2023  润新知