x03vhflfook640100219319.gif
; B- F' f) y! ]# a" e
点击上方蓝色字体,关注我们 t% {% e) V0 g5 ^) t# h# G
# |, a, S- A s' c) Q在之前的博文中分享过一系列一文搞懂:SPI协议、I2C协议、PID算法、Modbus协议等文章,也考虑过是否可以出一篇介绍CAN总线协议的文章,但是在之后的学习研究中,发觉CAN总线协议比较庞大和复杂,做为刚刚进入汽车电子行业的开发小白,一篇文章难以讲解清晰,所以决定在汽车电子专栏中连载分享关于CAN总线协议的相关知识。0 B4 Y8 H3 E, z2 L: u
3 X1 t" \% j% ^" D/ j7 V
由于本人也处于学习和研究阶段,如果对CAN总线协议有理解不到位的地方,还请各位大佬在文末留言指正一二。2 |) A9 Q4 G/ L" _
" F x5 {( D- k+ ]6 a# Y- W1
+ R) ?" O% T3 Q+ ^0 mCAN总线简介
! F: u+ l8 g# T- a* ^CAN总线协议(Controller Area Network),控制器局域网总线,是德国BOSCH(博世)公司研发的一种串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。
' G, o+ a4 S0 t( I8 B* iCAN通讯协议标准(ISO-11898:2003)介绍了设备间信息是如何传递以及符合开放系统互联参考模型(OSI)的哪些分层项。实际CAN通讯是在连接设备的物理介质中进行,物理介质的特性由模型中的物理层定义。ISO11898体系结构定义七层,OSI模型中的最低两层作为数据链路层和物理层,如下图所示:7 N( B& ^' H. H4 ^8 M! @- e7 `
0 y3 {' h) ^& V1 I$ T; t$ T4 L1 l2 B
uovftzmjdf3640100219419.png
* Z6 m7 v$ f4 p$ A. g, Q
h3g5g0gkbak640100219519.png
; Q/ F* t7 P& {9 K2 [; ]5 ALLC用于接收滤波、超载通告、回复管理;MAC用于数据封装/拆封、帧编码、媒体访问管理、错误检测与标定、应答、串转发/并转串;PLS用于位编码/解码、位定时、同步;PMA为收发器特性。8 A E; d+ r! s ?& M% j2 U
4 m3 T3 G! B! KCAN协议主要用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束,该协议的健壮性使其同样适用于自动化和工业环境中。
- b5 a6 U" u) r: [- @% ]+ Z$ x8 U; U* U) w( C9 n7 j* Y
2sjur415x00640100219619.png
3 B8 G4 C O A
CAN总线协议距今已经发展40多年,如今,CAN总线已成为汽车(汽车、卡车、公共汽车、拖拉机等)、轮船、飞机、电动汽车电池、机械等的标准配置。7 D0 q# q9 q# P8 a" Z/ h
CAN之前的版本:汽车ECU是复杂的点对点布线1986年:BOSCH(博世)开发了CAN协议作为解决方案1991年:BOSCH(博世)发布了CAN 2.0(CAN 2.0A:11位,2.0B:29位)1993年:CAN被采用为国际标准(ISO 11898)2003年:ISO 11898成为标准系列2012年:博世发布了CAN FD 1.02015年:CAN FD协议标准化(ISO 11898-1)2016年:CAN物理层,数据速率高达5 Mbit/s,已通过ISO 11898-2标准化( K, q+ X% G1 B: L2 t6 Y6 O' c4 d
$ { @! s2 k f* c A+ p# `: g) d4 I' l$ W* _
ejgt0npcfi0640100219720.png
, {, G$ I4 W+ ]4 Y
CAN总线具有以下特点:0 Q$ ^( N' E/ h
符合OSI开放式通信系统参考模型;两线式总线结构,电气信号为差分式;多主控制,在总线空闲时,所有的单元都可开始发送消息,最先访问总线的单元可获得发送权;多个单元同时开始发送时,发送高优先级ID消息的单元可获得发送权;点对点控制,一点对多点及全局广播几种传送方式接收数据,网络上的节点可分成不同的优先级,可以满足不同的实时要求;采用非破坏性位仲裁总线结构机制,当两个节点同时向网络上传送信息时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传送数据消息报文不包含源地址或者目标地址,仅通过标识符表明消息功能和优先级;基于固定消息格式的广播式总线系统,短帧结构;事件触发型,只有当有消息要发送时,节点才向总线上广播消息;可以通过发送远程帧请求其它节点发送数据;消息数据长度0~8Byte;节点数最多可达110个;错误检测功能。所有节点均可检测错误,检测错误的单元会立即通知其它所有单元;发送消息出错后,节点会自动重发;故障限制,具有自动关闭总线的功能,节点控制器可以判断错误是暂时的数据错误还是持续性错误,当总线上发生持续数据错误时,控制器可将节点从总线上隔离,以使总线上的其他操作不受影响;通信介质可采用双绞线、同轴电缆和光导纤维,一般使用最便宜的双绞线;理论上,CAN总线用单根信号线就可以通信,但还是配备了第二根导线,第二根导线与第一根导线信号为差分关系,可以有效抑制电磁干扰;直接通信距离最远可达10KM(速率4Kbps以下),通信速率最高可达1MB/s(此时距离最长40M);总线上可同时连接多个节点,可连接节点总数理论上是没有限制的,但实际可连接节点数受总线上时间延迟及电气负载的限制。每帧信息都有CRC校验及其他检错措施,数据错误率极低;废除了传统的站地址编码,取而代之的是对通信数据块进行编码。采用这种方法的优点是可使网络内的节点个数在理论上不受限制,数据块的标识码可由11位或29位二进制数组成,因此可以定义211或229个不同的数据块,这种数据块编码方式,还可使不同的节点同时接收到相同的数据,这一点在分步式控制中非常重要。
% P: k* O0 F! ]& }
( A" V: q5 f9 t/ L0 {CAN总线具体以下优势:
! g9 \9 C8 Q ~* ^" W r( O
/ m2 l/ M' a- O/ v
cic4fhhk5wh640100219820.png
' w( {! B. v- G' m& [) d& W+ {2
9 k4 T N' `" W! v" c' v7 D. yCAN节点组成
& P6 ]. w3 R. C/ f3 a! }& pCAN节点通常由三部分组成:CAN收发器、CAN控制器和MCU。
V3 X- K' I6 Y: K* j. X9 @4 q, w9 R; g- L
CAN总线通过差分信号进行数据传输,CAN收发器将差分信号转换为TTL电平信号,或者将TTL电平信号转换为差分信号,CAN控制器将TTL电平信号接收并传输给MCU,如下图所示:
$ Z4 H6 v; l# Y# i2 a; } ?$ T; e
% Z8 O6 x; e2 C( q. ^
n5h2huqbut3640100219920.png
- h9 j7 j* `4 M3 k( P# D
目前,我们常用的STM32、华大、瑞萨等单片机内部就集成了CAN控制器外设,通过配置就可实现对CAN报文数据的读取和发送。
6 j; }0 a0 h* Q6 o3
" t- e+ D# b7 M- l+ c& \CAN总线结构
9 r; v: w( f7 kCAN总线是一种广播类型的总线,可支持线形拓扑、星形拓扑、树形拓扑和环形拓扑等。CAN网络中至少需要两个节点设备才可进行通信,无法仅向某一个特定节点设备发送消息,发送数据时所有节点都不可避免地接收所有流量。但是,CAN总线硬件支持本地过滤,因此每个节点可以设置对有效的消息做出反应。
: l! X3 [1 {$ z& w) Z# l4 ^6 t9 u5 z4 w2 b" Y" ~4 c J8 ^; n
线形拓扑是在一条主干总线分出各个节点支线,其优点在于布线施工简单,接线方便,阻抗匹配规则固定,缺点是拓扑不够灵活,在一定程度上影响通讯距离,如下图所示:" o( C4 p+ v" k) @5 h9 B
7 |" `# ]" i2 z8 [' T- w) o' T. l7 b( d
f0hbi25qm5e640100220020.png
* i i/ q8 Y4 ~3 ?- ?1 M# a星形拓扑是每个节点通过中央设备连到一起,其优点是容易扩展,缺点是一旦中央设备出故障会导致总线集体故障,而且分支线长不同,阻抗匹配复杂,可能需要通过一些中继器或集线器进行扩展,如下图所示:2 e- M/ [, `: M: C9 q) _5 b& i; d
' ^9 b8 s! E; B# F( }# a
3wrjckbim3u640100220120.png
; T/ u- Z# t6 M5 h S
树形拓扑是节点分支比较多,且分支长度不同,其优点是布线方便,缺点是网络拓扑复杂,阻抗匹配困难,通讯中极易出现问题,必须加一些集线器设备,如下图所示:
! Q% T6 \ k$ a) L/ n0 Q2 H" e G t3 o) K( b( P$ \# H
xoecec0tkyv640100220220.png
9 v7 ]0 | s2 r1 E" _/ m( }4 \
环形拓扑是将CAN总线头尾相连,形成环状,其优点是线缆任意位置断开,总线都不会出现问题,缺点是信号反射严重,无法用于高波特率和远距离传输,如下图所示:, f5 Y& o3 H/ r5 G$ |* W
; }, y- {! V! O4 j1 ^( z; p6 s Z
3 D# P4 x2 q6 D: O5 D+ Y
lkst4hgsfiv640100220320.png
1 C- Y! J' F+ p, p& |虽然CAN总线可以支持多种网络拓扑,但在实际应用中比较推荐使用线形拓扑,且在IOS 11898-2中高速CAN物理层规范推荐也是线形拓扑。% |) H) G# K6 I e4 O% J- Z9 z
3 X( i8 T9 g( d在ISO 11898-2和ISO 11898-3中分别规定了两种CAN总线结构(在BOSCH CAN2.0规范中,并没有关于总线拓扑结构的说明)。 E; i( {" S/ d) }4 Q
: @3 F0 i, J# Y. t; ?" l; \. s
ISO 11898-2中定义了通信速率为125Kbps~1Mbps的高速闭环CAN通信标准,当通信总线长度≤40米,最大通信速率可达到1Mbps,高速闭环CAN(高速CAN)通信如下图所示:4 K/ {+ m2 {+ w( e3 D3 C
* `! t! [( m+ T/ Y" R+ n
r3stnnd3cas640100220421.png
& S5 R! G. v% z; u" dISO 11898-3中定义了通信速率为10~125Kbps的低速开环CAN通信标准,当传输速率为40Kbps时,总线距离可达到1000米。低速开环CAN(低速容错CAN)通信如下图所示:
9 ]1 ?* t9 {" P& S) k+ C! Q# `3 [& n( T
8 C4 F2 v: E! a9 C
twcz222gc21640100220521.png
. r6 j8 \: n/ C6 ?9 ~) I5 k4% J( ~! ~+ s+ G" [$ m
8 f$ F* k: M0 t4 {/ j+ W9 _) X& @
CAN总线物理电气特性
1 Y6 z) t2 M# U% l. A7 B在CAN总线上,利用CAN_H和CAN_L两根线上的电位差来表示CAN信号。CAN 总线上的电位差分为显性电平(Dominant Voltage)和隐性电平(Recessive Voltage),其中显性电平为逻辑 0,隐性电平为逻辑 1。% c1 I( |3 L9 e- u1 h7 J, W0 F
+ k0 D* ^) P( k# a( g, V6 D7 W
& i! V$ x5 P+ u9 j
xys51p4qrka640100220621.png
' \2 [/ D/ R' n0 z
高速CAN总线(ISO 11898-2,通信速率为125Kbps~1Mbps)在传输显性(0)信号时,会将 CAN_H端抬向5V高电平,将CAN_L拉向0V低电平。- o5 M+ p3 E9 g0 D2 q. P0 U( ~
0 a$ H- D. U! A" k& g2 ]0 _) @当传输隐性(1)信号时,并不会驱动 CAN_H 或者 CAN_L 端。 显性信号 CAN_H 和 CAN_L 两端差分标称电压为 2V。 终端电阻在没有驱动时,将差分标称电压降回 0V。显性信号(0)的共模电压需要在 1.5V 到 3.5V 之间。隐性信号(1)的共模电压需要在+/-12V。) Z# S+ Q$ |8 y3 U# D
, |) A# x0 K( \! }3 |
vnnn5rloheu640100220721.png
9 J# C9 {; G) T; @
低速/容错CAN(ISO 11898-3,通信速率为10~125Kbps)在传输显性信号(0)时,驱动CANH端抬向5V,将CANL端降向0V。
; Q) d M x2 f& ?. _在传输隐性信号(1)时并不驱动CAN 总线的任何一端。在电源电压VCC为5V时,显性信号差分电压需要大于2.3V,隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时,终端电阻使CAN L端回归到RTH电压(当电源电压VCC为5V时,RTH电压至少为Vcc-0.3V=4.7V),同时使CAN H端回归至RTL电压(RTL电压最大为0.3V)。两根线需要能够承受-27V至40V的电压而不被损坏。
( _$ r+ S3 K6 c6 Z5 p8 f* c. h- n/ T9 q, R+ N
jwfrxbzs3z5640100220821.png
, o# M9 D5 O2 ?6 A# B
在高速和低速CAN中从隐性信号向显性信号过渡的速度更快,因为此时CAN线缆被主动积极地驱动,显性向隐性的过渡速度主要取决于CAN网络的长度和导线的电容。- e# |; i8 F5 H6 d' b9 y9 ?
! c5 r; q5 s8 F2 S' Q* f4 h" @4 M关于高速和低速CAN的相关知识后期会专门出一篇文章进行讲解,敬请期待~
: x+ b4 c9 O ~3 ~4 ^2 }4 w
) ]3 w9 i+ B( m ^
chooi1q2al3640100220921.png
2 N. q* q9 Z- s2 y1 F5 Y! q. e
往期推荐和12岁小同志搞创客开发:如何驱动LED数码管?
& O+ X0 g+ U4 a3 J( n工业机器视觉系统相机如何选型?(理论篇—3)
5 t6 a! n; J. K l' NPrometheus(二)之Node Exporter采集Linux主机数据- k0 r2 o4 G3 m+ W
( f8 V1 J4 ?8 ]
20vczpp1hex640100221021.gif
N4 e7 ?( L& r9 E; Q
点击阅读原文,更精彩~ |