物联网嵌入式工程师40周\[包含电子书]|之can总线通信之理论篇

215 阅读14分钟

物联网嵌入式工程师40周[包含电子书]|之can总线通信之理论篇

附上资源MP4下载地址

我用夸克网盘分享了「2025年物联网嵌入式工程师40周[包含电子书]-完结」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:pan.quark.cn/s/3b0a95006…

失效访问:cowcowit.com/course/4/4

一、CAN总线由来

上世纪八十年代以来,汽车ECU(Electronic Control Unit:电子控制单元)越来越多,如ABS,电控门窗,电子燃油喷射装置。如果仍然采用常规的点对点布线方式,即电线一段与开关相接,另一端与用电设备相通,将会导致车上电线数目的急剧增加,从而带来线束的冗余及维修成本的提高。这就对汽车的线束分布及信息通讯提出了更高的要求。总线技术可以实现信息的实时共享,解决了传统布线方式中线束多,布线难,成本高等问题,CAN(Controller Area Network)总线技术应运而生。

为什么选择用CAN总线?\

总线有很多种,较常用的有CAN总线、232/485总线、以太网总线等等,但是应用在对通讯速度要求很高的汽车领域,232/485总线就显得不足,CAN总线和以太网可以胜任,但是对于实时性来说,CAN总线可以说是首当其冲,对于汽车中的数据通信,要求发送周期都小于10ms,而且每辆车都有好几条这样的数据,并且在安全性方面,CAN总线还有一系列的安全保护措施\,所以综合之后,汽车选用了CAN总线。

二、CAN总线介绍

CAN是控制器局域网络(Controller Area Network, CAN)的简称\,是由以研发和生产汽车电子产品著称的德国BOSCH\公司开发的\,并最终成为国际标准(ISO 11898\),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议\。

CAN总线是一种多主控(Multi-Master)的总线系统。传统总线系统如USB或以太网等是在总线控制器的协调下,实现从A节点到B节点大量数据的传输。CAN网络的消息是广播式的,即在同一时刻网络上所有节点侦测的数据是一致的,它是一种基于消息广播模式的串行通信总线。\

CAN通信属于半双工通信\,收发数据要分时进行。不管CAN网络上挂多少设备,在同一时刻只能有1个发送数据。如果有多个需要同时发送则只有优先级别高的先发送,其它的设备处于等待模式。\

CAN 总线是一种广播类型的总线,这意味着所有节点都可以“听到”所有传输,无法仅向特定节点发送消息\;这会导致所有节点都会不可避免地接收所有流量,但是CAN 硬件提供本地过滤\,因此每个节点只能对自己感兴趣的消息做出反应\

1.CAN总线标准

CAN总线\标准规定了物理层和数据链路层\,至于应用层需要用户自定义\。不同的CAN标准仅物理层不同\。

l 物理层和数据链路层\ : ISO11898\

l 应用层: 不同的应用领域使用不同的应用层标准\

2.CAN物理层介绍

在 CAN总 线上,利用CAN_H\和CAN_L两根线上的电位差\来表示 CAN 信号\。CAN 总线上的电位差分为显性电平(Dominant Voltage)\和隐性电平(Recessive Voltage)\。其中显性电平为逻辑 0\,隐性电平为逻辑 1\。

ISO 国际标准 ISO 11898-2 和 ISO 11898-3 分别规定了两种 CAN 总线结构(在 BOSCH CAN2.0 规范中,并没有关于总线拓扑结构的说明),闭环总线网络\和开环总线网络\。

(1)闭环总线网络

ISO 11898-2 定义了通信速率为 125 kbps~1 Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。总线的两端各要求有一个“120欧”的电阻。

(2)开环总线网络

ISO 11898-3 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为 40kbps 时,总线长度可达1000米。两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻

(3)高速CAN与低速CAN对比

(4)线与机制

模块以线与的方式连接到总线\:如果只有一个节点将总线驱动到逻辑0\,则整个总线处于该状态,而不管发送逻辑1的节点数量。\

(5)CAN通信物理结构

三、CAN通信协议

1.CAN通信帧类型

