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所示:
综合通信管理机通过双CAN网与各装置通信,然后再转换为串行方式与上位机通信。通信管理双CAN网同时接收各装置上传的数据,亦同时转发上位机下达的命令。各装置双CAN网切换方式为:装置不断检测上位机发送的握手帧,若在规定的时间未收到握手帧,则判断为通信故障,装置自动切换到另一网上运行。下面主要介绍通信管理机的双网切换过程。
硬件部分
本文采用PHILIPS公司生产的SJA1000来实现CAN总线切换功能。SJA1000 是一款完全符合CAN总线协议规定的独立CAN控制器, 用于汽车和一般工业环境中的控制器局域网络。它是PHILIPS半导体PCA82C200 CAN控制器的替代产品,不仅支持BasicCAN(CANBUS 2.0A)模式,同时还支持功能更强的PeilCAN(CANBUS 2.0B)模式。具有如下特性:
基于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总线技术的应用与发展
下一篇:CAN总线活动讲座一:写在CAN总线开发板助学之前
推荐阅读最新更新时间:2024-05-03 00:39
- 三星 Exynos 2600 芯片前景堪忧:良率挑战严峻,有被取消量产风险
- 苹果搁置反垄断报告的请求遭印度监管机构拒绝,案件将继续推进
- 2024年Automechanika Shanghai海量同期活动刷新历届记录,汇聚行业智慧,共谋未来发展
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 恩智浦发布首个超宽带无线电池管理系统解决方案
- 北交大本科生探秘泰克先进半导体开放实验室,亲历前沿高科技魅力
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 边缘 AI 如何提升日常体验
- 苹果要首发!台积电宣布2nm已准备就绪
- AMD有望用上全新芯片堆叠技术:延迟大幅减少、性能显著提升