CAN学习之路【day1】

本文介绍了CAN总线的基础知识,包括CAN2.0A和CAN2.0B的区别,标准格式和拓展格式数据帧的结构。详细阐述了CAN如何通过滤波器实现点对点和点对多点通信,以及数据帧的ACK段在多点接收中的应答机制。同时,讨论了在点对点通信中发送广播信息的方法。总结了CAN通信中可能遇到的挑战,如滤波器设置和数据量处理。
摘要由CSDN通过智能技术生成

CAN学习day1


前言

供大方向软件工程转偏嵌入式开发者学习,本人为初学者

一、CAN2.0A和CAN2.0B的区别?

CAN2.0A是CAN协议的PART A部分,此部分定义了11bit的标识区。
CAN2.0B是CAN协议的拓展部分,也叫PART B部分,定义了29bit的标识区,其他部分与CAN2.0一样。
CANOpen是基于CAN协议的应用层协议,可以理解为用户层,即规定了用户、软件、网络终端等之间用来进行信息交换的约定。而CAN定义了物理层和数据链路层,而CANOpen与DeviceNet一样,只定义了OSI模型的第七层应用层。

二、CAN的标准格式和拓展格式数据帧?

在这里插入图片描述

CAN总线的标识符组成如下所示:
在这里插入图片描述

标识符组成方式其中:
PRIORITY:表示此报文的优先级;
R:表示保留位;
DP:表示此报文的数据页位;
PDU FORMAT(PF):表示此报文的数据格式;
PDU SPECIFIC(PS):表示此报文的目标地址或者组扩展;
SOURCE ADDRESS(SA):表示发送此报文的源地址;

CAN数据帧由7个不同的位场组成:帧起始(SOF),仲裁场,控制场,数据场,CRC场,应答场(ACK段),帧结束。数据帧和远程帧的区别主要是:数据帧有数据场、远程帧没有数据场,两类帧通过RTR位来识别。这两类帧都包含标识符ID、标识符ID用来描述数据的含义,不用于通讯寻址,CAN总线的帧是没有寻址功能的,标识符还用于决定报文的优先权,ID越低优先权越高,在竞争总线时,优先权越高的报文优先发送,优先权低的报文退出总线竞争。CAN总线竞争的算法效率很高,是一种非破坏性竞争。

(一)数据帧:
1.1帧结构如下:
在这里插入图片描述

1.2帧起始
表示数据帧开始的段,为1个bit的显性点平。

1.3仲裁段
表示帧优先级的段,区分标准格式与拓展格式。
在这里插入图片描述

ID(11bit):标准(基本)ID,从ID28~ID18依次发送,禁止高7位全部为隐性。
SRR:代替远程请求位,在拓展格式中占位,必须为隐性位。
IDE:扩展标志符位,0表示标准格式,1表示扩展格式。
ID(18bit):扩展ID,从ID17~ID0依次发送。
RTR:标志是数据帧还是远程帧(0表示数据帧,1表示远程帧)。由于数据帧RTR为显性,因此同样ID情况下,数据帧优先级高于远程帧。当表示远程帧时,数据段为空。

1.4控制段
表示数据的字节数及保留位的段,区分标准格式与扩展格式。
在这里插入图片描述

IDE:扩展标志符位,0表示标准格式,1表示扩展格式。标准格式IDE出现在控制段,扩展格式IDE出现在仲裁段。
r0,r1:占位,必须为显性。
DLC:表示数据长度,有效值为0-8,但接收方收到9~15时,不认为是错误。

1.5数据段
数据的内容,包含0~8个字节的数据,最高位先输出。对于远程帧,数据段为空。

1.6CRC段
CRC校验,由15位CRC值和1位界定符组成。CRC计算范围包括帧起始、仲裁段、控制段和数据段。接收方以同样的方式计算CRC值并进行比较,若不一致则报错。界定符必须为隐性。
在这里插入图片描述

1.7ACK段
用于确认是否接收正常,由ACK槽和界定符组成。界定符必须为隐性。
在这里插入图片描述

ACK槽:发送单元发送该位为隐性位。接收到正确消息的单元,在ACK槽时间内,发送显性位,通知发送单元正常接收结束。发送单元检查总线,若没有单元应答,则重发送消息。
由于总线中有任何一个接收单元成功接收,总线都表现为显性位,因此,无法判断多个接收单元中,是否存在未正常接收的单元。

1.8帧结束
表示数据帧结束的段,为7个bit隐性电平。
(二)远程帧
远程帧与数据帧比较,除数据段为空外,其余基本结构一致。
(三)位填充补充
位填充机制作用在CRC界定符、ACK段和帧结束以外的其他区域。

三、CAN是如何实现点对点的数据收发的?