CAN通信过程中,总共会有5种通信帧,如下:

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

2.一帧数据格式

Remote Frame实际上它的意义是“遥控帧”,发起方发起特定ID的远程帧,并且只发送ID部分,那么与其ID相符的终端设备就有义务在后半段的数据部分接管总线控制权并发送自己的数据。\打个比方,中控机需要定时获取某个节点的数据(例如转速计的实时转速、油量计的实时油量等),可以向总线发送远程帧;相应节点在接收判断帧ID与自己相符、并且是远程帧的情况下,就可以将自己的实时数据发送到总线上;这样中控机就获取到了相关节点的实时数据。

3.非破坏性仲裁机制

每一个CAN节点都会在“帧开始”进行同步,同步之后开始仲裁,看看能否获得CAN总线的使用权。\

4.位填充机制

CAN协议中规定,当相同极性的电平持续五位\时,则添加一个极性相反的位\。

对于发送节点而言:

在发送数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符) 之间的位流,相同极性的电平如果持续5位,那么在下一个位插入一个与之前5位反型的电平;\

对于接收节点而言:

在接收数据帧和遥控帧时,对于SOF~CRC(除去CRC界定符)之间的位流\,相同极性的电平如果持续5位,那么需要删除下一位再接收。\

5.CAN总线错误帧

(1)错误帧分类

CAN总线的错误帧可分为位发送错误、位填充错误、CRC错误、格式错误、应答错误\五大类。

(2)错误帧格式

当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下所示

(3)错误状态的转换

根据CAN协议的规定,在CAN节点内,有两个计数器:发送错误计数器(TEC)和接收错误计数器(REC)\

主动错误状态

最开始TCE和REC都小于127时,就处于主动错误状态。在这一状态下,节点检测到一个错误就会发送带有主动错误标志的错误帧,因为主动错误标志是连续六个显性位,所以这个时候主动错误标志将会“覆盖”掉总线上其它节点的发送,而之前在CAN总线上传输的报文就被这“六个连续显性位”破坏掉了。\

如果发出主动错误帧的节点是发送节点\,这个情况下就相当于:刚刚发送的那一帧报文我发错了,现在我破坏掉它(发送主动错误帧),你们不管收到什么都不算数;

如果发出主动错误帧的节点是接收节点\,这个情况就相当于:刚刚我收报文的时候发现了错误,不管你们有没有发现这个错误,我现在主动站出来告诉大家这个错误,并把这一帧报文破坏掉(发送主动错误帧),刚才你们收到的东西不管对错都不算数了。

Tips: 处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它自己遇到,正是因为这一点,整个总线才相信它报告的错误,允许它破坏掉发送中的报文,也就是将这一次的发送作废。

被动错误状态

如果某个节点发送错误帧的次数较多,必将使得TCE>127 或者 REC>127,那么该节点就处于被动错误状态。\在这一状态下,节点Node_A检测到一个错误就会发送带有被动错误标志的错误帧,\因为被动错误标志是连续六个隐性位\,所以这个时候总线上正在传输的报文位流不会受到该被动错误帧的影响,其它的节点该发送的发送,该接收的接收,没人搭理这个发送被动错误帧的节点Node_A。

如果发出被动错误帧的节点Node_A为报文的发送节点,那么在发送被动错误帧之后,刚刚正在发送的报文被破坏,并且Node_A不能在错误帧之后随着连续发送刚刚发送失败的那个报文。随之而来的是帧间隔,并且连带着8位隐性位的 “延迟传送” 段;这样总线电平就呈现出连续11位隐性位,总线上的其它节点就能判定总线处于空闲状态,就能参与总线竞争 。此时如果Node_A能够竞争成功,那么它就能接着发送,如果竞争不能成功,那么就接着等待下一次竞争。这种机制的目的正是为了让其它正常节点(处于主动错误)优先使用总线。

Tips:处于被动错误状态,说明这个节点目前是不太可靠的\,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能仅仅只有它自己遇到,正是因为这一点,整个总线才不信任它报告的错误,从而只允许它发送六个连续的隐性位,这样它才不会拖累别人。\

总线关闭状态

