Canopen 心跳报文在我司一二级核心板上的实现
1、前言
基于 Canopen 协议太过庞大,理解起来和二次开发起来稍显困难,而我司实
际项目上使用到的 Canopen 相关知识,只有心跳报文,节点 ID,节点掉线重连,
节点 ID 上报等相关功能;故我司采用取其精华,去其糟粕的原则,自定符合我
司实际项目中的 Canopen 协议,现将该协议相关内容展现如下;
2、具体实施
(1) 配置管脚:(PA11 -> CANL PA12 -> CANH)
(2) Can 单元设置:
(3) Can 波特率设置:
(4) 过滤器配置:
节点(一级)在接收报文时,根据标识符(CAN ID)的值决定软件是否需要
该报文;若需要,就拷贝到 SRAM 里,若不需,报文就被丢弃且无需软件干扰。
(5) FIFO0 消息挂号中断允许:
(6) 中断服务函数
(7) Can 发送函数
3、CAN ID 值结构分析
例:给定一个 CAN ID,如 0x1800f001(扩展 ID),CAN ID 的值本身包含两部分,
即基本 ID 与扩展 ID,基本格式中不存在扩展 ID,而扩展格式中 ID0 ~ ID17 为扩
展 ID,ID18 ~ ID28 为基本 ID;
因此:CAN ID 值 0x1800f001 用二进制表示为:
0b 0001 1000 0000 0000 1111 0000 0000 0001
注:红色部分为扩展 ID,蓝色部分为基本 ID
故,我们在 CAN 发送函数中,在 CanTxMsg 结构体中,着重配置 ExtId 和 IDE
CAN 发送函数解析:Can_Send_Msg(&Data,len,0x09,(local_extid&0x3fc00)|0x01)
Data:发送的数据
len:发送数据长度
0x09:数据类型 StdId(11 位) 正常数据
(local_extid&0x3fc00)|0x01:
该一级板的节点 ID(8 位)+ 该一级板上的具体硬件功能(10 位)= ExtId(18
位)
local_extid = 0x01<<10: 一级核心板节点 ID (0x01 代表该核心板编号)
0x01:具体硬件编号(如:按键 0x01)
基本 ID(StdId) 正常数据:0x09
节点掉线重连: 0xfe
4、框架图
节点掉线:0xfd