CAN学习笔记

CAN学习笔记

参考链接:

https://blog.csdn.net/huan447882949/article/details/80042417

https://blog.csdn.net/Alan0521/article/details/7607164?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-14.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-14.control

https://blog.csdn.net/zxng_work/article/details/102635425

通讯时使用下面5个类型的帧
1、数据帧:数据帧将数据从发送器传输到接收器
2、遥控帧:总线节点发出远程帧,请求发送具有同一识别符的数据帧。
3、错误帧:任何节点检测到总线错误就发出错误帧。
4、过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。
5、帧间空隙:ITM帧间隔

数据帧:

结构上由7个段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。

image-20210725121425931

image-20210725132152349

0表示显性,1表示隐性。

​ 分为标准帧和扩展帧两种格式,分别用一个itm帧间隔来分割。

  1. 帧起始sof占1位,发出一个显性位边沿,网络节点以此开始同步。
  2. 帧id:拓展帧有29位,标准帧站11位。 定义消息的优先级/总线的竞争力,数字越低优先级越高。
  3. RTR: 1bit, 显性表示数据帧。
  4. r:1bit 保留
  5. dlc:4bit,表示数据场的字节长度0-8个字节
  6. crc场:16位,15位用来校验,含1bit隐性位的界定符。从起始位sof到数据场的所有数据进行encode,由发送方来填写。
  7. ack场:2bit,包含1bit的隐性位界定符,有接受方进行确认,收到消息给出一个显性位,没有一个节点都确认收到消息,发送方监听此位为隐性位就会报错。
  8. IDE: 1bit,扩展帧标识符,扩展帧的id可以有29位。扩展帧和标准帧格式不同,不能存在同一个can网络下。
  9. EOF:7bit, 7个 隐性位代表帧结束了。
  10. ITM:3bit,帧间隔,实际上不属于帧内的区域,先列出来,必须等待帧间隔才能发送消息。
  11. r0 r1:同上保留位

img

image-20210725204846630

img

远程帧:

远程帧和数据帧非常相似,不同之处在于:
(1)RTR位,数据帧为0,远程帧为1;
(2)远程帧由6个场组成:帧起始,仲裁场,控制场,CRC场,应答场,帧结束,比数据帧少了数据场。
(3)远程帧发送特定的CAN ID,然后对应的ID的CAN节点收到远程帧之后,自动返回一个数据帧。

如果A需要B节点向你发送数据!A可以用B节点的ID,发送一个Remote frame(远程帧),B收到A ID 的 Remote Frame 之后就发送数据给A!发送的数据就是数据帧!远程帧就像命令,命令相应的节点返回一个数据包.主要用来请求某个指定节点发送数据,而且避免总线冲突。

下面是网上看到的案例:

某一时刻,A需要请求B发送温度信息帧。那么A可有2种方法发送请求:
1)A发送一帧数据,ID号为B的ID号(B_ID),数据域内容为【请求温度信息】。B的过滤器设置为接收B_ID帧。则A发送后被B接收到,B再以B_ID发送温度信息帧。被A接收到。这看似完美的过程,其实存在可能的总线冲突:如果A发送帧的同时,B也正要往总线上发送温度帧,则造成总线冲突。**( 由于CAN总线发送帧时,仲裁方法只依靠帧ID号,当有两个相同ID号的帧同时竞争总线时,总线就无法判别出让哪个设备先发送帧,于是就造成总线冲突。)**当然也可以采用别的方法来解决此问题,如A发送请求温度帧的ID号改成别的,当然B的过滤器也要做相应的设置。

2)使用远程帧来做信息请求:由于A直接发送B_ID号的数据帧,可能造成总线冲突,但若是A发送远程帧:远程帧的ID号自然是B发送帧使用的ID号(B_ID )。**由于CAN总线仲裁时,数据帧发送的优先级高于远程帧,即使有别的节点设备也在发送以B_ID为ID号的远程帧,因为远程帧除了ID号不同,其他都相同。所以不会造成总线冲突。**当B(前提是以对过滤器设置接受B_ID类型的帧)接受到远程帧后,在软件(注意,是在软件的控制下,而不是硬件自动回应远程帧)控制下,往CAN总线上发送一温度信息帧,即使用B_ID作帧ID号往CAN总线上发送温度信息帧。该帧被A接受到(当然A的过滤器已在发送远程帧之前做了相应设置)。由此可见,远程帧可以使请求更简单,但也非不可代替。

错误帧:

这个帧用来通知在传输期间发生了一个错误,错误帧由一个错误标志和一个错误定界符组成,错误帧由CAN的硬件来发送。图24显示了错误帧的结构。

(1) 错误标志:有2种错误标志类型:主动错误和被动错误标志

a)主动错误标志:6个显性位

b) 被动错误标志:6个隐性位

(2) 错误定界符:由8个隐性位组成。

image-20210725180602198

注1:错误标志重叠:取决于连接到总线上的各单元检测出错误的时间,错误标志可能一个重叠在另一个上,总共可达12bit长度。

注2:主动错误标志:处于主动错误状态的单元检测出错误时输出的错误标志。

注3:被动错误标志:处于被动错误状态的单元检测出错误时输出的错误标志。

主动错误

当错误主动节点检测到一个总线错误时,这个节点将产生一个主动错误标志来中断当前的报文发送。主动错误标志由6 个连续的显性位构成。这种位序列主动打破了位填充规则。所有其他节点在识别到所生成的位填充错误后,会自行产生错误帧,称为错误反射标志。错误标志字段因此包含6 到12 个连续显性位(由1 个或多个节点产生)。错误定界字段(8 个隐性位)为错误帧划上句号。在错误帧发送完毕后,总线主动恢复正常状态,被中断的节点会尝试重新发送被中止的报文。

被动错误

当错误被动节点检测到一个总线错误时,该节点将发送一个被动错误标志,并紧接着发送错误定界字段。错误被动标志由6 个连续的隐性位构成,而错误被动节点发出的错误帧包含14 个隐性位。由此可知,除非总线错误被错误主动节点或正在发送报文的节点检测到,否则由于错误被动标志不会影响总线运行,将继续发送报文。如果发送节点产生一个错误被动标志,那么,由于位填充规则被打破,将导致其他节点产生错误帧。错误帧发送完毕后,错误被动节点必须等待总线上出现6 个连续隐性位后,才能尝试重新参与总线通讯。错误定界符由8 个隐性位组成,允许总线节点在错误发生后重新启动总线通讯。

过载帧:

img
接收端由于接收能力有限,或自身已经达到极限时,向总线报告的帧,以延迟下一帧数据帧或远程帧的发送,表示设备忙碌。
出现接收端发送过载帧有以下情况

1.接收端自身原因,没有准备好接收下一帧,接收端在接收每一帧之间有个延时;
监听到帧间隔间有显性电平0;(意味着有下一帧报文,但此时监听的是帧间隔时期,不应该有报文发送,因此发送过载帧,阻断这帧报文);
2.监听到错误分隔符或过载分隔符的低8位有显性电平;(CAN帧规则,必须至少是连续的8个隐性电平,但在错误处理中不会增加错误计数)
3.强制不遵守位填充特性,表达出明显的过载标识。

如在处理广播帧时,当其中一个接收端自身能力达到极限,会发送过载帧,连续6个显性电平会强制打断总线上的帧传输,让发送端从新发送该帧,以达到延迟的目的。

发送过载帧时不用插入帧间隔。

帧间隔:

img

总结can的链路层流程:

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

炒饭多加个蛋

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值