首页 > 其他分享 >【STM32开发之寄存器版】(十六)-CAN总线基础知识

【STM32开发之寄存器版】(十六)-CAN总线基础知识

时间:2024-11-05 10:19:42浏览次数:3  
标签:发送 ACK 总线 电平 STM32 寄存器 ID 单元

一、CAN简介

本文主要参考 瑞萨CAN入门书

CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

对于车载网络的构想如下图所示:

CAN控制器根据两条线上的的电位差来判断总线电平,总线电平分为显性电平和隐形电平。CAN协议具备以下特点:

  • 多主控制。在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
  • 系统的柔软性。与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
  • 通信速度较快,通信距离远。最高 1Mbps(距离小于 40M),最远可达 10KM(速率低于 5Kbps)。
  • 具有错误检测、错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
  • 故障封闭功能。CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
  • 连接节点多。CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

CAN 协议经过 ISO 标准化后有两个标准:ISO11898标准和 ISO11519-2 标准。其中 ISO11898是针对通信速率为 125Kbps~1Mbps 的高速通信标准,而 ISO11519-2 是针对通信速率为 125Kbps以下的低速通信标准。

二、ISO11898物理层特征

本文使用的是500Kbps的通信速率,该速率为ISO11898标准,其物理层特征如下图所示:

从该特性可以看出,显性电平对应逻辑 0,CAN_H 和 CAN_L 之差为 2.5V 左右。而隐性电平对应逻辑 1,CAN_H 和 CAN_L 之差为 0V。在总线上显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)。另外,在 CAN 总线的起止端都有一个 120Ω的终端电阻,来做阻抗匹配,以减少回波反射。

三、CAN协议的5种帧类型

CAN协议主要由以下5种类型的帧组成:

帧用途
数据帧用于发送单元向接收单元传送数据的帧。
遥控帧用于接收单元向具有相同 ID 的发送单元请求数据的帧。
错误帧用于当检测出错误时向其它单元通知错误的帧。
过载帧用于接收单元通知其尚未做好接收准备的帧。
帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧。

除此以外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),扩展格式有 29 个位的 ID。

本文仅对数据帧进行详细介绍,数据帧一般由7个段组成,即: 

段用途
帧起始表示数据帧开始的段。
仲裁段表示该帧优先级的段。
控制段表示数据的字节数及保留位的段。
数据段数据的内容,一帧可发送 0~8 个字节的数据。
CRC段检查帧的传输错误的段。
ACK段表示确认正常接收的段。
帧结束帧结束。表示数据帧结束的段。

数据帧的构成如下图所示:

其中, D代表显性电平,R代表隐形电平。

3.1 帧起始

标准帧和扩展帧都是由1个位的显性电平表示帧起始。如下图所示:

3.2 仲裁段

仲裁段是表示数据优先级的段,标准帧和扩展帧格式有所区别,如下图所示:

标准格式的 ID 有 11 个位。从 ID28 到 ID18 被依次发送。禁止高 7 位都为隐性。(禁止设定:ID=1111111XXXX)扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和标准格式的 ID 相同。禁止高 7 位都为隐性。(禁止设定:基本 ID=1111111XXXX)

3.3 控制段

控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。

保留位r0,r1必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。数据的字节数必须为 0~8 字节。但接收方对数据长度码 DLC = 9~15 的情况并不视为错误。数据长度码与数据的字节数的对应关系如下表所示。

3.4 数据段

数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。

3.5 CRC段

CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序 和 1 个位的 CRC 界定符(用于分隔的位)构成。

CRC 顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。

3.6 ACK段

ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。

发送单元在 ACK 段发送 2 个位的隐性位。接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发送 ACK”或者“返回 ACK”。发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。

3.7 帧结束

帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。

四、CAN协议的位时序

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段,如下表所示。

这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。

1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。

1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。如下图所示:

所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。

五、CAN总线的仲裁过程

在总线空闲态,最先开始发送消息的单元获得发送权;多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送;仲裁的过程如下图所示。

六、总结 

