一、CAN总线协议解析5 R) i. \3 `% P/ G' i9 q6 C, j
4 E( P! |( T' W9 i% i1 J, v4 K9 X; Q. D# F5 r) x1 ?
在讲解实现 CAN 总线的实例以前,读者需要具备有关 CAN 总线的基本知识。为此,将在这里简要介绍与实例相关的基础知识。
5 A( t! k; {6 h' u8 {. f5 ^8 q n
1.1 CAN 总线通信模型
- N8 n, j' a- p2 r1 t L3 L
参照 ISO/OSI 标准模型,CAN 总线的通信参考模型如图 1 所示。
. D2 p' H9 N6 N+ Q$ E* \; m
5 q% L9 h. E+ g' l
; d, P& g& c- e
图 1 CAN 总线通信模型
& r$ l' F# m% b& I- D& K
这 4 层结构的功能如下:
9 }+ c8 X0 o1 d, `
• 物理层规定了节点的全部电气特性,在一个网络里,要实现不同节点间的数据传输,所有节点的物理层必须是相同的。
• 传输层描述了 CAN 总线协议的内核,它负责位时序(bit timing)、同步、仲裁、应答、错误探测等。
• 对象层负责报文的过滤、状态和控制。
• 应用层完成用户指定的数据传输任务。
( h- G0 ^( A+ K/ l- i* K
5 |/ m( ^; Q* r' F- p! S: K% HCAN 总线的物理层为数据通信提供了物理连接,而实际的数据通信在其他 3 层中完成。
. F2 ~7 E7 p8 _9 V
1.2 CAN 总线协议中的基本概念
8 E. C$ W' y/ ]7 I2 E& u' ]" \
在讲解 CAN 总线协议之前,需要介绍有关协议中的基本概念。
2 d1 M% \3 q( m4 F! \
1.报文(Messages)
; q$ D! {: P2 }! }9 x9 K
在 CAN 总线传输的数据具有固定的格式和有限的长度,称为报文。
" \. N+ A- s# x* y* ~9 C
2.发送器(Transmitter)和接收器(Receiver)
2 T$ d4 G5 Z; h8 F
在 CAN 总线的数据传输过程中,发出报文的节点称为发送器。节点在总线进入空闲状态前或丢失仲裁前为发送器。如果一个节点不是报文发送器,并且总线不处于空闲状态,则该节点为接收器。
; ?$ a% Y4 {& l; N" e
3.比特率(bit rate)
" H4 H& a& Z; @" N8 e4 |; D
CAN 总线的输出速度以单位时间内传输的位来衡量,称为比特率。CAN 总线在不同的系统中可以有不同的比特率。但是在给定的系统中,比特率是统一的和固定的。
7 B% Z4 d; y/ d( B! [3 ~8 X7 b
4.优先级(Priorities)
; P+ h& R& i% Y2 `/ ~
优先级表示总线传输中一个报文的优先级别。
5 a; M, p5 g6 `. t0 _
5.远程数据请求(Remote Data Request)
2 V9 M9 x7 R5 k( W, j
当一个节点向另一个节点请求数据时,需要首先发送一个远程帧(Remote Frame),然后发送一个和远程帧相符的数据帧(Data Frame)。远程帧和数据帧具有相同的标识符。
6 J9 ^ r* d9 Q+ B( z0 [
6.位流(Bit Stream)
7 h& G5 n! [! @& L, k" k( @/ H
CAN 总线通信过程中的数据流。
/ |1 x9 r& i8 Z$ F9 p! u: j5 Q
7.编码方式CAN 总线通信协议规定,报文中的位流按照非归零(Non-Return to Zero)码的方法编码,一个完整的电平要么是显性,要么是隐性。
& d2 y* X' i, n! e+ \* V! o0 `+ B7 S
8.非归零编码(Non-Return to Zero encoding,简称 NRZ)
' [1 I7 T/ v" \6 x4 M
. F7 R& N: Y2 y8 ^0 R$ ?6 u非归零编码是一种用在低速通信接口中的编码方式,同时提供同步和非同步两种方式。在非归零编码方式中,逻辑“1”在传输过程中用一位高电平表示,逻辑“0”用一位低电平表示。非归零编码方式如图 2 所示。
% u/ R' R. ^$ S" h5 P) L# Y
, V* o' k1 J& G2 b% J* r
: l& A ^3 W- F6 a6 r$ O3 f
图 2 非归零编码方式
, `( s( ?2 O& E* k' ^
9.总线数值
& J. c' _6 Y" w' |* s7 t% L
在数据传输时,CAN 总线有两种逻辑值:显性值(dominant)和隐性值(recessive)。如果同时传输显性值和隐性值时,总线上的最终结果是显性值。在线与(wired-AND)总线连接方式中,显性值用逻辑“0”表示,隐性值用逻辑“1”表示。
" Z3 V3 I9 m' y. X+ X6 Q# l6 T2 a, k6 r7 e3 r, {! W3 t
1.3 报文的数据结构 q. L/ l. y: H& C2 r* }: r
+ v& k) A9 d3 Z5 R4 {5 L
CAN 总线的报文传输是通过 4 种不同类型的帧(Frame)来表示和控制的:
, j1 W9 i- o* V5 N6 t" E
• 数据帧(Data Frame) 用来在数据传输过程中携带数据。
• 远程帧(Remoter Frame) 接收器发送远程帧来请求发送器发送数据,具有和数据帧同样的标识符。
• 出错帧(Error Frame) 用来检测 CAN 总线数据传输过程中的错误。
• 超载帧(Overload Frame) 用于提供当前和后续数据帧或远程帧之间的附加延迟。
9 O' `! Z3 \* A3 X5 C) o
a.数据帧
, ^7 f. r; ~' {' ]( R( t( ~- L
数据帧的具体组成如图 3 所示。
t; S; ]- j" _5 R. |- S( {) E
! W8 R* U5 d) ~7 e! y% S5 U
0 l; g6 `, F2 A+ T3 m4 l) `* p; s3 f1 c) {; O1 V7 _
$ ~% i( E% O3 K' X
图 3 数据帧的具体组成
# \4 [% Y! F& }" V9 b! \3 o$ r
数据帧由帧起始(Start of Frame,SOF)、仲裁字段、控制字段、数据字段、CRC 字段、ACK 字段(应答字段)和帧尾组成。
g: s! {/ l( g8 L
帧起始标志数据帧的开始(远程帧同样具有帧起始),它仅由一个显性值组成。只有在总线处于空闲时,才允许节点开始发送。所有节点必须与首先开始发送的那个节点的帧起始位前沿同步。
. H% w# i) _; c: d1 `
仲裁字段由标识符和远程发送请求位(RTR 位)组成,如图 4 所示。标识符的长度为 11位。远程发送请求位在数据帧中必须是显性值,在远程帧中必须是隐性值。
" Q. t' L0 d+ n5 P! i6 k# `
4 j5 C; A' U8 q' G3 G. D2 T- d! _
$ l: [8 p; x- v( S( @
* T+ w- [: S" n n! b( y! W& V4 N4 _* F- t" o" M
图 4 仲裁字段的组成
( H6 \+ j: c' q+ f6 S% _* n
. O$ s* P1 k+ N& s, e控制字段由保留位和数据长度码组成,如图 5 所示。数据长度码表示数据字段的长度。
/ Z) [ J* ?# W$ W8 I
3 `% I \4 R8 {
8 S5 ^3 C" ^7 `
图 5 控制字段的组成
3 q9 {1 ?0 \4 S s6 c) a. I% m" t
数据字段由数据帧中被发送的数据组成,它可以包括 0~8 个字节,每个字节 8 位。首先发送的是最高有效位。
9 I6 s1 p+ y. ^3 \3 x I7 c9 V
CRC 字段包括 CRC 序列和 CRC 界定符。CRC 序列用来实现 CRC 计算,CRC 界定符只包括一个隐性值。应答字段为两位,包括应答间隙和应答界定符。帧尾由 7 个连续的隐性值组成,作为数据帧和远程帧的结束标志。
+ f& f5 d- f* b6 o0 \) y% {
b.远程帧
% {6 Q+ W7 B( x9 E7 j! @
, G+ d3 U/ b" o1 w2 X$ W
作为接收器的节点可以通过向相应的数据源节点发送一个远程帧来激活该节点,让它把数据发送给接收器。远程帧由帧起始、仲裁字段、控制字段、CRC 字段、应答字段和帧尾 6 个不同的字段组成。远程帧的组成如图 6 所示。
" R- V/ _" k8 k5 ]- h# k- Z9 |
) `0 d- ~8 L# T- o
* d# w8 V( n5 C/ T; y. }( ?图 6 远程帧的组成
$ N* S- V8 ]( t3 B: o( l# u
B0 Q0 k! R: ~+ w2 ?$ ?$ T& c
c.出错帧
( Y6 c; D2 h( Y$ `: z9 j出错帧由出错叠加标志和错误界定符组成。出错叠加标志包括了多个出错信息的标志。
% b- C1 H: }! H/ ~
d.超载帧
. r5 y) s9 G d5 F+ s超载帧包括超载标志和超载界定符。超载发生在两种情况下:一个是接收器因内部条件要求推迟下一个数据帧或者远程帧的发送;另一个是在间歇字段检测到显性值时。
. _5 Q" _; ?* x% v1 F
e.帧间空间
/ p) C& O l& H5 U
数据帧或远程帧通过帧间空间与前一帧隔开,而不管前一帧是何种类型的帧。而在超载帧与出错帧前面不需要帧间空间,多个超载帧之间也不需要帧间空间来作分隔。
8 p6 d! y$ u& U% E* j9 V5 n* Q1.4 位时序(Bit Timing)
9 y8 T. P; G- V0 i* E
m! t- W9 T1 P& O: wCAN 总线协议规定,报文传输的同步或者非同步方式的选择通过位时序来实现。CAN 总线中位时序包括正常位速率和正常位时间两个参数。
8 s2 K' F' p B; {, z( c• 正常位速率(Nominal Bit Rate):在非重同步情况下,借助理想发送器每秒发送的位数。
& M- S5 Z, m. V# ?, F• 正常位时间(Nominal Bit Time):正常位速率的倒数。正常位时间由几个不同的时间段组成,它们是同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段 1(PHASE_SEG1)、相位缓冲段 2(PHASE_SEG2),如图 7 所示。
2 ~+ d( H) \5 Z, K
图 7 正常位时间的组成
. Q/ }# ?5 V% L7 f2 Z8 l# N% y
• 同步段:在这段时间内,完成总线上各个节点的同步,需要一个跳变沿。
• 传播段:这个时间段是指网络上传输的延迟时间,它是信号在总线上传播时间、输入比较器延迟和输出驱动器延迟之和的两倍。
• 相位缓冲段 1 和相位缓冲段 2:它们用于弥补跳变沿的相位误差造成的影响。通过重同步,这两个时间段可以被延长或缩短。
0 F' J: k: F: ]0 v* N( M• 采样点:这是读取总线电平并理解该位数值的时刻,它位于相位缓冲段 1 的终点。
: k- D* Z! H) w- Y6 x$ B" G' G
1.5 同步(Synchronization)
' w* A: {4 }! u; \
a.硬同步(Hard Synchronization)
$ Q; f/ T. G! V. P! U: a K- \硬同步后,内部位时间从同步段(SYNC_SEG)重新开始,它迫使触发该硬同步的跳变沿处于新的位时间的同步段(SYNC_SEG)之内。
1 N; C: I( s/ U2 T1 C
b.重同步(Resynchronization)
1 u4 ^! ~6 y& m4 k当引起重同步沿的相位误差小于或等于重同步跳转宽度编程值时,重同步的作用和硬同步相同。若相位误差大于重同步跳转宽度且相位误差为正时,则相位缓冲段 1(PHASE_SEG1)延长总数为重同步跳转宽度。若相位误差大于重同步跳转宽度且相位误差为负时,则相位缓冲段2(PHASE_SEG2)缩短总数为重同步跳转宽度。
7 _7 F( t7 A: f u1 d3 `3 Vc.重同步跳转宽度(Resynchronization Jump Width)
8 ~, M- Z* \/ C+ w/ q2 r
由于重同步的结果,PHASE_SEG1 可被延长或 PHASE_SEG2 可被缩短。相位缓冲段长度的改变量不应大于重同步跳转宽度。
( D: r4 ]+ Z1 A( e! ?' ld.同步的规则CAN
% e- O* h, W" O/ [/ { L通信协议规定,同步包括硬同步和重同步两种形式。它们遵从下列几条规则:
$ s; b& E* K @/ t2 A- 在一个位时间内仅允许一种同步。
- 对于一个跳变沿,仅当它前面的第一个采样点数值与紧跟该跳变沿之后的总线值不相同时,才把该跳变沿用于同步。
- 在总线空闲期间,若出现一个从隐性值到显性值的跳变沿,则执行一次硬同步。
- 符合规则前两条规则的从隐性值到显性值的跳变沿都被用于重同步(在低比特率时也可选择从显性值到隐性值的跳变沿),例外的情况是具有正相位误差的隐性值到显性值的跳变沿将不会导致重同步。
& e5 B$ `: q" N6 R9 c: l
: I/ f( i7 e3 o f* x" ], c; w
二、CAN通信控制器程序基本框架
$ f3 `& C3 x0 t( a; W' ]% QCAN 总线的通信协议由 CAN 通信控制器完成。CAN 通信控制器由实现 CAN 总线协议部分和微控制器部分的电路组成。下面将通过一个实例讲解如何用 FPGA 实现 CAN 通信控制器的功能。这个实例从功能和结构上完全参照 SJA 1000 CAN 通信控制器。
7 M8 [ [9 a, y5 T
2.1 SJA1000CAN 通信控制器
, Q2 r5 M) o/ _& vSJA1000 是 Philips 公司于 1997 年推出的一种独立 CAN 总线控制器。它实现了 CAN 总线物理层和数据链路层的所有功能。SJA 1000 通信控制器的功能框图如图 8 所示。
+ [* x$ r" Z7 R# ?2 \( p% c5 q9 YSJA 1000 主要由以下几部分构成:
$ t7 m. G% o O$ J. X9 k• 接口管理逻辑 处理来自主 CPU 的命令,控制 CAN 寄存器的寻址,并为主 CPU 提供中断和状态信息。
• 发送缓冲器 它是 CPU 和位数据流处理器(BSP)之间的接口,能存储一条可发送到 CAN总线上的完整报文。报文由 CPU 写入,由位数据流处理器读出。
0 J- F2 c' X6 i
/ V, _# V0 W0 k5 h* s, D% [- {
1 y" G1 i) V6 h0 O9 |图 8 SJA1000 通信控制器功能框图
% \8 n' r7 u8 ]8 u/ F7 f
• 接收缓冲器 它是接收 FIFO 的一个可被 CPU 访问的窗口。在接收 FIFO 的支持下,CPU可以在处理当前信息的同时接收总线上的其他信息。
• 接收滤波器 它把收到的报文标识符和接收滤波器寄存器中的内容进行比较,以判断该报文是否应该被接收。如果符合接收条件,则报文被存入接收 FIFO 中。
• 位数据流处理器 它是一个序列发生器,控制发送缓冲器、接收 FIFO 和 CAN 总线之间的数据流,同时它也执行错误检测、仲裁、位填充和 CAN 总线错误处理功能。
• 位时序逻辑 它监视串行 CAN 总线并处理与总线相关的位时序。它在报文开始发送,总线电平从隐性值跳变到显性值时同步于 CAN 总线上的位数据流(硬同步),并在该报文的传送过程中,每遇到一次从隐性值到显性值的跳变沿就进行一次重同步(软同步)。位时序逻辑还提供可编程的时间段来补偿传播延迟时间和相位漂移(如晶振导致的漂移),还能定义采样点以及每一个位时间内的采样次数。
; h% H; s) D5 t- t6 C* c• 错误管理逻辑 它按照 CAN 协议完成传输错误界定。它接收来自位数据流处理器 BSP 的出错通知,并向位数据流处理器 BSP 和接口管理逻辑提供出错统计。
2 N) ]( o$ P8 L' E8 i ]$ P
0 N5 W& L1 P3 I9 W( y
2.2 CAN 通信控制器程序框架
6 p8 H6 q! x+ C) G, N) d$ h' @* W
8 `. N8 J. ?$ B) D7 N
1 r! Y3 ^6 Q8 {& x. C }. {实现的 CAN 通信控制器参照 SJA1000 CAN 通信控制器的结构,程序基本框架如图 9 所示。
$ y' k' C! k |9 `& N
: _; e; v7 D7 G) V) o' {/ }. r
$ n/ U# B' r# ?7 [; m# J
6 s/ Q6 l% y5 Z
图 9 CAN 通信控制器结构框图
. m$ h2 _( T6 t e# F
本篇到此结束,下一篇带来基于FPGA的CAN总线控制器的设计(中),会介绍CAN 通信控制器的具体实现,包括顶层控制程序、寄存器控制、 位时序逻辑(Bit Timing Logic)、位数据流处理器(Bit Stream Processor)、CRC 校验 、FIFO等相关内容。
7 y0 y% l' e2 ~! o, c
i4 w1 o0 q) f0 ~