51CTO技术论坛_中国领先的IT技术社区's Archiver

sundexuan 发表于 2007-8-20 09:49

基于C的CAN总线切换方案

CAN(Control Area Network)总线最初是由德国Bosch公司开发的,它是一种支持分步式实时控制系统的串行通信局域网,具有如下优点:%Xis {.P"t ad
  a. 通信方式灵活,可以多主方式工作,[url=http://www.studa.net/network/]网络[/url]上任意节点均可以在任意时刻主动地向总线上其他节点发送信息,而不为主从。)F[$je)Y1s)h
  b. 采用非破坏性总线仲裁技术,当2个节点同时向总线上发送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受[url=http://www.studa.net/]影响[/url]地继续传输数据,避免了总线冲突。
n3w8yIf:z)];A1h:T/p p   c. 总线上的节点信息可以分成不同的优先级,以满足不同的实时要求。?(ncn$y
  d. 可以用点对点、一点对多点及全局广播等几种方式发送和接收数据。
n:PDb4ufI   e. CAN 的直接通信距离最远可达10km(速率5kbit/s以下);最高通信速率可达到1Mbit/s(最大传输距离为40m),节点可达110个。通信介质采用双绞线、同轴电缆或光纤。
k:^5M g!M z2w$~Z!GA?   f. CAN 采用短帧结构,每帧信息最多8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时采用CRC校验等检错措施,降低了数据出错率。
-s!h\du_*^5[g g. 当CAN 节点严重错误时,具有自动关闭输出的功能,切断该节点与总线的联系,使总线上的其他节点及通信不受[url=http://www.studa.net/]影响[/url],故具有较强的抗干扰能力。
H.ek&|GnMyl    虽然CAN总线具有较高的可靠性,但在对可靠性要求极高的应用(如电力监控)中,单一的总线难以满足这种要求,因此需采用双总线结构,当某一节点出现故障时,装置能自动切换另一总线上运行。网络图如图1所示:J2{)TY[!wC)d&W9V

3F7A Tu l/Ee [attach]55745[/attach];H qYU$[ s

$uE*I g._o_ 综合通信管理机通过双CAN 网与各装置通信,然后再转换为串行方式与上位机通信。通信管理双CAN网同时接收各装置上传的数据,亦同时转发上位机下达的命令。各装置双CAN网切换方 式为:装置不断检测上位机发送的握手帧,若在规定的时间未收到握手帧,则判断为通信故障,装置自动切换到另一网上运行。下面主要介绍通信管理机的双网切换过程。\\{*^sKN/tT%p
硬件部分
[2|&d;Ic T9L J8B     本文采用PHILIPS公司生产的SJA1000来实现CAN总线切换功能。SJA1000 是一款完全符合CAN总线协议规定的独立CAN控制器, 用于汽车和一般工业环境中的控制器局域网络。它是PHILIPS半导体PCA82C200 CAN控制器的替代产品,不仅支持BasicCAN(CANBUS 2.0A)模式,同时还支持功能更强的PeilCAN(CANBUS 2.0B)模式。具有如下特性:
E$yK.I*I 与PCA82C200独立CAN控制器引脚、电气完成兼容,具有它的所有功能。,tT b)ZB.A
     提供64字节接收缓冲区,可以存储高达21个报文,延长了最大中断服务时间,避免了数据超载。%aO:oW drb L!?$`
     和CAN2.0B协议兼容(PCA82C200兼容模式中的无源扩展帧),同时支持11位和29位标识符,允许在同一系统中应用这二种帧结构,芯片可正确识别。l9}:hgsv@3?C
     最高位速率可达1Mbits/s,支持CAN总线协议规定的所有通信速率。
;ieO!FHw-u      PeliCAN模式扩展功能:cm.IHB b^~
      --可读/写访问的错误计数器H~!k@IYE
      --可编程的错误报警限制5S\O.Xd0fq
      --最近一次错误代码寄存器
CYZn ^w/F^"l:NE       -- CAN总线错误中断1Z!Z6__ D5w6QB#B[l2g
      --具体控制位控制的仲裁丢失中断3ba H1?%TT']
      --单次发送(当发生错误或无仲裁时不重发)
(A|G+DE,V%m       --只听模式(监听CAN总线,无应答、无主动的出错标志)RhN!`)Ef
      --支持热插拔(软件实现的位速率检测)kw!g Xw$c9v$W1i1YG
      --验收滤波器扩展(4字节验收代码,4字节屏蔽)5][DLAq m @
      --自测试模式(自接收请求)/^y'o3q@}\
     24MHz时钟频率,使MCU的访问更快、CAN的位定时选择更多。
dow+Qf6D2D      对不同微处理器的接口,可以支持Intel系列和Motorola系列的处理器。"OC7H9[uzL1z| v
     提供可编程的CAN输出驱动器配置。
\8}[!DL&I'{ K      增强的环境温度范围(-40-+125℃)。%K!r4X&OL'ke
I^9hS?Dw.K|:X
基于SJA1000以上特点,CAN总线切换硬件电路原理图如图2所
N8dYS S L3KZ
*|p\8]P9]9j i [attach]55746[/attach]
;GM x#}]9ms
C*y:_u@;s o`D+S 软件部分
-E ]"el;N+r CAN总线切换程序主要包换初始化、数据发送与接收和数据处理。下面就介绍这三方面基于C语言的程序编写。3ut |PM$Xe
1.  初始化程序3t6g RB+Wg+Rc
SJA1000的初始化只能在复位模式下进行。初始化主要完成时间分频器、中断寄存器、滤波方式、验收代码、屏蔽代码、波特率和输出控制等的配置。具体如下:
rq4o~K!Z B #define               CAN0_BASE     0x4009M8XxR6E_/B C
#define               CAN1_BASE     0x500
Uyky\+s9bx // CAN Bus Time Regisiter
1EC t.A'hY t/K/k(Wh const unsigned char BusTime0[]={ 0xff, 0xe7, 0xd3, 0xc9, 0x89, 0x84, 0xc0, 0x80, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
c,we5LZ*Mbt const unsigned char BusTime1[]={ 0xff, 0xbe, 0xbe, 0xbe, 0xa5, 0xa5, 0xff, 0x25, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
R&ZC(w@q // CAN initialize4@:R`:U bs i`.O
alien unsigned char caninit(unsigned char canno)gr-by)o)s8F
{Z9cj9T.r m;w M1h-Wy
            unsigned char *cnbase;
dEMS-^]e1l             unsigned char i,j;
{&f'i*C1y7O~             if(cnno==0) k'b`efgm;cU
cnbase = (unsigned char *)CAN0_BASE;
3]ur"m ygB             else if(cnno==1)
`"qkD a cnbase = (unsigned char *)CAN1_BASE;ES&P_w/O _
            else return(0xff);'dg&jLN7f3M^#E
            for(i=0;i!m&? q`Rv:f~
{
'q4V } HxE E                 *cnbase = 1;3l^Q9Qf`]
                if(*cnbase&1)   break;I#_ d6d EhR8Cc
            }OYA1{\:EN
            if(i>=8) return(0xff);
`F?T!h:?7y;n/k m-L0j/HR
            *(cnbase+31) = 0xc8;   // cdr1~XDT|
            *(cnbase+ 4) = 0;      // ier
:ZZ^;N,v.j!be8S             *(cnbase+ 0) |= 0x0;    // mode
1Vo;pV,oc g/_             *(cnbase+16) = 0x3f;   // acr0)S~@A#C2l)i$d
            *(cnbase+20) = 0xc0;   // amr0
z0~0@:r Uj5r             *(cnbase+17) = 0x00;   // acr1
I!X*m6o9[:E             *(cnbase+21) = 0xef;   // amr1
*tN,H&PV             *(cnbase+18) = 0x3f;   // acr2
^,x*K*o n\ Y*W#~             *(cnbase+22) = 0xff;    // amr2
'\OfJ'G$R!x             *(cnbase+19) = 0x80;   // acr3
/`?@S:I"v%|Y$?K             *(cnbase+23) = 0xff;   // amr3'{,Z G@-dunI
            *(cnbase+ 6) = BusTime0[3];szqc O jhc,F,o
            *(cnbase+ 7) = BusTime1[3];  // CAN bus time register
-Ed;~4Zc(gG)i0U             *(cnbase+ 8) = 0x1a;     // output control[[W IIB
       if(cnno==0)      
Tb^7O@7RPh6? *(cnbase+ 4) = 0xff;  // CAN0 interupt receive mode QNDB3m T
            else if(cnno==1) p$}$Dr/^\W3i S
*(cnbase+ 4) = 0;    // CAN_B scan receive mode         
(^.nEa%GV [G&Qo1nM-y else ;
Z v%i:A6k1VGS              for(i=0;i3F Ms*u-U E'Z
{ [ j'L$V{
                  *cnbase &= ~1;
n8d wyD$Vs,?AsWv                   if(!(*cnbase&1))
]5{!g]_Q\ break;
x"N"YR Aao             }.g]b.T*mhp
            if(i>=16) return(0xff);
L;L@9P?Z`x              j = *(cnbase+ 3);
vP ? i ?             while(*(cnbase+ 2) & 0x01)
V C R\y6k4vw,E[ *(cnbase+ 1) = 0x04;  //release rx message
~ OBn(rCJP             if(t&0x08)
E9UV*w?p R *(cnbase+ 1) = 0x08;  //clear data overrun
|Xcf)VzcmI return(0);Oz7F-p@6yA0G-_
}
7U!s t^7a2Ba,~
S+_MO`"E w 2.  发送程序aW/L.TRO7}@
发送程序完成通信双方约定的帧的发送,发送时把需发送的数据送入发送缓冲区,然后置位命令寄存器的“发送请求”位,SJA1000启动发送,具有如下:~D+FN3PS;}
alien void DataSend(unsigned char *mesg, unsigned char len)8\ \2GJ;TK^-g
{ unsigned char *p;g_(`D `&W
  unsigned char i, j;(g*O*q?-c-o
  i = *(cnbase+ 3);2Vob5C h9T
  if( (i&0x02) )              // check transmic interrupt@|Y%vR%L#I.V(mI"u
   { for(j=0; j tX%n_XLC#D5U
      { *(cnbase+16) = *mesg ;
|g+qa/zL         cnbase++;
S D ?4P0s3O8V)o4^5{         mesg++;
]9p|6Q/sPM        }F?9S%[$k
     *(cnbase+ 1) = 0x01;     // transimic requst
;Q5U RLM*w,W     }
H7J3Q i-snm    else ~9eu:IP
     continue; j){#B#T0_6r bd
}1F5KV)d/I;cG+o,[U)k
3.  接收程序
+[B%q$mD? 报文的接收由CAN 控制器SJA1000 独立完成收到的报文放在接收缓区,可以发送给主控制器的报文,由状态寄存器的接收缓冲器状态标志RBS和接收中断标志RI标出,主控制器会将这条信息发送到本地的报文存储器,然后释放接收缓冲器。(Q;_bS$\-oYl[5~
alien void DataReceive( unsigned char *mesg )
,`RgH_n!w:cL5u { Q:?1G#SF
  unsigned char i, j;               K5iWT bZ_&rL"R
i = ( (*(cnbase+3)&0x01) & (*(cnbase+2)&0x01) );  n'IZ/{L VA:b3B
if(i== 1)F1m]J"|g QcUw Xc
{  
"GB Dm^3\,g yD for(j=0; j
BB4S*t`aL0g7^1I        {  *mesg = *(cnbase+16);    x|S'w)_/N
       mesg++;
.u}]5O%lmT'v        cnbase++;y&M9Pa]f}]b8?/D
       }                                                L P+}"HH0Z;D
*(pnet+1) = 0x04;       // release receive buffer
nc#D7] GH:w!Y }                                                  *r,a*C8PZy
4.  数据处理T6b(wz7T^?
数据处理是对接收到的报文根据实际需要进行处理。不同的应用场合有不同的处理过程,在此不予详细介绍。
P2G2rj%ZIJ Kh alien void DataProcess( void )K-K7Ody V
{7F,z"qN,M:U;Gd/i1]
  unsigned char DatProBuf[20] ;v0[9Z}sH
  DataReceive( &DatProBuf );Am!qw}c V%n K
  /*7r i;v\^ Eb
   Data Process
S!eh\ a[ h   */
rzP(X/}.Q }
Q2zg"j6t/^'nzu9Y!x 总结:l9W:i,T0Ff
总线切换有多种方式,上面介绍的切换方式主要适用于通信管理上。在实际应用中,可根据不同的情况选择不同的切换方式。如对于通信终端,可只用一块CAN控制器,若终端在规定的时间内没有接收到上位机发出的握手帧,则判断为通信故障,装置自动切换到另一网运行。由于篇幅关系,在此不一一介绍。
t!Ji G+b@ j
YAY@;f3^}OS [[i] 本帖最后由 sundexuan 于 2007-8-20 09:51 编辑 [/i]]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.