文章目录
- 一、前言
- 二、实验目的
- 三、对象字典OD
- 四、通过RPDO修改变量rx_Value
- 4.1、NMT指令让CANopen从站进入操作状态
- 4.2、RPDO修改变量rx_Value
一、前言
该章节的源代码地址:github
以上摘自《CANopen_easy_begin》的第7章。
二、实验目的
CANopen从站有一个变量rx_Value,映射到PDO1上。接着,CANopen主站通过CANopen协议修改CANopen从站的变量rx_Value。
三、对象字典OD
使用Objdictedit软件打开文件夹/obj_dir/Slave1.od对象字典。
在0x2000~0x5FFF的地址创建变量rx_Value,类型是uint16_t。
在0x1600~0x17FF的Receive PDO Mapping里的0x1600是RPDO1,然后在映射对象1那里选择rx_Value变量。
然后,其他没有被映射的对象全部删除,如上图所示。此时,只有映射对象1,它是rx_Value。
最后,保存对象字典,建立词典(其实就是将对象字典生成.c代码,给STM32工程使用)。
打开STM32工程后,可以找到rx_Value变量。
编译(0 error,0 warning) ,下载代码。
可以看到,CANopen从站已经上线,在预操作状态。
四、通过RPDO修改变量rx_Value
4.1、NMT指令让CANopen从站进入操作状态
首先,根据CANopen的NMT协议,让CANopen从站进入操作状态。
从上图看到,CANopen从站Node-ID=0x01进入了操作状态,此时PDO的功能被打开。
请牢记住这一点,要使用canopen从站的PDO功能,就必须让它先进去操作状态!
4.2、RPDO修改变量rx_Value
回忆一下,变量rx_Value被映射到RPDO1。
所以通讯的CAN-ID为0x201。
从上图可以看到,通过发送CANID:0x201,数据0x77 0x88,接着从MDK观察到变量rx_Value确实变化了。
至于为什么rx_Value的值跟CAN包上的值顺序不一样,是因为CANopen是小端通讯的。