CAN通信协议总结

CAN通信协议


一、应用范围:
广泛应用于汽车电子行业,其优点在于传输距离远,抗电磁干扰能力强,有错误检测,错误通知以及自动重传等功能。
物理层: 串行异步通信,半双工。CAN通信节点由CAN控制器和CAN收发器组成,只有两根信号线,CAN_H和CAN_L,用于产生差分信号来表示显性电平和隐性电平。
显性电平:记产生差分信号的两根线的电压差为显性电平时,为逻辑0
隐性电平:记产生差分信号的两根线的电压差为隐性电平时,为逻辑1,
这里的逻辑0或1则是我们在通信时所说的高低电平,也就是我们传输的数据。由于各节点共用一条总线,对于同一时刻的发送的两个电平,假如一个显性电平一个隐性电平,因为显性电平为逻辑0,由于线与的缘故总线总是处于显性电平的状态,这就是显性电平的由来。同理,参考下iic协议,对于各个节点都有自己的ID地址,通信时主机先选择从机的ID地址然后再进行数据通信,CAN通信过程中的ID则是包含在报文中的,对于同一时刻发送的报文通过比较报文的ID来进行优先级的仲裁,那么怎么进行仲裁呢,答案是根据ID中谁先出现显性电平为止,即谁先把总线拉低。

协议层: 波特率与位同步:波特率自然不用多说,对于异步通信是必须设置的。位同步则是CAN协议的特点之一,CAN使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。对于位同步时序需要了解的内容有,CAN通信中将一个位的传输时间进行了进一步的划分,主要包括四个部分:SS段、PTS段、PBS1段、PBS2段,分解后最小的时间单位是Tq,而一个完整的位由8~25个Tq 组成。这四个段各表示什么呢,SS段称为同步段,是一个位最开始的部分,当检测到总线上信号的跳变沿处于该段,则可表示节点与总线的时序是同步的。PTS段译为传播时间段,这个时间段是用于补偿网络的物理延时时间。PBS1段和PBS2段,译为相位缓冲段,主要用来补偿边沿阶段的误差。怎么补偿这里举个例子,对于SS段之前说过是用来检测总线上的信号跳变是否处于该段,若不处于该段则不同步,那么不同步怎么办呢,就通过PBS1或者PBS2段来进行补偿了,PBS1和PBS2段的区别就是一个可以增加时间,一个可以减少时间。若SS段滞后了 2个Tq, 那么就通过PBS2段来减少2个tq使得下次的数据获得同步。这种方式也叫作重新同步。一般CAN内部的寄存器会通过设置SJW的值来控制PBS1或者PBS2段增加或减少的最大Tq值。在约定好一个Tq的时间长度以及一个位需要多少个Tq后则可以确定总线的波特率了,然后再根据外设时钟来设置预分频系数。
报文结构及种类:起初对CAN通信的报文感到十分复杂,不明其原理,为什么要这样设计。看到火哥书里的一段话后恍然大悟:
在SPI 通讯中,片选、时钟信号、数据输入及数据输出这4 个信号都有单独的信号线,I2C 协议包含有时钟信号及数据信号2 条信号线,异步串口包含接收与发送2 条信号线,这些协议包含的信号都比CAN协议要丰富 ,它们能轻易进行数据同步或区分数据传输方向。而CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了CAN必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢? CAN协议给出的解决方案是对数据、操作命令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。确实,你虽然有两根线,但是只能发出一个信号,你怎么用这一个信号来表示你什么时候开始发数据,发送的是什么类型的数据,是数据啊还是命令啊还是报错啊。你发的数据是多长,你数据内容是什么,数据发的内容出没出现错误,数据什么时候发完了。这都是需要考虑的事情。
我们一个一个解决,从数据帧来解读报文的格式。目前学到的协议来看,不论是uart还是iic他们总线的空闲状态总是处于高电平,CAN通信也是如此,那么起始信号也就很好想了,即一个显性电平来吧总线拉低,表示开始发送数据,起始信号后紧跟着的是仲裁段,它的作用是什么呢,想象一下如果有两个节点同时发送数据,谁的数据优先级更高,这就需要进行仲裁了,仲裁后的优先级较高的节点数据可以发出,较低的节点则进入接收状态。仲裁的原理刚刚介绍过,是利用线与的特性,谁先出现显性电平把总线拉低谁的优先级就更高。一般用来仲裁的ID有两种格式,一个为标准格式ID,共11位,一种为扩展格式ID,共29位。而ID只是仲裁段的一部分,仲裁段还包括什么呢,想一想就知道了,既然分标准格式和扩展格式,那么就需要一个来表示是标准格式还是扩展格式的位称他为IDE位,此外还有RTR位,是用来区分这段报文是什么类型的,是数据帧啊还是遥控帧(请求发送数据的帧)。另外的SRR位只存在于扩展格式里,是用于代替标准格式中的RTR位。紧接着仲裁段的就是控制段了,最主要的位是DLC,用来表示这段报文里实际上要发送数据的长度,另外还有两个位r0,r1预留扩展的。紧接着控制段的是数据段用来存放数据,然后是CRC校验码,ACK段类似于IIC,再就是帧结束信号了,用7个隐性电平来表示发送结束。
对CAN通信的协议层和物理层有了了解之后,再就是硬件相关的一些东西了。以stm32f4系列的bxCAN为例:具有三个发送邮箱,两个三级深度的接收FIFO,还具有滤波器来筛选接收的报文ID,可配置自动重发等。STM32的有两组CAN控制器,其中CAN1是主设备,bxCAN的存储访问控制器”是由CAN1 控制的,CAN2无法直接访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。对于具体的功能在实际应用过程中只需要大致了解下即可。对于bxCAN主要有四种工作模式,分别为:正常模式,回环模式,静默模式,静默回环模式。四种工作模式的区分看图即可分辨。下面对CAN的HAL库做下简单介绍:
HAL库提供的接口函数有
HAL_CAN_Init()用来初始化CAN的参数,
HAL_CAN_Start()开启CAN
HAL_CAN_ActivateNotification()用于CAN的FIFO消息挂起中断允许

