CAN总线的实现-SJA1000实例_第1页
CAN总线的实现-SJA1000实例_第2页
CAN总线的实现-SJA1000实例_第3页
CAN总线的实现-SJA1000实例_第4页
CAN总线的实现-SJA1000实例_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.一、以下是我做的CAN节点的测试程序,实现两个节点传送数据,程序主要分三局部SJA1000的初始化,接收数据,发送数据./****************************************************

**函数原型:

bitSja_1000_Init(void)

**功

能:

初始化SJA10000

**入口参数:

**返回值:

0:初始化成功

1:复位失败

2:

测试sja1000失败

3:设置失败

4:设置验收滤波器失败

5:设置波特率失败

*****************************************************/unsignedcharSja_1000_Init(void)

{

bits;

EA=0;

s=BCAN_ENTER_RETMODEL();

if(s==1)return1;

s=BCAN_CREATE_COMMUNATION();

if(s==1)return2;

s=BCAN_SET_OUTCLK(0*c0);//Pelican

if(s==1)return3;

s=BCAN_SET_OBJECT(0*FF,0*4E,0*16,0*00,0*ff,0*00,0*00,0*00);

if(s==1)return4;

s=BCAN_SET_BANDRATE(CAN_BPS_1M);

if(s==1)return5;

SJA_BCANAdr=REG_OCR;

*SJA_BCANAdr=0*1a;

SJA_BCANAdr=REG_IER;

*SJA_BCANAdr=0*03;

s=BCAN_SET_CONTROL(0*08);

if(s==1)return6;EA=1;

return0;

}}

/********************************************************************

*函数原型:bitBCAN_SET_OUTCLK(unsignedcharClock_Out)

*

*参数说明:

*

*

Clock_Out:存放时钟分频存放器(CDR)的参数设置

*

*返回值:

*

*

0;设置成功

*

*

1;设置失败

*

*说明:设置SJA1000的时钟分频。该子程序只能用于复位模式

*******************************************************************/

bitBCAN_SET_OUTCLK(unsignedcharClock_Out)

{

SJA_BCANAdr=REG_CDR;

*SJA_BCANAdr=Clock_Out;

if(*SJA_BCANAdr!=Clock_Out)

return1;

else

return0;

}/********************************************************************

*函数原型:bitBCAN_SET_OBJECT(unsignedchar

BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,

BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3

)

*参数说明:

*

*

BCAN_ACR(0-3):存放验收代码存放器〔ACR〕的参数设置

*

*

BCAN_AMR(0-3):存放接收屏蔽存放器〔AMR〕的参数设置

*

*返回值:

*

*

0;设置成功

*

*

1;设置失败

*

*说明:设置CAN节点的通讯对象,允许接收的报文,是由AMR和ACR共同决定的.

*

********************************************************************/

bitBCAN_SET_OBJECT(unsignedchar

BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3)

{

SJA_BCANAdr=REG_T*Buffer1;

*SJA_BCANAdr=BCAN_ACR0;

//写入参数

SJA_BCANAdr=REG_T*Buffer2;

*SJA_BCANAdr=BCAN_ACR1;

SJA_BCANAdr=REG_T*Buffer3;

*SJA_BCANAdr=BCAN_ACR2;

SJA_BCANAdr=REG_T*Buffer4;

*SJA_BCANAdr=BCAN_ACR3;

//校验写入值

if(*SJA_BCANAdr!=BCAN_ACR3)

return1;

SJA_BCANAdr=REG_T*Buffer5;

*SJA_BCANAdr=BCAN_AMR0;

//写入参数

SJA_BCANAdr=REG_T*Buffer6;

*SJA_BCANAdr=BCAN_AMR1;

SJA_BCANAdr=REG_T*Buffer7;

*SJA_BCANAdr=BCAN_AMR2;

SJA_BCANAdr=REG_T*Buffer8;

*SJA_BCANAdr=BCAN_AMR3;

//校验写入值

if(*SJA_BCANAdr!=BCAN_AMR3)return1;

return0;

}Hz,

*

;*

其它晶体的频率的值的波特率,需自己计算。该子程序只能用于

*

;*

复位模式

*

;******************************************************************/

bitBCAN_SET_BANDRATE(unsignedintCAN_ByteRate)

{

//将波特率的的预设值装入sja1000的总线定时器

SJA_BCANAdr=REG_BTR0;

*SJA_BCANAdr=CAN_ByteRate>>8;

//取CAN_ByteRate的高8位写入写入参数

//校验写入值

if(*SJA_BCANAdr!=(CAN_ByteRate>>8))return1;

SJA_BCANAdr=REG_BTR1;

*SJA_BCANAdr=CAN_ByteRate;

//校验写入值

if(*SJA_BCANAdr!=CAN_ByteRate)return1;

return0;

}

