STM32标准库开发
文章链接:
STM32F103标准库开发----目录
STM32F103标准库开发----CAN总线通信实验----初始化/波特率
STM32F103标准库开发----CAN总线通信实验----发送和接收
资源链接:
本例程已经调试成功,下载即可使用。
STM32F103标准库开发----CAN通信收发实验----程序源码
一、CAN总线简介
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。
由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。
此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
CAN总线特点:
- 多主控制
- 系统柔软性
- 速度快,距离远
- 具有错误检测、错误通知和错误恢复功能
- 故障封闭功能
- 连接节点多
CAN总线标准
CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。
ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。
总线拓扑图
闭环总线网络----ISO11898
闭环总线网络高速、短距离,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个120 欧的电阻。
开环总线网络----ISO11519
开环总线网络低速、远距离,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个2.2千欧的电阻。
差分信号
CAN总线采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。
在差分信号中,逻辑0和逻辑1是用两根差分信号线的电压差来表示。
当处于逻辑1,CAN_High和CAN_Low的电压差小于0.5V时(0V),称为隐性电平(Recessive);
当处于逻辑0,CAN_High和CAN_Low的电压差大于0.9V时(2V),称为显性电平(Dominant)。
差分信号的传输的优点:
- 抗干扰能力强
- 能有效抑制它对外部的电磁干扰
- 时序定位精确
二、CAN 协议
CAN 帧格式
为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧。
它们的类型及用途说明如表所示:
帧 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧 |
遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧 |
错误帧 | 用用于当检测出错误时向其它单元通知错误的帧 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧 |
1. 数据帧
数据帧由 7 个段构成,具体数据帧构成图如下:
(1)帧起始(标准、扩展格式相同)
表示帧开始的段,1个位的显性位。
(2)仲裁段(标准、扩展格式不同)
仲裁段结构图如下图所示:
表示该帧优先级的段,标准格式和扩展格式在仲裁段的构成有所不同。
标准格式 ---- 共12位:11位基本ID 和 1位RTR位
-
帧ID
标准格式的 ID 有 11 个位,从 ID28 到 ID18 被依次发送。
禁止高7位都为隐性(禁止设定:ID=1111111XXXX)。 -
RTR位 ---- 远程传输请求位
用于区分数据帧和遥控帧的:显性电平 ---- 数据帧,隐性电平 ---- 遥控帧
扩展格式 ---- 共32位:11位基本ID 、1位SRR位、1位IDE位、18位扩展ID和1位RTR位。
-
帧ID
扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。 -
SRR 位
只存在于扩展格式,它用于替代标准格式中的 RTR位。
由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。 -
IDE 位 ---- 标识符扩展位
用于区分标准格式与扩展格式:显性电平 ---- 标准格式,隐性电平 ----- 扩展格式 -
RTR位 ---- 远程传输请求位
用于区分数据帧和遥控帧的:显性电平 ---- 数据帧,隐性电平 ---- 遥控帧
(3)控制段(标准、扩展格式不同)
控制段结构图如下图所示:
表示数据的字节数及保留位的段,标准格式和扩展格式的构成有所不同。
由 6 个位构成:
标准格式:1位IDE位、1位r0保留位 和 4位DLC数据长度码
-
IDE 位 ---- 标识符扩展位
用于区分标准格式与扩展格式:显性电平 ---- 标准格式,隐性电平 ----- 扩展格式 -
保留位 ---- r0
保留位必须全部以显性电平发送。
但接收方可以接收显性、隐性及其任意组合的电平。 -
数据长度码 ---- DLC
表示发送/接收的数据长度(字节)。
数据的字节数必须为 0~8 字节,但接收方对 DLC = 9~15 的情况并不视为错误。
扩展格式:2位 r0 和 r1 保留位 和 4位DLC数据长度码
-
保留位 ---- r0、r1
保留位必须全部以显性电平发送。
但接收方可以接收显性、隐性及其任意组合的电平。 -
数据长度码 ---- DLC
表示发送/接收的数据长度(字节)。
数据的字节数必须为 0~8 字节,但接收方对 DLC = 9~15 的情况并不视为错误。
数据长度码与数据的字节数的对应关系如下表所示:
数据长度码 | 数据字节数 | |||
---|---|---|---|---|
DLC3 | DLC2 | DLC1 | DLC0 | |
D-显-0 | D-显-0 | D-显-0 | D-显-0 | 0 |
D-显-0 | D-显-0 | D-显-0 | R-隐-1 | 1 |
D-显-0 | D-显-0 | R-隐-1 | D-显-0 | 2 |
D-显-0 | D-显-0 | R-隐-1 | R-隐-1 | 3 |
D-显-0 | R-隐-1 | D-显-0 | D-显-0 | 4 |
D-显-0 | R-隐-1 | D-显-0 | R-隐-1 | 5 |
D-显-0 | R-隐-1 | R-隐-1 | D-显-0 | 6 |
D-显-0 | R-隐-1 | R-隐-1 | R-隐-1 | 7 |
R-隐-1 | D-显-0 | D-显-0 | D-显-0 | 8 |
(4)数据段(标准、扩展格式相同)
数据段可包含 0~8 个字节的数据。
从 MSB(最高位)开始输出。
(5)CRC段(标准、扩展格式相同)
CRC 段是检查帧传输错误的帧。
由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成。
CRC 顺序—15位
CRC 顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。
接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
CRC 界定符
用于分隔的位
(6)ACK段(标准、扩展格式相同)
ACK 段用来确认是否正常接收。
由 1位 ACK 槽(ACK Slot) 和1位 ACK 界定符 构成。
ACK 槽(ACK Slot)
发送单元在 ACK 段发送 2 个位的隐性位。
接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,
通知发送单元正常接收结束。这称作“发 送 ACK”或者“返回 ACK”。
ACK 界定符
用于分隔的位
(7)帧结束(标准、扩展格式相同)
帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。
2. 遥控帧(远程帧)
接收单元向发送单元请求发送数据所用的帧。
遥控帧由 6 个段组成,遥控帧没有数据帧的数据段。
具体遥控帧构成图如下:
遥控帧的 RTR 位为隐性位,没有数据段。
3. 错误帧
用于在接收和发送消息时检测出错误通知错误的帧。
错误帧由错误标志和错误界定符构成。
(1)错误标志
错误标志包括主动错误标志和被动错误标志两种。
主动错误标志:6个位的显性位。
被动错误标志:6个位的隐性位。
(2)错误界定符
错误界定符由 8 个位的隐性位构成。
4. 过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。
过载帧由过载标志和过载界定符构成。
(1)过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2)过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
5. 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。
数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
(1)间隔
3 个位的隐性位。
(2)总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3)延迟传送(发送暂时停止)
8个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
优先级
在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁:
- 连续输出显性电平最多的单元可继续发送。
-
优先级:显性(低电平)> 隐形(高电平)。
(1)数据帧和遥控帧的优先级
具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。
数据帧 > 遥控帧
(2)标准格式和扩展格式的优先级
标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
标准格式 > 扩展格式
位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
(1)发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。
(2)接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。
如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
位时序
为了实现位同步,CAN 协议把每一个数据位的时序分解成如下图所示的 SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。
分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。
采样点:
所谓采样点是读取总线电平,并将读到的电平作为位值的点。
位置在 PBS1 结束处。
各段的作用如下表所示:
硬件同步
接收单元在总线空闲状态检测出帧起始时进行的同步调整。
在检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。
文章来源:https://www.toymoban.com/news/detail-792704.html
重新同步
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。
但如果发生了超出 SJW值的误差时,最大调整量不能超过 SJW 值。
相位超前时
相位滞后时
文章来源地址https://www.toymoban.com/news/detail-792704.html
到了这里,关于CAN通信----基本原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!