超简单的CAN通信原理讲解(一)

MCU常用协议讲解

超简单的CAN通信原理讲解(一)


前言

参考文件
<瑞萨电子can入门教程>,可以在瑞萨官网下载到,讲的很细,想深究CAN协议的可以去好好研究。

🤦‍♂️想看完协议写出CAN的代码还是很难的,很多具体的操作需要结合CAN控制器去说明,CAN的协议文档我看了10多遍但是让我写出CAN的
通信代码我觉得还是很困难,只能做到给我一份CAN的代码我理解他的意思。所以我分两篇去讲解CAN协议,第一篇根据CAN手册去分析CAN协议具体的规范和格式,第二篇结合具体CAN控制器和CAN收发器去跟着理解CAN代码,笔者是一个理解能力一般的人😒,所以我会写文档一般都会很细致,如果别人看了我的文档能理解CAN写出CAN代码说明我才真正掌握CAN了🤣。

一、CAN协议是什么?

CAN协议是 Controller Area Network的缩写,全称控制器局域网络,是 ISO 国际标准化的串行通信协议。由德国电气商博世公司提出,并
通过了 ISO11898ISO11519进行了标准化,所以CAN协议也就有了两种执行标准,两种数据定义。
所以ISO11898也叫高速CAN(经典CAN),ISO 11519-2也叫容错CAN,高速很好理解,容错的话见后面,汽车上常用的是高速CAN
下面放出两种协议对比,显性隐性不需要强记,知道总线电平等于他们的电位差(CAN_HIGH-CAN_LOW)即可
在这里插入图片描述

二、CAN协议使用场景

CAN协议最广泛的使用场景,就在于汽车领域了,基本现在所有的汽车电子控制都是使用CAN协议的,CAN最早提出也是为了解决汽车领域复杂电子期间之间的通信,同时兼顾可靠性。下面放一个老图,汽车CAN网络勾想
在这里插入图片描述


三、CAN网络拓扑图

CAN网络中的控制器和收发器是两种不同的东西,CAN控制器不直接连接CAN网络,CAN网络上的电平分为显式隐式两种,
CAN协议使用差分信号进行通信,两根线分别为CAN_L和CAN_H
控制器:与MCU连接
收发器:把TTL电平转成CAN信号,或者把CAN信号转成TTL电平

在这里插入图片描述

四、CAN网络硬件接线图

两种协议下的CAN硬件电路连接也不同,可以通过末端电阻来判断是哪种连接方式,第一种在网络末端并联两个120Ω的电阻(有点像485通信),第二种在CAN_L和CAN_H分别串联两个2.2k的电阻,也可以通过这种方式来区分出是使用什么协议。
在这里插入图片描述

显性和隐性(这里注意黄色字体和认知中的显性对应1有点区别)
以常用高速CAN ISO11898说明:只需要记住典型值即可

  1. 典型电平是CAN_L = CAN_LOW = 2.5V
  2. 典型显性CAN_H -CAN_L = 0V --------------------》输出逻辑0
  3. 典型隐性CAN_H(3.5V) -CAN_L(1.5V) = 2V --------------------》输出逻辑1
CAN_HIGHCAN_LOWCAN_HIGH - CAN_LOW显隐性逻辑电平(CAN收发器上TXD或者RXD上电平)
2.5V2.5V0V显性0
3.5V1.5V2V隐性1

隐性代表无数据,显性代表有数据。总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”

五、协议分析

1.CAN协议帧的种类

• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔

CAN协议分为这五种帧,就快速使用来说,我们需要关注数据帧即可。
为什么只关注数据帧,因为数据帧是控制器组包去主动发送的,而类似错误帧之类的是总线单元主动发出的,例如标准的UART协议实际上是10bit(1个起始位,7个数据位,1个校验位,1个结束位),但是我们串口实际上只组包了7bit的数据,校验终止都是UART单元去组包的,
这里同理。我们控制器组包需要对数据帧组包,错误帧遥控帧等其他帧等明白了数据帧组包CAN总线也理解差不多了,可以去看协议文档学习。
在这里插入图片描述

2.CAN协议数据帧

数据帧由 7 个段构成。
(1) 帧起始
表示数据帧开始的段。1bit低电平(显性)
(2) 仲裁段
表示该帧优先级的段。11bit或者29bit的ID,29bit为扩展格式,大部分都是11bit标准格式
(3) 控制段
表示数据的字节数及保留位的段。6bit表示数据的长度(可设置为0-8字节)
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。最大8byte
(5) CRC 段
检查帧的传输错误的段。16bit(15bit的CRC和1bit的分隔符)
(6) ACK 段
表示确认正常接收的段。2bit(ACK槽+ACK界定符)
(7) 帧结束
表示数据帧结束的段。7bit高电平(隐性位)

