本文介绍CANopen中的SDO(upload)原理,以及在CanFestival中的实现过程。
一、SDO upload
当需要读取一个CANopen节点中对象字典的值时,使用SDO upload协议,根据对象字典的数据类型,又分为SDO upload expedited和SDO upload normal 两种:
(1)当数据字典的长度小于或等于4个字节时,使用SDO upload expedited。
(2)当数据字典的长度超过4个字节,一帧数据传输不完时,使用SDO upload normal。
二、SDO upload expedited帧格式
客户端请求:
服务器正常响应:
其中n与对象字典的数据长度有关:
三、SDO upload normal帧格式
SDO upload normal中,初始化以后传输的帧称为upload segment帧。
客户端请求:
服务器响应:
其中,
t:翻转位,每传输一次segment翻转一次,请求和响应中的t必须相等。
n:代表数据d0~d6中无效数据的长度,n=0表示7个字节数据均有效。
c:等于0表示还有更多数据等待传输,等于1表示传输完毕。
四、错误响应
当发生错误时,服务器返回错误响应:
常见的错误码在def.h中定义:
/** definitions used for object dictionary access. ie SDO Abort codes . (See DS 301 v.4.02 p.48)
*/
#define OD_SUCCESSFUL 0x00000000
#define OD_READ_NOT_ALLOWED 0x06010001
#define OD_WRITE_NOT_ALLOWED 0x06010002
#define OD_NO_SUCH_OBJECT 0x06020000
#define OD_NOT_MAPPABLE 0x06040041
#define OD_LENGTH_DATA_INVALID 0x06070010
#define OD_NO_SUCH_SUBINDEX 0x06090011
#define OD_VALUE_TOO_LOW 0x06090031 /* Value range test result */
#define OD_VALUE_TOO_HIGH 0x06090032 /* Value range test result */
/* Others SDO abort codes
*/
#define SDOABT_TOGGLE_NOT_ALTERNED 0x05030000
#define SDOABT_TIMED_OUT 0x05040000
#define SDOABT_OUT_OF_MEMORY 0x05040005 /* Size data exceed SDO_MAX_LENGTH_TRANSFERT */
#define SDOABT_GENERAL_ERROR 0x08000000 /* Error size of SDO message */
#define SDOABT_LOCAL_CTRL_ERROR 0x08000021
四、CanFestival中的实现
以CanFestival作为服务器为例,收到一个客户端SDO请求后的处理流程如下:
五、实例
以读取从节点1的对象字典0x1018和0x1008为例,总线上监控到CAN帧如下:
其中0x1008为Manufacturer device name,数据类型为VISIBLE_STRING,以ASCII码的形式传输。