/********************************************************************

*函数原型:bitBCAN_SET_CONTROL(unsigendcharCMD)

*

*参数说明:设置控制存放器

*

*******************************************************************/

bitBCAN_SET_CONTROL(unsignedcharCMD)

{

unsignedcharTempData;

SJA_BCANAdr=REG_CONTROL;

//SJA_BaseAdr+0*00

控制存放器

TempData=

*SJA_BCANAdr;

*SJA_BCANAdr=CMD;

if(*SJA_BCANAdr==CMD)

return0;

else

return1;}

/********************************************************************

*函数原型:

bit

BCAN_CREATE_COMMUNATION(void)

*

*参数说明:

*

*返回值:

*

*

0;表示SJA1000接口正常

*

*

1;表示SJA1000与处理器接口不正常

*

*说明:该函数用于检测CAN控制器的接口是否正常

*

*******************************************************************/

bitBCAN_CREATE_COMMUNATION(void)

{

SJA_BCANAdr=REG_TEST;

*SJA_BCANAdr=0*aa;

//写入测试值

if(*SJA_BCANAdr==0*aa)

return0;

//读测试正确

else

return1;

}

/******************************************************************

*函数原型:

bit

BCAN_ENTER_RETMODEL(void)

*

*参数说明:

*

*返回值:

*

*

0;表示成功进入复位工作模式

*

*

1;表示不能进入复位工作模式

*

*

*

*说明:

CAN控制器进入复位工作模式

*

*******************************************************************/

bit

BCAN_ENTER_RETMODEL(void)

//置位复位请求

{

unsigned

char

TempData;

SJA_BCANAdr

=REG_CONTROL;

TempData=

*SJA_BCANAdr;

*SJA_BCANAdr=0*01;

//置位复位请求

if((*SJA_BCANAdr&0*01)==1)

return

0;

else

return

1;

}/****************************************************

**函数原型:

voide*0_int(void)interrupt0//using1

**功

能:

中断接收函数

**入口参数:

**出口参数:

RevceData[]数组

**说

明:

当sja1000收到正确的报文时,会产生int中断

*****************************************************/

voide*0_int(void)interrupt0//using1

{

unsignedchartt;

SJA_BCANAdr=REG_INTERRUPT;

if((*SJA_BCANAdr)&0*01)

//产生了接收中断

{

SJA_BCANAdr=REG_R*Buffer1;

tt=*SJA_BCANAdr;

if((tt&0*40)!=0*40)//数据帧

=为远程帧

{

memcpy(REG_R*Buffer6,RevceData,8);

send_char_(RevceData[1]);//以下代码是发送到串口

send_char_(RevceData[2]);

send_char_(RevceData[3]);

send_char_(RevceData[4]);

send_char_(RevceData[5]);

send_char_(RevceData[6]);

send_char_(RevceData[7]);

send_char_(RevceData[8]);

}

BCAN_CMD_PRG(4);//释放SJA1000接收缓冲区

}

}

unsignedcharBCAN_DATA_WRITE(unsignedchar*SendDataBuf)

{

unsignedchartemp;

SJA_BCANAdr=REG_STATUS;

temp=*SJA_BCANAdr;

if((temp&0*08)==0)return

1;

//上次发送未完成

if((temp&0*04)==0)return

2;

//发送缓冲区是否锁定

if((temp&0*10)==0*10)return3;

//判断是否正在接收

SJA_BCANAdr=REG_T*Buffer1;

//访问地址指向发送缓冲区1

memcpy(SJA_BCANAdr,SendDataBuf,13);

BCAN_CMD_PRG(0*03);

return0;

}

bit

BCAN_CMD_PRG(unsignedcharcmd)

{

SJA_BCANAdr=REG_COMMAND;

//访问地址指向命令存放器

*SJA_BCANAdr=cmd;

//启动命令字

switch(cmd)

{

case

TR_CMD:

return

0;

break;

case

SRR_CMD:

return

0;

break;

case

AT_CMD:

SJA_BCANAdr=REG_STATUS;

//访问地址指向状态存放器

if((*SJA_BCANAdr&0*20)==0)//判断是否正在发送

return

0;

else

return

1;

break;

case

RRB_CMD:

SJA_BCANAdr=REG_STATUS;

//访问地址指向状态存放器

if((*SJA_BCANAdr&0*01)==1)

return

1;

else

return

0;

break;

case

COS_CMD:

SJA_BCANAdr=REG_STATUS;

if((*SJA_BCANAdr&0*02)==0)//判断去除超载是否成功

return

0;

else

return

1;

break;

default:

return

1;

break;

}

}主程序局部:voidmain(void)