如果一个处于被动错误状态的节点,仍然多次发送被动错误帧,那么势必导致TEC > 255\,这样就处于总线关闭状态。在总线关闭状态下的节点Node_A不能向总线上发送报文,也不能从总线上接收报文,整个节点脱离总线。等到检测到128次11个连续的隐性位时,TEC和REC置0,重新回到主动错误状态。

当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点。可以理解成,接收节点A接收报文的能力达到极限了,于是该节点就发出过载帧告诉总线的其他节点,接收节点A已经没有能力处理你们发来的报文了。

过载帧由过载标志和过载帧界定符组成。

帧间隔是用来隔离数据帧(或者遥控帧)的,也就是说,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。

Tips:过载帧和错误帧的前面不能插入帧间隔

间隔段\:连续三个隐性位\;间隔段期间,所有节点不允许发送数据这或遥控帧,只要在这期间监听到显性位,接收节点就会发送过载帧。空闲段\:连续隐性位,个数不一定\,0个或者多个都可以。总线空闲的时间是任意长的,只要总线空闲,节点就可以竞争总线。暂停段\:只有处于被动错误状态的节点在发送帧间隔的时候\,才会在帧间隔中插入8个连续隐性位的暂停段,延迟传送。

8.推荐学习视频

维克多汽车技术:

广州虹科电子:

四、CAN采样点与波特率

CAN网络采用异步通信的方式,因此需要根据波特率进行采样\,采样原理如下图所示。红色箭头则表示采样点的位置,图示采样得到数据则为“1010 1010”。

说到采样点,就需要引入位时间\的概念。位时间是指每传输一位数据需要的时间\,即位时间=1/波特率\。一个位时间可以分为同步段、传播段、相位缓冲段1和相位缓冲段2\,某个位时间每个段的时间份额如下图所示。

CAN通信中常见的采样点以及相关的参数如下表所示。不同的波特率时间对应的采样点以及位时间的份额可能不同。以波特率为500k为例,一个位时间被分成了16个时间份额,采用点在第14个时间份额。\

2.参数含义

SS (synchronization segment)

多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送的工作\。由隐形电平到显性电平的边沿或由显性电平到隐性电平边沿最好出现在此段中。

PTS(Propagation Time Segment)

用于吸收网络上的物理延迟的段\。所谓的网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟\。这个段的时间为以上各延迟时间和的两倍

PBS1/2(Phase Buffer Segment 1/2)

当信号边沿不能被包含于SS段中时,可在此段进行补偿。由于各单元以各自独立的时钟工作,细微的时钟误差会累积起来,PBS段可用于吸收此误差\。通过对相位缓冲段加减SJW吸收误差\。SJW加大后允许误差加大,但通信速度下降。

SJW (Resynchronization jump width)

因时钟频率偏差、传送延迟等,各单元有同步误差。SJW为补偿此误差的最大值。

3.一些概念

l 采样点 = (SS + TSEG1)/(SS + TSEG1+TSEG2)

l Can bit time = 1 / Can speed

l Can Tq = Fn(分频数)/Fcan Fcan 输入时钟 Tq: Time quantum

l CAN bit time = CAN Tq * TqCount ;CAN bit time 也简写为NBT (Nominal Bit Time )

l Tq Count = SS + TSEG1 + TSEG2

4.采样点、波特率计算

1 Fcan输入时钟为60Mhz,分频数为6,Can Tq = 6/60M = 0.1us

2 设置总线波特率为500kbit/s则:

3 CAN bit time = 1/500k = 2us ,

4 TqCount = CAN bit time/CAN Tq

5 = 2/0.1 = 20

6

7 那么SS + TSEG1 + TSEG2 = 20

8 SS固定占用一个Tq,分配TSEG1和TESG2,可以调整采样点位置

9 设置TESG1 = 14 ,则TESG2 = 5,(有些手册看到要求TSEG1 > TSEG2 > SJW)

10 则采用点位置 = (SS + TSEG1)/(SS + TSEG1+TSEG2) = (1+14)/ 20 = 75%

11

12 一般采样点位置要求在75-80% 但很难调整到中间值。

13