HAL_CAN_ConfigFilter(): CAN滤波功能的相关配置
HAL_CAN_AddTxMessage(): 发消息 相当于原来的HAL_CAN_Transmit
HAL_CAN_GetRxMessage(): 收消息 相当于原来的HAL_CAN_Receive

<think>好的,我现在要处理用户关于CAN总线通信协议的提问。首先,我需要理解用户的需求:他们想要一个概述和关键知识点。根据用户提供的引用资料,我需要整合这些信息,并确保符合系统级指令,比如正确使用LaTeX格式和生成相关问题。 首先,用户引用了四篇资料,其中提到了CAN总线的物理层、数据链路层、数据帧结构、网络拓扑和应用层协议。我需要把这些内容组织成结构化的回答,确保每个部分都有对应的引用标识。例如,物理层和数据链路层的功能在引用[1]和[3]中都有提到,需要正确标注。 接下来,注意使用中文回答,并且数学表达式需要用$...$或$$...$$格式。例如,在解释位填充时,可能需要提到位速率,但用户提供的引用中没有具体的数学公式,所以可能不需要使用LaTeX数学表达式。不过,如果有提到任何技术参数,比如采样点或位时间,可能需要检查是否需要公式,但根据现有资料,似乎不需要。 然后,生成相关问题。根据用户提供的示例,问题应围绕CAN总线的关键知识点展开,比如帧类型、错误处理、应用场景等。要确保问题有针对性,并且基于提供的引用内容,比如引用[4]提到网络拓扑,可以生成相关问题。 同时,需要检查回答的结构是否清晰,分点列出关键知识点,每个知识点下再分小点,比如协议分层、数据帧结构等。代码块部分在用户示例中使用了Python,但CAN总线可能涉及其他类型的代码或结构,比如数据帧格式。不过用户提供的引用中没有代码示例,所以可能不需要代码块,但需要确认。 最后,确保所有引用正确标注,例如在提到物理层和数据链路层时引用[1]和[3],在数据帧结构时引用[2],网络拓扑引用[4]。需要避免遗漏引用,同时自然地将标识放在句末。 现在,我需要将以上思考整理成一个符合要求的回答,结构清晰,分点说明,并附上相关问题。同时,确保不添加任何用户不可见的内容,仅输出最终答案。</think>### CAN总线通信协议概述及关键知识点 #### 1. **协议分层与功能** - **物理层**:定义电气特性(如电压、传输速率)和总线拓扑结构(如线性总线或星型结构)。CAN网络通常由多个节点通过双绞线连接[^4]。 - **数据链路层**:负责数据帧的封装、错误检测、仲裁机制和位填充。通信接口通过**循环冗余校验(CRC)**、**优先级判别**等保证数据传输可靠性[^1][^3]。 - **应用层**:不同协议(如CANopen、J1939)定义具体消息格式与交互逻辑,例如诊断仪与ECU的通信规则。 #### 2. **数据帧结构** CAN数据帧包含以下关键字段: - **仲裁域**:包含标识符(ID),用于优先级仲裁。 - **控制域**:定义数据长度。 - **数据域**:传输实际数据(0-8字节)。 - **CRC域**:校验数据完整性。 - **ACK域**:接收节点确认帧接收成功[^2]。 #### 3. **关键机制** - **非破坏性仲裁**:通过ID优先级解决总线冲突,高优先级帧继续传输。 - **位填充**:每5个连续相同位后插入一个反向位,确保时钟同步。 - **错误检测**:包括CRC校验、帧格式校验和应答错误检测。 #### 4. **网络拓扑与性能** - **拓扑结构**:典型为线性总线,节点通过短支线连接主干,支持多主通信[^4]。 - **实时性**:短帧设计(最长8字节数据)和仲裁机制保障低延迟,适用于车辆控制等实时场景。 #### 5. **应用场景** - **汽车电子**:发动机控制、车身电子系统。 - **工业自动化**:PLC通信、传感器网络。 - **医疗设备**:设备状态监控[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值