0x01 代码移植
参考 http://bbs.21ic.com/icview-878522-1-1.html的移植教程(下面统称原教程),其教程还包括STM32的CAN以及TIM的驱动,不过截止写笔记的2018年2月7日在GitHub上的Canfestival-master最新版本已经有cm0/cm3/cm4系列的驱动代码,所以如果下载最新版本,只移植协议就可以,参考原教程,修改为以下步骤:
接下来开始移植:
- 步骤一:在工程目录下新建文件夹CanFestival,再在CanFestival下新建文件夹driver、inc和src,再在inc文件夹下面新建stm32文件夹(我这里主要以移植到stm32为例说明,如果是移植到VC或其他平台下,这里也可以命名为其他名字,如vc)。
- 步骤二:将下载下来的CanFestival-master\src目录下的dcf.c、emcy.c、lifegrd.c、lss.c、nmtMaster.c、nmtSlave.c、objacces.c、pdo.c、sdo.c、states.c、sync.c、timer.c共12个文件拷贝到CanFestival\src目录下;将CanFestival-master\include目录下的所有.h文件共19个文件全部拷贝到CanFestival\inc目录下,再把CanFestival-master\examples\AVR\Slave目录下的ObjDict.h文件拷贝过来,一共20个;将CanFestival-master\include\AVR目录下的applicfg.h、canfestival.h、config.h、timerscfg.h共4个头文件拷贝到canfestival\inc\stm32目录下;将CanFestival-master\drivers\cm0目录下的拷贝到canfestival\driver目录下,并在该目录下新建stm32_canfestival.c文件。
- 步骤三:将CanFestival\src目录下的所有.c文件添加到工程;将canfestival\driver目录下的stm32_canfestival.c文件添加到工程;
- 步骤四:将文件目录canfestival\inc、canfestival\inc\stm32、canfestival\driver等路径添加到工程包含路径。
- 步骤六:通过以上几步,所有的文件都弄齐了,但是编译一定会出现报错,注释或删除掉config.h文件中的如下几行就能编译通过:
1 | #include <inttypes.h> |
到这里就需要做到编译通过,这里自己需要一定的调试能力。其中原教程里的TestSlave.c、TestSlave.h在最新的CanFestival-master里面已经没有了,这俩文件是通过字典工具自动生成的,代码的第一行就有说明:
1 | ///* File generated by gen_cfile.py. Should not be modified. */ |
所以若按原教程移植,可能由于每个人下载的canfestival的版本不一样会出现无法编译通过的错误,我就在这里浪费了0.05年的生命!!!所以最好不要去找老版本的TestSlave.c、TestSlave.h、TestMaster.h、TestMaster.c,我们自己用字典工具生成。
0x02 字典(未完成,已可用)
字典是CANopen里的核心,看个近一个月才有点明白,CANopen协议也很复杂,未完成是因为领导也感觉项目上用CANopen有些大材小用了,就换了MODBUS的了。首先还是要看各种资料,其中我看的讲的比较细的有《汇川CANopen通信篇》和《CANOpen_memento-203(中文)》,感觉入门不错。
生成字典需要三个软件这个教程比较全面 canfestival中对象字典编辑器的打开,安装好打开objdictedit.py就可以生成字典了,这里就要明白协议里的各个索引什么意思,在哪里设置名称,在哪里设置心跳等等等,我也就看到这个地方,剩下的还不会,建立词典 后,把自动生成的.c和.h文件复制到CanFestival\driver,并添加到工程中。我这里的是example_objdict.c所以在.c文件的最后一行加上
1 | CO_Data example_objdict_Data = CANOPEN_NODE_DATA_INITIALIZER(example_objdict); |
根据你自己定义的c文件名写(这里就是新建字典文件的的从机名称)
【更新】2018年5月26日16:46:00
现在调通了,CANopen从机的字典文件是由objdictedit.py自动生成的,新建一个字典文件后,就是对所需要用的索引进行配置,具体的含义可以在相关资料里找到,比如最基础的0x1000-0x1029系列,其中0x1016就是心跳时间。从机的通信应用上,SDO是可以对字典配置进行修改的,PDO就是传输传感器数据或控制IO的。主机可以通过SDO对PDO进行设置,然后PDO通信和控制。
0x2000 Manufacturer Specific 我理解的就是自定义的变量,可以用来传输下位机信号或控制IO
1 | 点下方的添加 地图变量,然后再弹出的窗口里新建变量,比如新建Array数组变量CarSta,索引为0x2004, |
0x1800 Transmit PDO 1 Parameter PDO1参数设置
1 | COB ID是通信的ID,动态的CAN从机的地址+0x180 |
0x1A00 Transmit PDO 1 Mapping PDO1所映射的变量———地图变量
1 | 这里就可以映射Manufacturer Specific里的变量在主函数里extren调用来里面的变量了,比如给子指标0x01映射CarSta1的值 |
配置好以后,就可以生成字典了。
1 | 将我们在Manufacturer Specific里的变量在主函数里 extren 调用,下位机就可以修改CarSta1的值了,然后通过上位机 |
0x03 初始化并运行(未完成)
字典设置好就可以初始化了,可以参考canfestival-master\examples\TestMasterSlave\TestMasterSlave.c里面的启动步骤,当然也可以网上搜一些写好的简单的。初始化成功后Slave会发送00,我就进行到了这里。。。
【更新】2018年5月26日16:46:00
初始化Slaver会发送00,应该是网络管理设置为心跳后,会定时发送80.
对Transmission Type设置为事件触发的,可以在修改CarSta1的之后,执行_sendpdo,类似的一个函数,就会触发事件,下位机主动朝上发。
这样,CANopen基本就成型了,可以被上位机读写,可以主动发送。
CANopen的协议确实太复杂,没有专门的项目,花不上时间去看,所以很多其他的功能(节点守护,网络管理等)还没有搞出来,再接再厉!