{

unsignedchartemptt,ss;

CS=0;

Init_Cpu();

EA=0;

//initializeSja1000

ss=Sja_1000_Init();

if(ss!=0)//初始化失败

send_string_("initfail!");

else

EA=1;//初始化成功,开中断

RECOK=0;

send_data[0]=Send_CAN_Info_ID[0];

send_data[1]=Send_CAN_Info_ID[1];

send_data[2]=Send_CAN_Info_ID[2];

send_data[3]=Send_CAN_Info_ID[3];

send_data[4]=Send_CAN_Info_ID[4];

while(1)

{

SJA_BCANAdr=REG_STATUS;

temptt=*SJA_BCANAdr;

if((temptt&0*40)==0*40)

{

Sja_1000_Init();

send_char_(0*ee);

}

if(RECOK==1)

{

RECOK=0;

SJA_BCANAdr=REG_STATUS;

temptt=*SJA_BCANAdr;

if((temptt&0*04)==0*04)//可以向发送缓冲器写数据

{

send_data[5]=Com_RecBuff[0];

send_data[6]=Com_RecBuff[1];

send_data[7]=Com_RecBuff[2];

send_data[8]=Com_RecBuff[3];

send_data[9]=Com_RecBuff[4];

send_data[10]=Com_RecBuff[5];

send_data[11]=Com_RecBuff[6];

send_data[12]=Com_RecBuff[7];

ss=BCAN_DATA_WRITE(send_data);

if(ss==0)

//发送正常

send_char_(0*11);

else

{

send_char_(0*FF);

send_char_(ss);

SJA_BCANAdr=REG_ECC;

send_char_(*SJA_BCANAdr);

}

}

}}

}二、can总线通讯程序〔c〕

sja1000nnyt原创经典,如需更多帮助,请联系我:(短信联系,QQ详谈)QQ:531706356Email:nnyttom.本人同时提供can实验开发板给初学者1CAN控制器为SJA1000,驱动器为TJA1050,电源隔离;2提供详尽的源程序,可根据用户需求编写程序#include<REG52.H>//单片机头文件#include<SJA_nnyt_BCANCONF.H>//SJA存储器定义头文件#include<SJA_nnyt_BCANFUNC.C>//SJA子程序文件/*************************函数声明*******************************/voidInit_T0(void);//初始化单片机T0voidSja_1000_Init(void);//初始化SJA//*******************************************************************bitflag_sec;//发送命令标志unsignedchardatasend_data[10],rcv_data[10];//发送和接收数组unsignedcharsec_data,second;//定时器记数变量,发送数据变量unsignedchardataTmod_data;//定时器T0工作方式变量unsignedcharbdataflag_init;//中断存放器数据保存变量sbitrcv_flag=flag_init^0;//接收中断标志sbiterr_flag=flag_init^2;//错误中断标志sbitP2_0=P2^0;sbitP3_4=P3^4;sbitLED=P3^5;//指示灯//***********************************************************voide*0_int(void)interrupt0using1//外部中断0{ SJA_BCANAdr=REG_INTERRUPT;//指针指向中断存放器 flag_init=*SJA_BCANAdr;//保持中断存放器值}//***********************************************************voidT0_int(void)interrupt1using2//定时器T0中断效劳子程序{ TR0=0;//关闭定时器T0 sec_data--;//秒计时变量减一秒时间到了吗" { sec_data=0*50;//重新赋值 TH0=0*80; TL0=0*60; flag_sec=1;//设置标志位 second++;//发送的数据加一 } TR0=1;//启动定时器T0}//************************************************************voidInit_T0(void)//初始化定时器0{Tmod_data=TMOD;Tmod_data&=0*f0;Tmod_data|=0*01;TMOD=Tmod_data;//定时器T0工作方式设置TH0=0*80;TL0=0*60;//定时器T0初值设置TR0=1;//开放定时器T0sec_data=0*20;//记数值设置second=0*00;//发送数据初始化清零}//***********************************************************voidSja_1000_Init(void){ BCAN_ENTER_RETMODEL();//进入复位 BCAN_SET_BANDRATE(0*0b);//800K BCAN_SET_OBJECT(0*aa,0*ff);//设置地址ID:557 BCAN_SET_OUTCLK(0*aa,0*48);//设置输出方式,制止COLOCKOUT输出 BCAN_QUIT_RETMODEL();//退出复位模式 SJA_BCANAdr=REG_CONTROL;//地址指针指向控制存放器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论