基于C的CAN总线切换方案

发布者:飘然出尘最新更新时间:2016-09-18 来源: eefocus关键字:CAN  总线切换 手机看文章 扫描二维码
随时随地手机看文章
引言:

CAN(Control Area Network)总线最初是由德国Bosch公司开发的,它是一种支持分步式实时控制系统的串行通信局域网,具有如下优点:

  a. 通信方式灵活,可以多主方式工作,网络上任意节点均可以在任意时刻主动地向总线上其他节点发送信息,而不为主从。
b. 采用非破坏性总线仲裁技术,当2个节点同时向总线上发送数据时,优先级低的节点主动停止数据发送,而优先级高的节点可不受影响地继续传输数据,避免了总线冲突。
c. 总线上的节点信息可以分成不同的优先级,以满足不同的实时要求。
d. 可以用点对点、一点对多点及全局广播等几种方式发送和接收数据。
e. CAN 的直接通信距离最远可达10km(速率5kbit/s以下);最高通信速率可达到1Mbit/s(最大传输距离为40m),节点可达110个。通信介质采用双绞线、同轴电缆或光纤。
f. CAN 采用短帧结构,每帧信息最多8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时采用CRC校验等检错措施,降低了数据出错率。

g. 当CAN 节点严重错误时,具有自动关闭输出的功能,切断该节点与总线的联系,使总线上的其他节点及通信不受影响,故具有较强的抗干扰能力。
  虽然CAN总线具有较高的可靠性,但在对可靠性要求极高的应用(如电力监控)中,单一的总线难以满足这种要求,因此需采用双总线结构,当某一节点出现故障时,装置能自动切换另一总线上运行。网络图如图1所示:

  

图1

综合通信管理机通过双CAN网与各装置通信,然后再转换为串行方式与上位机通信。通信管理双CAN网同时接收各装置上传的数据,亦同时转发上位机下达的命令。各装置双CAN网切换方式为:装置不断检测上位机发送的握手帧,若在规定的时间未收到握手帧,则判断为通信故障,装置自动切换到另一网上运行。下面主要介绍通信管理机的双网切换过程。

 

硬件部分

    本文采用PHILIPS公司生产的SJA1000来实现CAN总线切换功能。SJA1000 是一款完全符合CAN总线协议规定的独立CAN控制器, 用于汽车和一般工业环境中的控制器局域网络。它是PHILIPS半导体PCA82C200 CAN控制器的替代产品,不仅支持BasicCAN(CANBUS 2.0A)模式,同时还支持功能更强的PeilCAN(CANBUS 2.0B)模式。具有如下特性:

aspectratio="t" v:ext="edit"> 与PCA82C200独立CAN控制器引脚、电气完成兼容,具有它的所有功能。
     提供64字节接收缓冲区,可以存储高达21个报文,延长了最大中断服务时间,避免了数据超载。
     和CAN2.0B协议兼容(PCA82C200兼容模式中的无源扩展帧),同时支持11位和29位标识符,允许在同一系统中应用这二种帧结构,芯片可正确识别。
     最高位速率可达1Mbits/s,支持CAN总线协议规定的所有通信速率。
     PeliCAN模式扩展功能:
      --可读/写访问的错误计数器
      --可编程的错误报警限制
      --最近一次错误代码寄存器
      -- CAN总线错误中断
      --具体控制位控制的仲裁丢失中断
      --单次发送(当发生错误或无仲裁时不重发)
      --只听模式(监听CAN总线,无应答、无主动的出错标志)
      --支持热插拔(软件实现的位速率检测)
      --验收滤波器扩展(4字节验收代码,4字节屏蔽)
      --自测试模式(自接收请求)
     24MHz时钟频率,使MCU的访问更快、CAN的位定时选择更多。
     对不同微处理器的接口,可以支持Intel系列和Motorola系列的处理器。
     提供可编程的CAN输出驱动器配置。
     增强的环境温度范围(-40-+125℃)。

 

基于SJA1000以上特点,CAN总线切换硬件电路原理图如图2所

图2

软件部分

CAN总线切换程序主要包换初始化、数据发送与接收和数据处理。下面就介绍这三方面基于C语言的程序编写。

