CANOpen学习笔记(二)

官方资源

CanFestival 使用手册3.0

CanFestival官网


第一步:下载资源

进入官网下载源码
下载future
下载python
下载wxpython
下载future
下载mavlink代码生成工具包
推荐–>教程配套资源汇总

第一步:安装

注意所有安装包的安装都选择32位的

python:

下载好之后,打开管理员CMD(注意管理员CMD和CMD的区别),进入安装包路径,输入python-2.7.15.msi
一直next直到看到一个add python×,选择 entire feature

Future:

下载好之后,打开CMD进入安装包路劲,输入python setup.py install,回车

wxPython:

下载好之后直接双击

第二步:配置

进入Mongo-canfestival-3-asc-1a25f5151a8d\objdictgen,在此处打开git bash,输入 python objdictedit.py会出来一窗口如下图CANOpen学习笔记(二)_第1张图片
点击文件->新建会出现下图
CANOpen学习笔记(二)_第2张图片
可以选择主从节点类型,网络管理方式灯选项,选好之后确认会出现下图

CANOpen学习笔记(二)_第3张图片
点击想对应的对象字典既可配置,可对照手册来进行添加删除修改。配置好后点击文件->保存,保存工程文件。
再点击文件->建立词典,选项保存路径。就会保存生成的C文件和头文件
也可导出EDS文件。

第三步:移植源码

  • 移植所需文件
  1. 源码/include/cm4里的所有文件
  2. 源码/include/下的所有头文件,子文件夹里的不算
  3. 源码/src下除了symbols.c 之外的所有c文件
  4. 对象字典编辑器生成的c文件和头文件
  5. 源码/examples/AVR/Slave里的config.h文件
  6. 自行建立canopen_app,canopen_drvt源文件和头文件
  7. 自行建立timer,can相关的底层源文件与头文件
  • 文件的修改
  1. 删去dcf.c中start_node函数和start_and_seek_node函数前面的inline关键字
  2. 在canfestival.h文件中添加防止递归包含的宏#ifndef CANFESTIVAL_H
  3. 将config.h文件中#ifdef IAR_SYSTEMS_ICC …#else后包含的6个头文件全部删去
  4. 在config.h文件中添加宏定义#define SDO_BLOCK_SIZE 16
  5. 在config.h文件中将 REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES改为 REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERS_TIMES
    以下为config.h示例:
    CANOpen学习笔记(二)_第4张图片
  • 工程所需文件
    dcf.c
    emcy.c
    lifegrd.c
    lss.c
    timer.c
    nmtMaster.c
    nmtSlave.c
    objacces.c
    pdo.c
    sdo.c
    states.c
    sync.c
    对象字典文件

  • 自定义代码部分
    1.can初始化函数
    2.timer初始化函数
    3.canSend函数,因为canSend函数在源码中有调用所有必须按照这个格式定义
    unsigned char canSend(CAN_PORT CANx, Message *m)
    4.setTimer函数,按照void setTimer(TIMEVAL value);格式定义
    5.getElapsedTime函数,按照TIMEVAL getElapsedTime(void);格式定义
    6.定时中断函数
    4~6中函数以及很多相关函数的定义可以参考源码/drivers/cm4.c 如果是stm32F1就选cm3
    7.之前对象字典生成的c文件会定义一个结构体变量ObjDict_Data,在文件最后一行,找到这个结构体的定义可以看到一些关于canopen节点所有比要数据的定义,其中的canHandle需要在初始化时配置,既:
    ObjDict_Data.canHandle = CAN1;或者can2
    8.ObjDict_Data中还有一个本机地址需要设置,如下
    //设置本机ID为0x01
    setNodeId (&ObjDict_Data, 0x01);
    9.在canopen中节点有很多种状态,在我们使用之前can初始化后需要对节点的状态设置,如下:
    setState(&ObjDict_Data,Initialisation);//设置为初始化状态
    setState(&ObjDict_Data,Operational);//设置为操作状态


相关接口

  • SDO常用接口

writeNetworkDict函数
写入节点数据,发生错误返回0xff

参数 类型 注释
d CO_Data* 对象字典c文件定义的ObjDict_Data变量
nodeId UNS8 节点ID
index UNS16 索引
subIndex UNS8 子索引
count UNS32 写入的字节数
dataType UNS8 写入的数据类型
data void * 写入的数据地址
useBlockMode UNS8 是否使用块写入

readNetworkDict函数
发送一个读对象字典数据的请求帧,发生错误返回0xff

参数 类型 注释
d CO_Data* 对象字典c文件定义的ObjDict_Data变量
nodeId UNS8 节点ID
index UNS16 索引
subIndex UNS8 子索引
dataType UNS8 写入的数据类型
useBlockMode UNS8 是否使用块写入,一般不用

getWriteResultNetworkDict函数
获取写对象字典的结果,返回数据传输状况

参数 类型 注释
d CO_Data* 对象字典c文件定义的ObjDict_Data变量
nodeId UNS8 节点ID
abortCode UNS32 * 中止代码的指针,可函数内定义一个局部变量然后将地址传给他

***返回类型:***

SDO_RESET SDO_FINISHED SDO_ABORTED_RCV SDO_ABORTED_INTERNAL SDO_DOWNLOAD_IN_PROGRESS SDO_UPLOAD_IN_PROGRESS SDO_BLOCK_DOWNLOAD_IN_PROGRESS SDO_BLOCK_UPLOAD_IN_PROGRESS
传输未开始 传输完成 数据接受中止 数据传输内部中止 数据下载中 数据上传中 数据块下载中 数据块上传中

getReadResultNetworkDict函数
和getWriteResultNetworkDict类似

closeSDOtransfer函数
关闭传输,

参数 类型 注释
d CO_Data* 对象字典c文件定义的ObjDict_Data变量
CliServNbr UNS8 客户端或服务器的nodeID
whoami UNS8 服务器或客户端
  • PDO常用接口
    未完待续

你可能感兴趣的:(嵌入式,通信协议,stm32)