-
Notifications
You must be signed in to change notification settings - Fork 0
/
CANOpen学习笔记
176 lines (143 loc) · 9.04 KB
/
CANOpen学习笔记
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
本文结合微信号:strongerHuang,学习进行的笔记
根据知乎专栏,学习一下canopen的基础知识.
第一讲:
根据OSI(Open System Interconnection开放系统互联)7层网络模型的角度看can现场总线属于第一层(物理层)和第二层(数据链路层).
can总线是一个硬件层的协议.
canopen就是can总线应用层的协议.
can总线采用差分信号的传输,通常情况下只需要两根信号线(can-H和can-L)就可以进行正常的通信.
第二讲:
从软硬件层次来划分,can协议属于硬件层协议,而canopen属于软件层协议.
一个can节点主要包含三类:MCU应用层程序/CAN控制器/CAN收发器.
MCU应用程序:
主要分为3块:业务逻辑代码/协议层代码/底层驱动代码.
业务逻辑代码:根据项目的需求而定,比如读一个传感器的数据,并对其做出相应逻辑处理.
协议层代码:比如canopen.
底层驱动代码: 配置can相应参数 控制收发的代码.
can控制器:
一般can控制器与处理器集成在一起.如stm32芯片内部已经集成了CAN控制器,我们编程只需要操作其中的寄存器即可.
can收发器:
can收发器将can收发引脚(can_TX和can_RX)的TTL信号转换成CAN总线的电平信号.
可以理解为:CAN总线通信认为是UART通过458进行通信:can控制器就像UART的控制器,而CAN收发器就像485转换芯片.
ISO/OSI模型:
硬件控制:物理层/数据链路层
软件控制:网络层/传输层/会话层/表示层/应用层
总线信号:
can总线分为:两线和差分信号,用隐形代表逻辑1,显形代表逻辑0.
优先级:
如果某一时刻,一个设备(节点)往总线发0,一个设备往总线发1.那么总线会呈现什么现象. 最后总线是显性,即0.
位时序:
位时序逻辑将监视串行总线,执行采样并调整采样点,在调整采样点时,需要在起始位边沿进行同步并后续的边沿进行再同步.
简单的将就是对一个bit位分几段进行采样,目的就是提高数据传输稳定性.在STM32中底层驱动代码就是需要进行位时序编程.
帧的种类和格式:
数据帧:用于发送单元向接收单元传送数据的帧.
遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧.
错误帧:用于检测出错误时向其他单元通知错误的帧.
过载帧:用于接收单元通知其尚未做好接收准备的帧.
帧间隔:用于将数据帧及遥控帧与前面的帧分离开来的帧.
数据振和遥控帧有标准格式和扩展格式两种格式.标准格式有11个位的标识符ID,扩展格式有29个位的ID.
位填充:
位填充就是指防止突发错误而设定的功能.当同样的电平持续5位则添加一个位的反型数据.
错误的种类:
位错误/填充错误/CRC错误/格式错误/ACK错误/
第三讲:CAN收发器功能/原理及作用
MCU应用程序->CAN控制器->CAN收发器->CAN总线
CAN收发器是一块类似于232或者485的转换芯片,主要功能是将CAN控制器的TTL信号转换成CAN总线的差分信号.
CAN控制器一般都是与MCU集成在一起,其发送和接收TTL信号就是MCU引脚(高低电平)信号.
以前有独立的CAN控制器,一个CAN网络节点会包含三块芯片:MCU芯片/CAN控制器/CAN收发器.现在是将MCU芯片与CAN控制器集成一起了.
CAN_H与CAN_L电压:
逻辑0时:显性,CAN_H = 3.5V,CAN_L = 1.5V;
逻辑1时:隐性,CAN_H = 2.5V,CAN_L = 2.5V;
显性隐性信号,指的是总线传输的Bit位信号;
所以CAN总线在平时空闲表现为隐性状态.如果想要发送的信号为隐性位,那么总线才会呈现出来隐性.否则,只要其它有一个节点发送显性信号.你这个节点发送出来的隐性信号就无效了.
CAN收发器R引脚
CAN收发器R引脚就是与CAN控制器接收相连的引脚.
R引脚表示的总线当前的信号,用于控制器实时监测总线信号.主要目的:
A.监测其他节点发送出来的信号:别人给它发送数据;
B.监测自身节点发送出去的信号:自己发送是否失败.就像是上面说的,自己发送一个隐性信号,结果监测出来是显性信号,就是说明是别人在发送数据
CAN收发器与485芯片差异:
CAN通信和485通信一个是属于半双工.但是为什么CAN总线相比于485通信不管是在速度还是稳定性上都有明显优势.
can总线具有自动仲裁功能,这样就提高了总线效率.
can相比与485具有明显的优势,主要原因还在于can控制器.
可以不使用CAN收发器吗?
单向传输可以,双向传输就不可以.原因:CAN控制器实时监测发送出的信号是否正确.也就是TX和RX的信号一致,否则CAN控制器就是认为发送失败.
第4讲:CAN总线波特率/位时序/帧类型及格式说明
CAN总线属于异步通信,因此就有波特率,这个波特率发生器在CAN控制器内部.
通信:异步通信和同步通信
同步通信:设备之间通过同步信号(CLK时钟)来实现数据传输的通信叫同步通信.如I2c/SPI
异步通信:通信设备之间通过约定一样的时间来收发数据.这个时间就是会决定本节说的波特率
波特率
结合UART来阐述:
波特(Baud)是调制速率,指的是有效数据信号调制载波的速率,即单位时间内载波调制状态变化的次数.它是一种对符号传输速率的一种度量.
UART每秒传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps.
比特率:单位时间传送的二进制位数.
波特率:单位时间内传输的符号个数;
第6讲:结合代码理解CAN底层收发数据(含stm32例程)
CAN发送数据结构:
CAN发送由我们编程控制的参数.其实是会发现,主要是上面帧格式中内容:ID/IDE/RTR/DLC/Data.
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
}CanTxMsg;
发送配置参数:
TxMessage.StdId = 0x321; //标准帧ID
TxMessage.ExtId = 0x01; //扩展帧ID(暂未使用)
TxMessage.IDE =CAN_ID_STD; //标准帧(或者扩展帧)
TxMessage.RTR =CAN_RTR_DATA; //数据帧(或者远程帧)
TxMessage.DLC =6; // 长度
for(i=0; i<TxMessage.DLC;i++)
{
Txmessage.Data[i]=0xA0 +i;
}
CAN接收代码
CAN接收其实和发送类似,CAN总线上的字段就那些,在接收端接收的那些参数无非就是发送端发送出来的那些参数.针对STM32内部集成的CAN
接收数据结构多了一个FMI参数,大概意思就是接受消息邮箱筛选器索引.
typedef struct
{
uint32_t StdId;
uint32_t ExId;
Uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
uint8_t FMI;
}CanRxMsg;
接收操作:
CanRxMsg RxMessage;
CAN_Receive(CANx, CAN_RX_FIFO,&RXMessage);//这里相当于提取参数到Rx数据结构
波特率配置代码
位时序与波特率的关系:
/*配置CAN波特率 = 1MBps = 36M/4/(1+3+5) */
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_SJW = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Presaler = 4;
CAN_Init(CANx, &CAN_InitStructure);
第7讲:CANOpen协议概述
CANOpen是基于CAN串行总线的网络传输系统应用层协议,遵循ISO/OSI标准模型.
网络中不同的设备通过对象字典或者对象相互交换数据,其中,主节点可以通过过程数据对象(PDO)或者服务数据对象(SDO)来获取或者修改其他节点对象字典列表中 的数据.
CANOpen协议主要分为三大块:
CAN总线<-通讯接口(PSO/SDO/特殊功能对象/NMT对象)<->对象字典(数据类型/通信对象/应用对象)<->应用(应用程序/设备子协议实现)<->I/O
通信对象:
1网络管理对象(NMT):
网络管理对象包括Boot-up消息,Heartbeat协议及NMT消息,基于主从通信模式,NMT用于管理和监控网络中的各个节点.主要实现三种功能:
节点状态控制/错误控制和节点启动.
2服务数据对象(SDO)
包括接收SDO(R-SDO)和发送SDO(T-SDO);
通过使用索引和子索引,SDO使客户能够访问设备对象字典中的项.
SDO通过CAL中多元域的CMS对象来实现,允许传送任何长度的数据,当数据超过4字节时,分拆成几个报文.
协议是确认服务类型,为每一个消息生成一个应答.SDO请求和应答报文总是包含8个字节.
3过程数据对象(PDO)
包括接收PDO(RPDO)和发送PDO(TPDO).
用来传输实时数据,数据从一个创建者传送到一个或者多个接收者.数据传送限制在1到8个字节.
每个canopen设备包含8个缺省的PDO通道,4个发送PDO通道和4个接收PDO通道.
PDO包含同步和异步两种传输方式,由该PDO对应的通信参数决定.
PDO消息的内容是预定义的,由该PDO对应的映射参数决定.
同步对象(SYNC):
同步对象是CANOpen主站周期性地广播到CAN总线的报文,用来实现基本的网络始终信号,每个设备可以根据自己的配置,决定是否使用该事件来跟其它网络进行通信
对象字典:
对象字典是设备规范中最重要的部分.它是一组参数金和变量的有序集合,包含了设备描述及设备网络状态的所有参数.