由于帧没有包含寻址信息、从帧的内容看它不直接包含对点对点或一点对多点通信的支持,但通过使用滤波器和合理组织帧标识符,使CAN网络也能够实现点对点、一点对多点和广播通信功能。
为了实现点对点通信,必须有一个表示通信双方身份的信息,该身份信息称为节点ID。为了使滤波器发挥作用,节点ID必须包含在帧标识符中,因为滤波器只对标识符进行滤波。另外每一帧都应该包含通信双方的节点ID。下面将标识符的29位进行分配,以使其有效支持点对点通信,这29位标识表如下:
在这里插入图片描述

节点ID用8位表示,因为帧标识符的最高7位不能全为1,所以,节点ID表示的范围从0到253。
“目的节点ID”表示本帧的接收者,它可以是一个具体的节点ID,也可以是广播ID。对于广播节点ID原则上可以使用任何一个有效的ID值,但如果广播信息要求实效较高,宜采用较低值ID作广播ID,以提高总线优先权。
“源节点ID”表示本帧的发送者。
“确认位”接收者向发送者发送确认信息。
“结束位”表示本帧是否本次发送信息的最后一帧。
“请求/应答位”表示本帧是请求帧还是应答帧。
“序号”表示本帧在本次发送中的顺序。
“端口号”用于识别通信队列,它与数据缓冲区对应。
为了使节点同时支持点对点通信和广播通信,将滤波器设置成双滤波器,其中一个滤波器支持点对点通信,使节点接收“目的节点ID”指向本节点的帧,另一个滤波器支持广播帧,即接收广播帧。

描述两节点的一次点对点通信过程。通信开始时,通信发起方建立用于本次通信的缓冲区,并申请一个空闲的端口号,向通信的另一方发送请求连接信息,另一方收到请求信息后建立通信缓冲区和端口号,并发确认信息给请求方,通信建立完成,接下来通信双方互发数据,任务完成时,通信一方发结束信息给对方,双方释放通信缓冲区和端口号,至此一次点对点的通信完成。

CAN总线滤波器
CAN总线控制器可以通过设置CAN控制器的滤波器来过滤接收到的帧,滤波器由四个验收码寄存器和4个验收屏蔽寄存器组成。滤波器有两种设置方式:一种是配置成单滤波器,一种是配置成双滤波器。单滤波器是一个长的滤波器,双滤波器是两个短滤波器,它实际上是将滤波器分成两组来使用。

四、CAN是如何实现点对多的数据收发的?

点对点通信是任意两台设备直接都可以通信,实现数据交换,广播方式就是一台设备发送数据,所有设备都可以接收到。由于ID不同,点对点实际上是其他ID设备过滤掉了数据,所以不是该ID的设备是接收不到数据的。广播通信如上述所示。

五、CAN的数据帧有ACK段,多点接收的应答机制如何实现?节点A收到第一个节点发送ACK段后,此数据帧就可以结束了吗?如何保证每个节点收到完整数据帧,各节点不会在总线上产生错误?

ACK SLOT只有一个BIT,而接下去的ACK delimiter始终为隐性(我们可认为是1),当数据到达ACK SLOT的时候,所有的节点都会发送显性位(我们可以认为是0),而发送者在ACK这个时间里保持隐性位(即发送者在发送的时候ACK SLOT 为1),这时发送者会检测总线上的ACK时间内的信号,如果是0,则表示正确,如果是1,表示有错误。如果当中有某一个节点在ACK SLOT填入隐性位,则总线上同样还是显性位电平,故只要总线上有一个节点正确接收到数据,则ACK SLOT就会被填入显性电平;那么,接收错误的节点如何来告知发送者此次发送不成功呢?这时候就要用到CAN的错误帧,当一个接收者收到错误的数据的时候,它立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。

六、在点对点通信的同时还想发送广播信息该怎么办?

CAN通信对ID的过滤主要是设置过滤器,STM32的CAN过滤器有两种方式,一种是屏蔽位模式,一种是标识符列表模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。广播通信采用屏蔽位模式,每一个设备使用屏蔽位其中的一位作为当前ID,并且只对其中一位进行必须匹配,其他为不用关心,这样就可以实现点对点通信和广播通信。当需要点对点通信时直接发送设备ID即可,当需要广播通信时,其中一台设备要向其余几台设备同时发送,那么将其余几台的ID相或以后作为目标ID,直接发送即可。


总结

对CAN有了初步了解,点对点和群发的用法,答案理论上可行,实际操作的时候不好实现,不太方便使用,特别是群发使用过滤器的时候,使用过滤器的话,一台车的一路CAN上多的可能几十个CAN节点,甚至上百,所以如何使用滤波器就是一个很大的问题,滤波器过滤的太严了,可能有些需要收到的数据收不到。过滤器设置的太宽松,那就失去了过滤的意义,一般的CAN处理器都不会有太多的过滤器。

譬如一个BMS,数据帧所有的加起来可能超过100帧,数据量越多,数据帧肯定就越多,以一个200串的BMS为例,光每一串的电压就有200个,一个电压至少2个字节,光单体电压这就有400个字节的数据。

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测机电子枸吴咬风

感谢投喂~喵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值