1.  初始化程序

SJA1000的初始化只能在复位模式下进行。初始化主要完成时间分频器、中断寄存器、滤波方式、验收代码、屏蔽代码、波特率和输出控制等的配置。具体如下:

#define               CAN0_BASE     0x400

#define               CAN1_BASE     0x500

// CAN Bus Time Regisiter

const unsigned char BusTime0[]={ 0xff, 0xe7, 0xd3, 0xc9, 0x89, 0x84, 0xc0, 0x80, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

const unsigned char BusTime1[]={ 0xff, 0xbe, 0xbe, 0xbe, 0xa5, 0xa5, 0xff, 0x25, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};

// CAN initialize

alien unsigned char caninit(unsigned char canno)

{

            unsigned char *cnbase;

            unsigned char i,j;

            if(cnno==0)

cnbase = (unsigned char *)CAN0_BASE;

            else if(cnno==1)

cnbase = (unsigned char *)CAN1_BASE;

            else return(0xff);

            for(i=0;i<8;i++)

{

                *cnbase = 1;

                if(*cnbase&1)   break;

            }

            if(i>=8) return(0xff);

 

            *(cnbase+31) = 0xc8;   // cdr

            *(cnbase+ 4) = 0;      // ier

            *(cnbase+ 0) |= 0x0;    // mode

            *(cnbase+16) = 0x3f;   // acr0

            *(cnbase+20) = 0xc0;   // amr0

            *(cnbase+17) = 0x00;   // acr1

            *(cnbase+21) = 0xef;   // amr1

            *(cnbase+18) = 0x3f;   // acr2

            *(cnbase+22) = 0xff;    // amr2

            *(cnbase+19) = 0x80;   // acr3

            *(cnbase+23) = 0xff;   // amr3

            *(cnbase+ 6) = BusTime0[3];

            *(cnbase+ 7) = BusTime1[3];  // CAN bus time register

            *(cnbase+ 8) = 0x1a;     // output control

       if(cnno==0)     

*(cnbase+ 4) = 0xff;  // CAN0 interupt receive mode

            else if(cnno==1)

*(cnbase+ 4) = 0;    // CAN_B scan receive mode          

else ;

 

            for(i=0;i<16;i++)

{

                  *cnbase &= ~1;

                  if(!(*cnbase&1))

 break;

            }

            if(i>=16) return(0xff);

 

            j = *(cnbase+ 3);

            while(*(cnbase+ 2) & 0x01)

*(cnbase+ 1) = 0x04;  //release rx message

            if(t&0x08)

*(cnbase+ 1) = 0x08;  //clear data overrun

return(0);

}

 

2.  发送程序

发送程序完成通信双方约定的帧的发送,发送时把需发送的数据送入发送缓冲区,然后置位命令寄存器的“发送请求”位,SJA1000启动发送,具有如下:

alien void DataSend(unsigned char *mesg, unsigned char len)

{ unsigned char *p;

  unsigned char i, j;

  i = *(cnbase+ 3);

  if( (i&0x02) )              // check transmic interrupt

   { for(j=0; j

      { *(cnbase+16) = *mesg ;

        cnbase++;

        mesg++;

       }

     *(cnbase+ 1) = 0x01;     // transimic requst

    }

   else

     continue;

}

 

3.  接收程序

报文的接收由CAN 控制器SJA1000 独立完成收到的报文放在接收缓区,可以发送给主控制器的报文,由状态寄存器的接收缓冲器状态标志RBS和接收中断标志RI标出,主控制器会将这条信息发送到本地的报文存储器,然后释放接收缓冲器。

alien void DataReceive( unsigned char *mesg )

{

  unsigned char i, j;             

i = ( (*(cnbase+3)&0x01) & (*(cnbase+2)&0x01) ); 

if(i== 1)

{  

for(j=0; j<11; j++)       // receive a frame

       {  *mesg = *(cnbase+16);   

       mesg++;

       cnbase++;

       }                                               

*(pnet+1) = 0x04;       // release receive buffer

}                                                 

4.  数据处理

数据处理是对接收到的报文根据实际需要进行处理。不同的应用场合有不同的处理过程,在此不予详细介绍。

alien void DataProcess( void )

{

  unsigned char DatProBuf[20] ;

  DataReceive( &DatProBuf );

  /*

   Data Process

  */

}

 

总结

总线切换有多种方式,上面介绍的切换方式主要适用于通信管理上。在实际应用中,可根据不同的情况选择不同的切换方式。如对于通信终端,可只用一块CAN控制器,若终端在规定的时间内没有接收到上位机发出的握手帧,则判断为通信故障,装置自动切换到另一网运行。由于篇幅关系,在此不一一介绍。

参考文献:

1.     CAN. CAN Specification Version 2.0. BOSCH. 1991

2.     SJA1000. Stand-alone CAN controller DATA SHEET. Philips. 2002

关键字:CAN  总线切换 引用地址:基于C的CAN总线切换方案

上一篇:CAN总线技术的应用与发展
下一篇:CAN总线活动讲座一:写在CAN总线开发板助学之前

推荐阅读最新更新时间:2024-05-03 00:39

一眼洞悉CAN数据变化趋势(一)
在当今这个大数据时代下,能否对数据进行快速与准确的分析,将为工程项目、企业发展、甚至社会进步带来决定性的选择。于是如何对数据进行处理,形成直观、有价值的判断依据便成为至关重要的一个环节。就算是在传统的电子行业中,针对通信数据的观察分析,单纯的数据列表已无法满足需求,图形曲线化的数据展示方式便成为了当代产品的刚需。 一般对于在CAN通讯领域上工作了多年的人员,USBCAN卡是再熟悉不过的产品,每一个项目的设计开发,事故现场的排查,都是一款必备的设备,可以方便的获取到CAN帧的所有数据,但其大量的现场数据,以及几十、几百不同帧ID数据的区分,也必是曾经深深困扰着大家,看到眼花缭乱,无从下手。 随着CAN通信越来越广泛的运用,等
[嵌入式]
如何准确测量CAN节点的信号边沿参数
  CAN总线设计规范对于CAN节点的信号边沿各项参数都有着严格的规定,如果不符合规范,则在现场组网后容易出现不正常的工作状态,各节点间出现通信故障。具体要求如表 1所示,为测试标准“GMW3122信号边沿标准”。   表 1 GMW3122信号边沿标准 测试参数 隐性- 显性边沿 显性- 隐性边沿 条件 最小值 典型值 最小值 最大值 高速CAN(最小负载) 500K~1Mbps 15ns 150ns 15ns 300ns 典型值500Kbps,C1=100pF、C1=100pF、C3=0pF 高速CAN(最大负载) 500K~1M
[嵌入式]
简化HEV 48V系统的隔离CAN、电源接口
48V汽车应用中对隔离的需求持续增长。这是一种紧凑、高效、稳健、低噪声的方法,可通过CAN接口隔离48 V系统。 为今天的汽车设计是一种平衡行为。在满足日益严格的排放标准和为越来越多的车载系统和小工具提供动力之间,需为当今的车辆提供高功率,以获得高效率。 为实现效率和功率的融合,工程师更加依赖于将48V电力运行与传统燃气发动机相结合的系统,如混合动力电动汽车(HEV)。这种方法可确保车辆满足严格的二氧化碳(CO2)排放标准,同时还可改进性能和驱动质量。 虽然关于双电池汽车系统本身已有很多说法,但我关注的是这些组合式12和48V系统中的一个关键且有时被忽视的组件:电流隔离。电流隔离用于抵抗接地噪声,并在与其连接的48V系
[汽车电子]
简化HEV 48V系统的隔离<font color='red'>CAN</font>、电源接口
纳芯微全新隔离CAN收发器大幅提高工业系统集成度
国内领先的信号链芯片及其解决方案提供商苏州纳芯微电子股份有限公司(以下简称“纳芯微”)宣布推出隔离CAN收发器NSi1050,继续扩充公司丰富的隔离产品线,满足客户对隔离产品的多样化需求。该芯片集成了双通道数字隔离器和高可靠性CAN收发器,高集成度方案有助于简化系统设计,提升工业系统的可靠性。NSi1050隔离耐压高,满足增强隔离要求,并符合各种工业系统的安规需求,可广泛应用于工业自动化、电梯、电力、不间断电源、储能和其他工业接口卡等各类需要隔离CAN的工业通信系统中。 NSi1050具有高隔离耐压、高共模抗扰、高ESD、高集成度以及高可靠性的特点,其隔离耐压值可达5kVrms,抗共模瞬态干扰度(CMTI)达到80kV/us,
[工业控制]
纳芯微全新隔离<font color='red'>CAN</font>收发器大幅提高工业系统集成度
基于CAN总线的烧结配料监控系统设计
1  引言 烧结厂配料系统是整个烧结生产的源头,配料过程中对现场采集的数据进行有效的收集与传输直接影响着烧结生产的产量和质量,影响企业的劳动生产率和经济效益,而烧结配料现场环境有大量的变频器和电机设备并且布线与通信总线比较接近,这些设备在运行时会产生比较大的噪声作用于周边的信号线上,引起设备的误动作 ,严重影响了对现场信号传输的实时性、精确性。 本文针对烧结混合配料系统的以上问题,设计开发了一套基于CAN总线的烧结配料监控系统。CAN总线通信与其他总线相比信号传输的快速实时性更高、抗干扰更强、可靠性更高,组网灵活从而保证配料精度和稳定性。   2  整体概述 2.1  整体概述 本烧结配料系统由1个PC机,1个主控制器和16
[嵌入式]
基于双51单片机的CAN总线中继器设计
引 言 CAN总线以其开发维护成本低、总线利用率高、传输距离远(最远可达10 km)、传输速率高(最高可达1 Mbps)使用户能组建稳定、高效的现场总线网络。CAN总线已被广泛应用到各个自动化控制系统中,例如汽车电子、自动控制、智能大厦、电力系统、安防监控等领域。随着CAN总线网络区域的扩大,2个节点之间的直接数据传输将难以满足远距离通信要求。CAN中继器是延长CAN总线通信距离的中转站,其通信效率和通信可靠性直接影响CAN总线的通信能力。传统的基于单MCU的CAN中继器难以满足大量数据的中转要求,本文基于双MCU设计高性能的CAN总线中继器。 1 系统总体设计 CY7C136是2 KB高速CMOS静态RAM。同一
[单片机]
基于双51单片机的<font color='red'>CAN</font><font color='red'>总线</font>中继器设计
CAN总线在安全监控系统传输中的应用
  1 引言        随着计算机网络的普及应用,人们从过去主要是对计算机监控系统监控功能的关注,转移到对其数据传输功能的关注。人们越来越重视数据的传输,人们希望通过互联网能在世界的任何角落及时观察到工业生产现场的各种状态数据。目前主要是基于Profibus总线的数据传输技术,虽然这种常规的传输技术具有相对结构简单、易于实现等优点,但是它有如下一些缺点不很适于作井下安全监控系统的传输总线。第一,它是主从结构,不能实现多主传输;第二,它的从节点都是固定地址,而且只能静态设置;第三,它的节点的加入不能随意动态进行;第四,它能够连接的节点数量末段最多32个,加中继的情况下也最多只能有三段,对于一些大矿,应用受到限制。相比之下
[嵌入式]
基于WinCE的CAN适配卡驱动程序的设计与实现
1 引言        WinCE是一种为多种嵌入式系统和产品设计的紧凑、高效、可升级的操作系统,WinCE 采用标准模式,其最主要的特征:为有限的硬件资源提供了多线程、多任务和完全优先级的计算环境。       WinCE操作系统支持两种类型的驱动程序:本地驱动程序(Build-In),是把设备驱动程序作为独立任务实现,直接在顶层任务中实现硬件操作,完成特有专用的驱动程序;流接口驱动程序,WinCE的I/O系统将设备程序作为内核过程实现,这种方式便于实现I/O子系统的层次模型,便于文件系统一起把设备作为特殊文件处理,提供统一的管理、统一的界面和统一的使用方法,并把设备、文件及网络通信组织成为一致的更高层次的抽象,为用户提供统一
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved