官方资源
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会出来一窗口如下图
点击文件->新建会出现下图
可以选择主从节点类型,网络管理方式灯选项,选好之后确认会出现下图
点击想对应的对象字典既可配置,可对照手册来进行添加删除修改。配置好后点击文件->保存,保存工程文件。
再点击文件->建立词典,选项保存路径。就会保存生成的C文件和头文件
也可导出EDS文件。
第三步:移植源码
- 移植所需文件
- 源码/include/cm4里的所有文件
- 源码/include/下的所有头文件,子文件夹里的不算
- 源码/src下除了symbols.c 之外的所有c文件
- 对象字典编辑器生成的c文件和头文件
- 源码/examples/AVR/Slave里的config.h文件
- 自行建立canopen_app,canopen_drvt源文件和头文件
- 自行建立timer,can相关的底层源文件与头文件
- 文件的修改
- 删去dcf.c中start_node函数和start_and_seek_node函数前面的inline关键字
- 在canfestival.h文件中添加防止递归包含的宏#ifndef CANFESTIVAL_H …
- 将config.h文件中#ifdef IAR_SYSTEMS_ICC …#else后包含的6个头文件全部删去
- 在config.h文件中添加宏定义#define SDO_BLOCK_SIZE 16
- 在config.h文件中将 REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERTS_TIMES改为 REPEAT_SDO_MAX_SIMULTANEOUS_TRANSFERS_TIMES
以下为config.h示例:
-
工程所需文件
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常用接口
sendPdo函数
//存储最后一个发送的PDO信息
d->PDO_status[pdoNum].last_message = *pdo;
//通过can接口发送PDO报文
canSend (d->canHandle, pdo);
参数 | 类型 | 注释 |
---|---|---|
d | CO_Data* | 对象字典c文件定义的ObjDict_Data变量 |
pdoNum | UNS32 | PDO编号 |
pdo | Message * | 要传输的PDO |
CopyBits函数
参数 | 类型 | 注释 |
---|---|---|
NbBits | CO_Data* | 对象字典c文件定义的ObjDict_Data变量 |
SrcByteIndex | UNS8 | PDO编号 |
SrcBitIndex | UNS8* | 要传输的PDO |
SrcBigEndian | UNS8 | 要传输的PDO |
DestByteIndex | UNS8 | 要传输的PDO |
DestBitIndex | UNS8 | 要传输的PDO |
DestBigEndian | UNS8 | 要传输的PDO |
proceedPDO函数
参数 | 类型 | 注释 |
---|---|---|
d | CO_Data* | 对象字典c文件定义的ObjDict_Data变量 |
m | Message * | can报文数据结构体 |
buildPDO函数
参数 | 类型 | 注释 |
---|---|---|
d | CO_Data* | 对象字典c文件定义的ObjDict_Data变量 |
m | Message * | can报文数据结构体 |
未完待续