STM32canopen调试

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

属于接线问题

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

STM32canopen调试

问题2:还是收不到报文

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

STM32canopen调试

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

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

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

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

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

STM32canopen调试

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

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

SDO_ABORTED_INTERNAL  这个属于中断退出

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

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

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

STM32canopen调试

SDO_TINISHED 或者非 SDO_TINISHED

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

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

STM32canopen调试

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

STM32canopen调试

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

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

STM32canopen调试

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

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

上一篇:debian hosts文件中的 127.0.1.1 主机地址


下一篇:使用Managed Extensibility Framework方便的扩展应用程序