找回密码
 注册
关于网站域名变更的通知
查看: 1726|回复: 15
打印 上一主题 下一主题

CAN总线简明易懂教程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-13 10:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
先看看工作原理( H9 e% r2 x/ ?" |& R
当 CAN 总线上的一个节点(站)发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。6 Z4 r! j& a) I& G$ c) z4 g

9 n, N4 x5 W0 t- b) M
每组报文开头的11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文,当几个站同时竞争总线读取时,这种配置十分重要。
+ P5 p. g  r0 F4 ~1 Y2 `
大体的工作原理我们搞清了,但是根本的协议我们还要花一番功夫。下面介绍一个重要的名词,“显性”和“隐性”:

/ Y2 m) H" I. T% _% E+ r
在我看到的很多文章里,有很多显性和隐性的地方,为此我头痛不已,最终我把它们彻底弄明白了。

+ h& s8 Z: }5 ?) l; N: G+ V
首先 CAN 数据总线有两条导线,一条是黄色的,一条是绿色的------分别是CAN_High 线和CAN_Low 线,当静止状态时,这两条导线上的电平一样,这个电平称为静电平,大约为2.5 伏。
3 v. Z" o8 e0 ?; ]- E2 ?
这个静电平状态就是隐形状态,也称隐性电平,也就是没有任何干扰的时候的状态称为隐性状态。当有信号修改时,CAN_High 线上的电压值变高了,一般来说会升高至少1V;而CAN_Low 线上的电压值会降低一个同样值,也是1v。

5 Y/ v% M8 Z# \: ]# R, r% `, p
那么这时候,CAN_High 就是 2.5v+1v=3.5v,它就处于激活状态了。而CAN_Low 降为2.5v-1v=1.5v。可以看看这个图
由此我们得到