数据帧格式如下:其中标准模式为常用模式,遵循ISO11898协议
数据帧说明

3.CAN协议的波特率计算

CAN协议是差分信号传输,不像I2C和SPI有单独的时钟总线,那么如何决定传输速率,如何判定1us内传输的是1bit还是1byte呢?

位时序
由发送单元在非同步的情况下每秒钟发送的位数称为位速率。一个位分为四段
tq
全程time Quantun,是最小时间单位,类似于I2C同步时钟里面的一个最小方波,tq = 1 / 波特率,每个段由不同数目的tq组成

• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
在这里插入图片描述

波特率=时钟频率 / (分频系数 + 1)/ (时间段1+时间段2+同步跳转长度)
bps = Fpclk1/ ((tbs1+1+tbs2+1+1)*brp)

可以使用下面CAN波特率计算网站快速计算波特率
can波特率计算网站


总结

下一篇会结合STM32的CAN控制器去逐步分析代码。。。

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CAN通信是一种高可靠性、高带宽、多节点的通信协议,广泛应用于汽车、工业自动化、机器人等领域。下面介绍一下CAN通信的基本原理和STM32的实现。 一、CAN通信原理 CAN(Controller Area Network)控制器局域网,是一种串行通信协议,主要用于多节点间的通信。CAN通信采用差分传输方式,具有高抗干扰性和高可靠性。CAN通信协议有两种工作模式:标准模式和扩展模式,其中标准模式的ID位数为11位,扩展模式的ID位数为29位。CAN通信协议分为数据帧和远程帧两种帧结构,其中数据帧包含数据信息,远程帧不包含数据信息。 在CAN通信中,每个节点都有一个唯一的地址,称为CAN ID。节点之间通过CAN总线进行通信,CAN总线上的每个节点都有一个CAN控制器,用于控制数据帧的发送和接收。CAN总线上的节点可以是主控节点或从节点。主控节点负责控制通信的发起和结束,从节点只能在主控节点的控制下发送数据。 二、STM32实现CAN通信 STM32是一款高性能的32位微控制器,内置CAN控制器,可以方便地实现CAN通信。下面介绍一下如何使用STM32实现CAN通信。 1.硬件连接 首先需要将CAN控制器连接到CAN总线上,连接方式如下图所示: ![image.png](attachment:image.png) 其中CAN1和CAN2分别连接到CAN总线的CANH和CANL引脚上,CAN总线上的终端电阻需要根据实际情况进行设置。 2.配置CAN控制器 在STM32中,可以使用CubeMX软件配置CAN控制器,具体步骤如下: (1)打开CubeMX软件,选择对应的芯片型号,点击“Pinout & Configuration”选项卡。 (2)选择CAN1或CAN2控制器,设置对应的工作模式、时钟源、波特率等参数。 (3)点击“Generate Code”按钮,生成对应的初始化代码。 3.发送数据帧 发送数据帧的步骤如下: (1)将数据填充到CAN数据结构体中。 (2)设置CAN帧结构体的ID、长度等信息。 (3)调用HAL_CAN_Transmit函数发送数据帧。 示例代码如下: ```c CAN_TxHeaderTypeDef TxHeader; uint8_t TxData[8]; TxData[0] = 0x01; TxData[1] = 0x02; TxHeader.StdId = 0x123; TxHeader.ExtId = 0; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 8; HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox); ``` 4.接收数据帧 接收数据帧的步骤如下: (1)定义CAN帧结构体变量。 (2)调用HAL_CAN_Receive函数接收数据帧。 (3)将接收到的数据从CAN帧结构体中提取出来。 示例代码如下: ```c CAN_RxHeaderTypeDef RxHeader; uint8_t RxData[8]; if (HAL_CAN_GetRxFifoFillLevel(&hcan1, CAN_RX_FIFO0) > 0) { HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RxData); if (RxHeader.IDE == CAN_ID_STD && RxHeader.RTR == CAN_RTR_DATA) { // 处理接收到的数据 } } ``` 以上就是CAN通信的基本原理和STM32实现的步骤,需要注意的是,在使用CAN通信时,需要根据实际情况进行波特率、终端电阻等参数的设置,以确保通信的稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值