有关CAN协议的更多内容详见  瑞萨CAN入门书 。本文主要讨论了ISO11898物理层特征以及CAN协议的帧类型、位时序以及仲裁过程。下一节将进行STM32F103ZET6的CAN回环测试。

标签:发送,ACK,总线,电平,STM32,寄存器,ID,单元
From: https://blog.csdn.net/Jlinkneeder/article/details/143488830

相关文章

  • 一篇文章教会你HC-SR04超声波传感器测距,附STM32代码示例
     一、HC-SR04超声波传感器介绍:(1)HC-SR04(2020版本):        HC-SR04(2020版本)是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块。默认条件下,软件与硬件完全兼容老版本HC-SR04;可以通过电阻设置成UART或IIC模式。2CM超小盲区,4.5M典型最远测......
  • stm32教程:GPIO口及流水灯实验
    早上好啊,大佬们,想必在你电脑硬盘的某处放着一个stm32的工程模板吧!~然后今天,就和大家一起写出第一个小项目——流水灯咱们先来讲讲GPIO口吧。关于GPIO的那点事儿什么是GPIOGPIO(英语:General-purposeinput/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供......
  • STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用 HAL_TIM_IRQHandler(&time
    STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用HAL_TIM_IRQHandler(&timer_handle);而不是TIM2_IRQHandler(void)里直接写需要的程序呢?而标准库只需要在TIM2_IRQHandle里写中断需要的代码即可?        在STM32HAL库中,中断服务函数(ISR)的设计思路与标准......
  • 学习记录:STM32G431CBU6的多通道ADC采样串口打印(HAL库)
    一配置  二代码uint16_tGet_adc(){//启动ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)......
  • STM32——PWM
    目录1、PWM2、芯片手册通用定时器(TIM1/TIM8)高级定时器(TIMx)3、如何配置生成一个PWM波形4、示例5、如何配置出来的5.1、RCC 5.2、时基单元5.3、PWM输出5.4、具体配置1、PWMPWM信号:PWM信号通过改变高电平和低电平的持续时间比(占空比)来调节输出功率。定时器:STM32......
  • ST官方开发工具(一) STM32CubeMX 安装
    STM32CubeMX安装安装Java的环境STM32CubeMX安装在开发STM32MP157的时候我们还需要用到一些ST官方提供的软件,一共有三种:STM32CubeMX、STM32CubeIDE、STM32CubeProgrammerSTM32CubeMX可以直接在ST官网下载到http://www.st.com/en/developmen......
  • STM32 第20章 USART--串口通信3
    时间:2024.10.30参考资料:《零死角玩转STM32》“USART--串口通信”章节 一、学习内容1、串口2345代码移植实现控制串口2-->将串口1的宏修改成串口2的即可1.1串口的宏串口1://为了方便移植,定义的宏//串口1-USART#defineDEBUG_USARTxUSART1#d......
  • STM32 第20章 USART--串口通信2
    时间:2024.10.29参考资料:《零死角玩转STM32》“USART--串口通信”章节编程是从GPIO输出-使用固件库点亮LED灯的基础上开始一、学习内容1、STM32串口初始化结构体和固件库1.1USART初始化结构体 /***@briefUSARTInitStructuredefinition*/typedef......
  • STM32按键开关灯
    文章目录概要整体架构流程灯LEDSTM32F103的IO口--IN/OUT输入输出的接口IO口资源和命名方式stm32中GPIO的内部结构以及工作模式寄存器与配置时钟软件编程驱动LED灯延时函数使用嘀嗒定时器按键驱动概要使用Stm32F103ZET6型号芯片开发项目中灯led、IO口、......
  • 【STM32 Blue Pill编程实例】-4位7段数码管使用
    4位7段数码管使用文章目录4位7段数码管使用1、7段数码介绍2、硬件准备与接线3、模块配置4、代码实现在本文中,我们将介绍如何将STM32BluePill开发板与4位7段数码管连接,并在STM32CubeIDE中对其进行编程。在文章中首先将介绍4位7段数码管及其与......