0 D. z/ J, }9 L/ B, O9 g
在隐性状态下,CAN_High 线与CAN_Low 没有电压差,这样我们看到没有任何变化也就检测不到信号。但是在显性状态时,改值最低为2V,我们就可以利用这种变化才传输数据了。所以出现了那些帧,那些帧中的场,那些场中的位,云云。
( O# X! Y3 R( c; J6 d
在总线上通常逻辑1 表示隐性。而0 表示显性。这些1 啊,0 啊,就可以利用起来为我们传数据了。利用这种电压差,我们可以接收信号。

, l3 h6 C, e' H* ~4 G( q. J- N
一般来说,控制单元通过收发器连接到 CAN 驱动总线上,这个收发器(顾名思义,可发送,可接收)内有一个接收器,该接收器是安装在接收一侧的差动信号放大器。然后,这个放大器很自然地就放大了CAN_High 和CAN_Low 线的电平差,然后传到接收区。如下图
由上图可知,当有电压差,差动信号放大器放大传输,将相应的数据位转化为0。
下面我们进入重点难点-----报文
2 E$ @( a( M# f# X: N
所谓报文,就是CAN 总线上要传输的数据报,为了安全,我们要给我们传输的数据报编码定一下协议,这样才能不容易出错,所以出现了很多的帧,以及仲裁啊,CRC 效验。这些都是难点。
2 ]: x4 f" W" y/ Q- k
识别符的概念
/ T8 U7 z3 h, _0 M" g7 N; @& x% }2 J
识别符顾名思义,就是为了区分不同报文的可以鉴别的好多字符位。有标准的,和扩展的。标准的是11 位,扩展的是29 位。他有一个功能就是可以提供优先级,也就是决定哪个报文优先被传输,报文标识符的值越小,报文具有越高的优先权。

" ~0 ]) |  ~4 _5 R
CAN 的报文格式有两种,不同之处其实就是识别符长度不同,具有11 位识别符的帧称为标准帧,而还有29 位识别符的帧为扩展帧,CAN 报文有以下4 个不同的帧类型。分别是:

! x0 X) F/ s# a( e& \1 d
(1) 数据帧:数据帧将数据从发送器传输到接收器;
(2) 远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧;
(3) 错误帧:任何节点检测到总线错误就发出错误帧;
(4) 过载帧:过载帧用已在先行的后续的数据帧(或远程帧)之间提供一附加的延时。
: k$ G0 Q3 g  Y2 S( L/ {
我们先研究数据帧吧。
( R! a0 h9 i! K* ?" e3 ^( M2 ^5 S- F
游客,如果您要查看本帖隐藏内容请回复

& G# p+ i& ]5 g% i$ A( N' Q
在获得总线控制权的节点发送数据过程中,其他节点成为报文的接收节点,并且不会在总线再次空闲之前发送报文,在这逐位的比较中,最终节点B 因为第七位的偏差丢掉了总线。从此单纯监听,江山就拱手让给了节点A 了。这就是仲裁机制。
$ x  y1 n5 k0 y* ]) W  {
上面我们说过,报文有两种格式,标准和扩展。这里,不同的格式仲裁场是不一样的。标准格式下,仲裁场由11 位识别符和RTR 位组成。
6 a( w8 m) p& Q0 B8 n
但在扩展格式里,包括29 位识别符、SRR 位、IDE 位、RTR 位。

& w  ^/ V. w& m' N2 e( K5 |% |
RTR 位,Remote Tranmission Request BIT 全称为远程发送请求位。它在数据帧里必须为显性0 ,但在远程帧里为隐性1。
' F: E$ |/ G' r
我晕,为什么这么搞呢,不急,先留着这个问题。
; A; o$ F* D# Z# t. N+ A
SRR 位,替代远程请求位,SRR 是一隐性位,也就是1,它在扩展格式的标准帧RTR 位位置,那么标准帧怪不得优先于扩展帧了,因为在传输完11 位标识符之后(扩展帧的后18 位在最后发送,先发送11 位标识符),轮到标准帧的RTR 位和扩展帧的SRR 位了。

1 {( F9 T1 S) `. v: p3 f# \
这时候,标准帧的RTR 为显性,而扩展帧SRR 为隐性,这样,总线自然就被标准帧占据。

/ O% D, Z  Z& I2 M2 t
同时上面那个问题,也一目了然了,CAN 总线协议设计者,肯定是设计了数据帧优先于远程帧。所以IDE(Identifier Extension Bit),全称识别符扩展位,它属于扩展格式的仲裁场。
! f1 K" b4 V& ~# j  a
对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。标准格式的IDE位为“显性”,而扩展格式的IDE位为“隐性”。
标准格式中的数据帧
拓展格式中的数据帧
" ^; f( S5 q! c" Z6 }( R2 p

5 O* C* Q% e) Y# v5 w/ D
控制场
+ g8 I; b7 ]0 F$ h6 u
控制场由6个位组成,标准格式和扩展格式的控制场格式不同。标准格式里的帧包括数据长度代码、IDE位(为显性位)及保留位r0。扩展格式里的帧包括数据长度代码和两个保留位:r1和r0。其保留位必须发送为显性,但是接收器认可“显性”和“隐性”位的任何组合。其结构如图所示:
控制场结构
数据长度代码(标准格式以及扩展格式)DLC,如下表所示
数据帧长度代码DLC
/ u, z: ~3 \, t- N" |
数据长度代码指示了数据场里的字节数量。其中:d—“显性”, r—“隐性”,数据帧允许的数据字节数为{0,1,...,7,8}。其他的数值不允许使用。

3 [6 K2 }- U6 n5 w+ I: z8 E  G
数据场

6 a/ n% ?1 ?8 l8 E1 J2 L  X3 E
数据场由数据帧里的发送数据组成。它可以为0~8个字节,每字节包含了8个位,首先发送最高有效位(MSB)。
) O7 g' l' V- i! K, Y. T$ y# a
循环冗余码CRC场是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

" g; w4 o- ]4 ]7 a6 r
CRC场包括CRC序列(CRC Sequence),其后是CRC界定符(CRC Delimiter),结构如图:
生成 CRC 码的基本原理:
2 W- k; O1 g+ N& t; L* h% j
任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111 对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1 对应的代码101111。
. a/ m( S% m2 s8 F
参考一下下面的例题,自已再领悟一下吧!已知信息位为1101,生成多项式G(x)= x3+x+1,求CRC 码。
: s. S$ i0 q* ?+ J
要传输的信息序列为1101,在末尾添加所给多项式的最高次阶个0,如本题为x^3,则添加3个0,变为:1101000;
! q2 X9 S2 t, L: ]- |* a% [2 i
由多项式G(X)=X3+X+1,得其阶数为1的二进制编码为:1011;1101000对1011进行模二除法,所得到的余数即为校验码,把校验码添加在原数据尾部即为所求的编码,则实际发送的数据序列为1101001。校验码计算过程如图所示:
模二除法
) l1 z: B( Z( c+ F+ G2 l% W
应答场(ACK Field)
$ f. p! y4 l  \- e
应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),如图所示。在ACK场(应答场)里,发送节点发送两个“隐性”位。

1 I1 h# d5 r  G
当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间向发送器发送一“显性”位以示应答。

; z' b$ V) m0 `  F) N$ ?" ~

  F1 t  N  U6 E* k. l9 ?( o
帧结尾
每一个数据帧和远程帧均由一标志序列界定。这个标志序列由7个“隐性”位组成。
二、远程帧
  ?, r' v% T7 B7 ]
通过发送远程帧,总线的节点发出远程帧,请求以前发送给它数据帧的节点再发送一遍。具体发送哪个数据帧,由远程帧的标识符决定。

% a! h4 I. T5 r7 P8 r2 \, F/ p6 |
与数据帧类似,远程帧也有标准格式和扩展格式,而且都由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。

) k( O( w+ S8 t; M9 ]" b
与数据帧相反,远程帧的RTR位是“隐性”的。它没有数据场,数据长度代码DLC的数值是不受制约的(可以标注为容许范围0~8里的任何数值),此数值是相应于数据帧的数据长度代码。远程帧结构如图所示:
远程帧结构
三、错误帧

8 ?7 G3 k% l  i  @& G: q
错误帧由两个不同的场组成,第一个场是不同节点提供的错误标志(Error Flag)的叠加,第二个场是错误界定符。

/ J6 R9 ]+ P9 w! ~2 O
为了能正确地终止错误帧,“错误认可”的节点要求总线至少有长度为3个位时间的总线空闲。因此,总线的载荷不应为100%。错误帧结构如图:
/ l# e# |. k* ?, w( \3 T

* b# g7 j3 A8 O! E/ ?+ s7 v0 P+ S" L
(1) 错误标志,有两种形式的错误标志:激活错误标志 和 认可错误标志
“激活错误”标志由6个连续的“显性”位组成;“认可错误”标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。

+ l: E( K/ B* z% c
(2) 错误界定符,错误界定符包括8个“隐性”的位。

' k% B) r3 p* l3 X
错误标志传送了以后,每一个节点就发送一个“隐性”的位,并一直监视总线直到检测出一个“隐性”的位为止,然后就开始发送其余7个“隐性”位。

8 w" ^2 h8 }7 E* Y4 c* U6 m/ v0 I
四、过载帧

( S* E2 m8 r7 s% w8 M9 @
过载帧(Overload Frame)包括两个位场:过载标志 和 过载界定符,其结构如图:
过载帧结构图
有三种过载的情况会引发过载标志的传送:接收器的内部情况,需要延迟下一个数据帧和远程帧。

7 d4 Y; c$ U& X" K& Z( E
在间歇(Intermission)的第1和第2字节检测到一个“显性”位。这里有个间歇的概念。我们可以讲讲。间歇属于帧间空间的一部分。它包含三个隐性位。间歇期间,所有的站不允许传送数据帧或远程帧。它唯一要做的就是标示一个过载条件。

# L2 i7 j/ j! [$ \
如果CAN节点在错误界定符或过载界定符的第8位(最后一位)采样到一个显性位,节点会发送一个过载帧。该帧不是错误帧,错误计数器不会增加。

; \% D0 C2 `  U# Z2 |
(1)过载标志(Overload Flag)
过载标志由6个“显性”的位组成。过载标志的所有形式和“激活错误”标志的一样。
* G1 |; s1 ~4 ~8 _
(2)过载界定符(Overload Delimiter)
过载界定符包括8个“隐性”的位。

3 K5 ~4 c2 Z% F2 Z# o! A
五、帧间空间
3 [- h0 z6 G! n; H5 `6 a
数据帧(或远程帧)与先行帧的隔离是通过帧间空间实现的,无论此先行帧类型如何(数据帧、远程帧、错误帧、过载帧)。

. J' G9 g( Z$ Y2 f
帧间空间包括间歇、总线空闲的位场。如果“错误认可”的节点已作为前一报文的发送器,则其帧间空间除了间歇、总线空闲外,还包括称作“挂起传送”(暂停发送)(Suspend Transmission)的位场。
/ _3 d3 o: x6 P" j* n& k, b; M
对于不是“错误认可”的节点,或作为前一报文的接收器的节点,其帧间空间如图:
非 “错误认可”帧间空间
对于作为前一报文发送器的“错误认可”的节点,其帧间空间如图:
“错误激活”帧间空间
(1)总线空闲(Bus Idle)
总线空闲的时间是任意的。只要总线被认定为空闲,任何等待发送报文的节点就会访问总线。在发送其他报文期间,有报文被挂起,对于这样的报文,其传送起始于间歇之后的第一个位。总线上检测到的“显性”的位可被解释为帧的起始。
" f6 B3 S( O7 M, U2 w9 T8 e: s
(2)挂起传送(Suspend Transmission)
“错误认可”的节点发送报文后,节点就在下一报文开始传送之前或总线空闲之前发出8个“隐性”的位跟随在间歇的后面。如果与此同时另一节点开始发送报文(由另一节点引起),则此节点就作为这个报文的接收器。
再来几张实物图:

' P  H* b0 G- a# z

" K; [% r1 u% t0 S' S$ Y% N' D

3 Y% u5 V9 B2 C. ~% V* ?/ e1 s
$ R7 c) S0 j2 V( [5 V1 Z# v
7 _0 {, f. K! B$ c- }( m

2 j- P- u3 F; e# k

- ~# }7 _0 K8 s8 S
" x: s$ W, E/ F& _& q: R

! L4 v4 v; a' L$ J  }# e
- P/ J  |. v+ g! s# S6 O

8 }$ N' d7 P/ j
  • TA的每日心情
    开心
    2019-11-20 15:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-13 14:28 | 只看该作者
    看看谢谢分享
  • TA的每日心情
    开心
    2020-1-22 15:03
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    3#
    发表于 2020-4-13 16:57 | 只看该作者
    要查看本帖隐藏内容

    该用户从未签到

    12#
    发表于 2020-4-14 18:23 | 只看该作者
    在获得总线控制权的节点发送数据过程中

    该用户从未签到

    13#
    发表于 2020-4-19 20:45 | 只看该作者
    要查看本帖隐藏内容
    3 V: y+ W1 W! @8 r8 H
  • TA的每日心情

    2025-6-4 15:18
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    14#
    发表于 2020-8-13 08:03 | 只看该作者
  • TA的每日心情

    2019-11-22 15:14
  • 签到天数: 2 天

    [LV.1]初来乍到

    15#
    发表于 2020-8-17 13:25 | 只看该作者
    学习下,谢谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-7 00:05 , Processed in 0.140625 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表