1 CAN与CANOPEN区别
CAN协议仅仅定义了物理层和数据链路层的协议,即电信号高低电平到数据信号转换协议,数据信号的传输协议,常用有CAN2.0A,CAN2.0B协议。
CANOPEN协议则相当于对CAN协议的进一步补充,它属于应用层协议,定义了传输数据各字节的具体含义,方便对不同厂商的设备进行配置。
CANOPEN中报文使用的标识符叫COB_ID,是由CAN协议中的CANID演化来的,COB_ID是CANOPEN中报文的唯一标识符,通过该ID便可以区分报文是PDO,SDO,或是NMT报文。
2 CANOPEN常用报文
在CANOPEN中有很多英文缩写,PDO,SDO,OD,NMT等,在进行实验前需简单理解。
OD,对象字典,在进行CANOPEN通讯前需对其进行配置,该字典记录了发送的数据报文中各字节的参数名称,类型,代表的含义,也存放着一些参数值,设备运行初始值,厂家信息等。
NMT,网络管理,CAN网络中的各个节点没有主从之分,但是为方便CAN网络管理,会设置一个主节点来控制其他节点的启动停止等状态,该主节点与其他子节点之间进行通信的报文被称作NMT网络管理报文。
PDO,过程数据对象报文,用来传输实时数据,每条报文最多可以传输8个字节数据,单向传输,无需应答,PDO报文只有在从机节点处于操作状态时才可以使用。PDO常用于从机向主机发送自己的实时输出数据。
SDO,服务数据报文,会指定接收节点地址,接收节点收到报文后需进行应答,即轮询式通信,SDO报文常用于主机配置或读取从机参数,每条报文最多可以传输8个字节,但目前使用较多的是快速SDO报文,每条最多发送4个字节数据(牺牲前四个字节数据用作索引),可以一次来回完成传输。
3 CANOPEN协议实现
3.1 环境准备
1、下载安装字典工具(需使用py2.7打开)
2、移植canfestival-3框架程序
具体操作可参考文章基于STM32F4的CANOpen移植教程(超级详细)_移植canopen详细步骤.pdf 跋扈洋-CSDN博客
3.2 配置字典
1、使用py2,7打开字典工具objdictedit.py,点击文件—新建,创建一个新节点
2、配置TPDO参数,帧ID为0x180+节点ID,这里设从机节点为9;Transmission Type传输类型设为0xFF或0xFE,代表使用定时触发,Event Timer为定时时间,单位是ms
3、配置TPDO发送数据,在索引0x2000下添加变量并进行命名,类型可选变量或数组
可以对变量的类型、名字、初始值、读取权限进行设置(之后该变量会以全局变量的形式存在于程序中)
4、配置TPDO映射,将TPDO发送数据变量与TPDO报文进行关联映射,这里将TPDO1报文要发送的数据映射到全局变量var1上,这样在发送TPDO1报文时,就会自动去找变量var1的值进行发送,且遵循先发低字节再发高字节
至此,简单的TPDO定时1000ms发送数据var1配置完成
5、导出.c文件,点击文件—建立词典,生成.c与.h文件
3.3 程序编写
生成字典的.c和.h文件后,将其添加到个人keil工程中(环境准备阶段,canfestival程序也已添加入keil工程),所有移植程序如下图所示,其中,Master.c文件对应上文test.c,为方便程序中调用,与canfestival程序中命名一致,创建字典时取名为Master
1、配置CAN,在can1.c文件中(避免与canfestival中自带的can.c文件重名)依据STM32或GD32固件库函数完成CAN初始化配置,设置CAN波特率为500kbps,需在main函数中进行初始化,调用can1.c中初始化函数:CAN1_Init(&Master_Data,500000)
2、配置定时器,需要设置一个硬件定时器,canfestival程序中会使用该定时器实现多个软件定时器,用于通讯中的资源调度以及实现PDO等报文的定时发送功能,在timer3文件中(避免与canfestival中自带的timer.c文件重名)依据STM32或GD32固件库函数完成定时器初始化配置,这里若设置定时器分频系数为840-1(时钟84MHZ情况下),即分频后周期为10us,则需保证canfestival程序中计时值一致,即在timerscfg.h文件中需注意,每10us跳动一次,*100即为软件定时中的1ms,/10即为1us
#define MS_TO_TIMEVAL(ms) ((ms) * 100)
#define US_TO_TIMEVAL(us) ((us) / 10)
以及timer3.c文件中设置的定时器period值为65535-1与timerscfg.h文件中的#define TIMEVAL_MAX 0xFFFF需保持一致
最后也需在main函数中进行初始化,调用timer3.c中函数:TIM3_Init()
3、main函数程序编写
在main中实现CAN和定时器的初始化,从机节点ID配置,节点状态配置为Operational后,则会自动按照上文中配置的1000ms进行PDO报文发送,帧ID为0x189,数据内容为变量var1的值
CAN1_Init(&Master_Data,500000);
TIM3_Init();
setNodeId(&Master_Data, 0x09);
setState(&Master_Data, Initialisation); //节点初始化
setState(&Master_Data, Pre_operational);
setState(&Master_Data, Operational);
4 实验测试
打开CANpro协议分析平台软件,点击按钮可进行实时保存接收数据
点击启动,选择波特率确定后显示接收到数据
以上是TPDO定时发送的完整配置流程,之后会有更详细教程