CAN总线的实现SJA1000实例.docx

上传人:b****5 文档编号:3978221 上传时间:2022-11-26 格式:DOCX 页数:12 大小:19.55KB
下载 相关 举报
CAN总线的实现SJA1000实例.docx_第1页
第1页 / 共12页
CAN总线的实现SJA1000实例.docx_第2页
第2页 / 共12页
CAN总线的实现SJA1000实例.docx_第3页
第3页 / 共12页
CAN总线的实现SJA1000实例.docx_第4页
第4页 / 共12页
CAN总线的实现SJA1000实例.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

CAN总线的实现SJA1000实例.docx

《CAN总线的实现SJA1000实例.docx》由会员分享,可在线阅读,更多相关《CAN总线的实现SJA1000实例.docx(12页珍藏版)》请在冰豆网上搜索。

CAN总线的实现SJA1000实例.docx

CAN总线的实现SJA1000实例

一、

以下是我做的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(0xc0);//Pelican

 if(s==1)return3;

 s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00); 

 if(s==1)return4;

 s=BCAN_SET_BANDRATE(CAN_BPS_1M);  

   if(s==1)return5;

   

 SJA_BCANAdr=REG_OCR;    

   *SJA_BCANAdr=0x1a;        

    SJA_BCANAdr=REG_IER;      

*SJA_BCANAdr=0x03;

    

 s=BCAN_SET_CONTROL(0x08);

 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_TxBuffer1;     

 *SJA_BCANAdr=BCAN_ACR0;       //写入参数

  

 SJA_BCANAdr=REG_TxBuffer2;

 *SJA_BCANAdr=BCAN_ACR1;

 SJA_BCANAdr=REG_TxBuffer3; 

 *SJA_BCANAdr=BCAN_ACR2;

  

 SJA_BCANAdr=REG_TxBuffer4;

 *SJA_BCANAdr=BCAN_ACR3; 

 

 //校验写入值

 if(*SJA_BCANAdr!

=BCAN_ACR3) return1;

  

 SJA_BCANAdr=REG_TxBuffer5;      

 *SJA_BCANAdr=BCAN_AMR0;   //写入参数

 

 SJA_BCANAdr=REG_TxBuffer6;        

 *SJA_BCANAdr=BCAN_AMR1;

 SJA_BCANAdr=REG_TxBuffer7;

 *SJA_BCANAdr=BCAN_AMR2;

 SJA_BCANAdr=REG_TxBuffer8;

 *SJA_BCANAdr=BCAN_AMR3;

 //校验写入值

 if(*SJA_BCANAdr!

=BCAN_AMR3)return1;

 return0;

}

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

;*函数原型:

 bitBCAN_SET_BANDRATE(unsignedcharCAN_ByteRate)      *

;*返回值:

                                                              *

;*          0;波特率设置成功                                         *

;*          1;波特率设置失败                                         *

;*                                                                     *

;*说明:

设置CAN控制器SJA1000通讯波特率.SJA1000的晶振必须为16MHz,        *

;*    其它晶体的频率的值的波特率,需自己计算。

该子程序只能用于       *

;*    复位模式                                                        * 

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

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+0x00 控制寄存器

 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=0xaa;    //写入测试值

   if(*SJA_BCANAdr==0xaa)

      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=0x01;                //置位复位请求

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

    return  0;

   else

     return  1;   

 }

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

**函数原型:

 voidex0_int(void)interrupt0//using1

**功   能:

 中断接收函数

**入口参数:

  无

**出口参数:

  RevceData[]数组  

**说   明:

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

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

voidex0_int(void)interrupt0//using1

unsignedchartt; 

 SJA_BCANAdr=REG_INTERRUPT;

 if((*SJA_BCANAdr)&0x01) //产生了接收中断

 { 

   SJA_BCANAdr=REG_RxBuffer1;

   tt=*SJA_BCANAdr;

    

    if((tt&0x40)!

=0x40)//数据帧  =为远程帧

      { 

memcpy(REG_RxBuffer6,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&0x08)==0)return 1;   //上次发送未完成

   if((temp&0x04)==0)return 2;   //发送缓冲区是否锁定

   if((temp&0x10)==0x10)return3; //判断是否正在接收  

   SJA_BCANAdr=REG_TxBuffer1;     //访问地址指向发送缓冲区1

   memcpy(SJA_BCANAdr,SendDataBuf,13);   

     BCAN_CMD_PRG(0x03);  

   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&0x20)==0)//判断是否正在发送

            return 0;

          else

            return 1;             

          break;

    case RRB_CMD:

                   

          SJA_BCANAdr=REG_STATUS;  //访问地址指向状态寄存器  

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

             return 1;

          else          

             return 0;              

          break; 

    case COS_CMD:

                  

          SJA_BCANAdr=REG_STATUS;   

          if((*SJA_BCANAdr&0x02)==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&0x40)==0x40) 

   { 

   Sja_1000_Init();

   send_char_(0xee);  

  }

    

  if(RECOK==1)

  { 

RECOK=0;

  SJA_BCANAdr=REG_STATUS;   

       temptt=*SJA_BCANAdr; 

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

{           

       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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1