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接收缓冲器中的数据
}
} |