CANOPEN协议理解与实现-基于STM32或其他

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定时发送的完整配置流程,之后会有更详细教程

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32是一种32位的微控制器系列,而CANopen是一种用于控制和通信的标准协议STM32基于CANopen协议意味着STM32微控制器可以通过CANopen协议进行通信和控制。 CANopen是一种广泛使用的开放式通信协议,特别适用于工业自动化和物联网应用。它定义了在CAN总线上的通信规范和通信对象,使不同设备和系统之间可以进行有效的数据交换和控制。CANopen协议支持多种通信对象,包括节点状态、参数设置、数据传输等。它提供了灵活的网络配置和良好的可扩展性,能够满足不同应用场景的需求。 STM32作为一种强大的微控制器,提供了丰富的硬件和软件支持来实现CANopen协议。它具有内置的CAN控制器和硬件过滤器,能够轻松地实现CAN通信功能。此外,STM32还提供了丰富的软件库和工具,开发人员可以使用这些资源来进行CANopen协议的开发和实现。 通过使用STM32基于CANopen协议,我们可以构建复杂的自动化控制系统。例如,我们可以将多个STM32微控制器连接在同一个CAN总线上,彼此之间进行通信和协调。每个STM32微控制器可以作为一个CANopen节点,负责不同的任务和功能。通过CANopen协议,这些节点可以共享信息、控制装置和传感器,从而实现整个系统的高效运行。 在物联网应用中,STM32基于CANopen协议也可以用于设备之间的通信和控制。例如,我们可以将STM32与其他设备如传感器、执行器等连接在一起,通过CANopen协议进行数据交换和控制。这种通信方式可以提供高速、可靠的数据传输,满足物联网应用对于实时性和可靠性的要求。 综上所述,STM32基于CANopen协议提供了一种强大的控制和通信方式。它可以满足工业自动化和物联网应用对于通信和控制的需求,为开发人员提供了丰富的资源和工具,使他们能够更加方便地实现复杂的系统和应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值