打印

CAN总路线控制接口

[复制链接]
1872|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CAN,即控制器局域网,是国际上应用最广泛的现场总路线之一。最初,CAN被设计作为汽车环境中的微控制器通信,在车载各电子控制并转ECU之间交换信息,开成汽车电子控制网络。
CAN是一种多主方式的串行通信总路线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。
PCA82C00是一种适用于一般工业环境的控制器局域网的高度集成独立控制器,具有完成高性能的CAN通信协议所要求的全部必要特性。
单片机与CAN总路线接口控制器PCA82C00的连接电路图如下

程序
**************************************************************************
本文程序主要用于51单片机对CAN总线接口控制器PCA82C200的初始化设置,CAN控制器初始化程序,主要完成PCA82C200控制寄存器、命令寄存器、验收码寄存器等单元的参数设置,为通信模块进行数据收发做准备//
***************************************************************************
#define  CR      XBYTE   0x7F00                       //控制寄存器            
#define  CMR    XBYTE   0x 7F01                       //命令寄存器
#define  SR      XBYTE   0x 7F02                      //状态寄存器
#define  IR      XBYTE    0x 7F03                       //中断寄存器
#define  ACR    XBYTE    0x 7F04                       //验收寄存器
#define  AMR    XBYTE    0x 7F05                       //验收屏蔽寄存器
#define  BTR0   XBYTE    0x 7F06                       //总线定时寄存器0
#define  BTR1   XBYTE    0x 7F07                        //总线定时寄存器
#define  OCR    XBYTE    0x 7F08                      //输出控制寄存器
#define  RADD    XBYTE    0x 7F20

//CAN总线接口控制器PCA82C200初始化程序
void  iniat(coid)
  {
CR=0x1b;                          //写控制寄存器
ACR=0x01;                         //写验收寄存器
MCR=0xfe;                         写验收屏蔽寄存器
BTR0=0x00;                     //写总线定时期0
BTR1=0xb9;                     //写总线定时期1
OCR=0xaa;                      //写输出控制寄存器
CR=0x1a;                       //写控制寄存器
}
//外部中断0服务程序,用于读取CAN接口控制器中断
void  int0(void) interuupt 0 using 0
  {
Uchar  temp;data;
data=SR                      //读取中断状态
temp=data;
if((temp&&0x02)!=0)           判断是否接收中断   
     {
rflag=1;                     //是接收中断
}
if((temp&&0x04)!=0)           //判断是否数据超载中断
     {
overflag=1;                   //是数据超载中断
}
if((temp&&0x40)!=0)           //判断是否错误中断
     {
overflag=1;                   //是错误中断
}
  return ;                    //返回
}
//从PCA82C200的接收缓冲期0/1读取标识符、RTR位和数据长度码
void  reframe(void)
{
uchar  length
rlabel1=*RADD             //读取标识符
rlabel2=*( RADD+1)         //读取数据长度码
length=(rlabel&&0x0f);       //计算数据长度
for(i=0,i<length;i++)
    {
rbuf=*(RADD+0x02+i)    //读取并保存CAN接收缓冲器中的数据
}
}

相关帖子

沙发
拿起书本| | 2012-4-24 21:54 | 只看该作者
CAN在国外的发展相当迅速,奔驰S型轿车采用的就是CAN总线系统。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

482

主题

2214

帖子

11

粉丝