⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sja_bcanfunc.c

📁 独立的CAN 控制器SJA1000基本硬件头文件定义(BasicCAN 工作方式)
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************
 *函数原型: bit   BCAN_HW_INIT(unsigned char  BCAN_ACR,                 *
 *                             unsigned char  BCAN_AMR,                 *
 *                             unsigned char  Bus_Timing0,              *
 *                             unsigned char  Bus_Timing1,              *
 *                             unsigned char  Out_Control,              *
 *                             unsigned char  Clock_Out                 *
 *                            )                                         *
 *参数说明:                                                             *
 *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
 *    Bus_Timing0:存放总线定时0寄存器(BTR0)的参数设置                   *
 *    Bus_Timing1:存放总线定时1寄存器(BTR1)的参数设置                   *
 *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 *                                                                      *                        
 *返回值:                                                               *
 *           0 ; 表示初始化成功                                         *
 *           1 ; 表示初始化失败                                         *
 *                                                                      * 
 *说明:CAN控制器的初始化只能在复位模式下才能完成。初始化操作之前请先进入*
 *     到复位操作模式,并将要初始化的各参数的值按数据手册中的计算方法,正 *
 *     确的按实际需要计算好参数后,将参数写入对应的寄存器 。            *
 *注: 为了CAN控制器的正确运行,请务必仔细的阅读SJA1000的数据手册       *
 *                                                                      *
 *示例:设应用系统中晶体频率16MHZ,节点只接收ID(标志符)高八位为        *
 *      '10101010'的消息,系统波特率为50Kbit/s,关闭CLKOUT输出。         *
 *      则根据数据手册中的计算方法的各参数如下:                        *
 *      ACR==0AAH,AMR==00H,BTR0==0C9H,BTR1==0C9H,OC==0FFH,CDR=48H       *
 * 则调用本函数为:                                                     *
 *     BCAN_HW_INIT(0xaa,0x00,0xc9,0xc9,0xff,0x48)                      *                     
 ************************************************************************
 bit             BCAN_HW_INIT(unsigned char  BCAN_ACR,       
                              unsigned char  BCAN_AMR,      
                              unsigned char  Bus_Timing0,   
                              unsigned char  Bus_Timing1,   
                              unsigned char  Out_Control,    
                              unsigned char  Clock_Out      
                              ) 
{
  SJA_BCANAdr=REG_ACR;          //访问地址指向验收代码寄存器(ACR)
  *SJA_BCANAdr=BCAN_ACR;        //写入参数
  if(*SJA_BCANAdr != BCAN_ACR)  //校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_AMR;          //访问地址指向验收屏蔽寄存器(AMR)
  *SJA_BCANAdr=BCAN_AMR;        //写入参数
  if(*SJA_BCANAdr != BCAN_AMR)  //校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_BTR0;          //访问地址指向总线定时寄存器0
  *SJA_BCANAdr=Bus_Timing0;      //写入参数
  if(*SJA_BCANAdr != Bus_Timing0)//校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_BTR1;          //访问地址指向总线定时寄存器0
  *SJA_BCANAdr=Bus_Timing1;      //写入参数
  if(*SJA_BCANAdr != Bus_Timing1)//校验写入值
  {
    return  1; 
  }
  SJA_BCANAdr=REG_OCR ;          //访问地址指向输出控制寄存器
  *SJA_BCANAdr=Out_Control;      //写入参数
  if(*SJA_BCANAdr != Out_Control)//校验写入值
  {
    return  1; 
  } 
  SJA_BCANAdr=REG_CDR;          //访问地址指向输出控制寄存器
  *SJA_BCANAdr=Clock_Out;        //写入参数
  return    0;
}                         

/************************************************************************
 *函数原型:  bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
 *参数说明:  特定帧各式的数据?                                         *
 *返回值:                                                               *
 *           0    ; 表示将数据成功的送至发送缓冲区                      *
 *           1	  ; 表示上一次的数据正在发送,                          *
 *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 *                ; 表示写入数据错误                                    * 
 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 *        SJA1000发送。                                                 *
 *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 *                                                                      *
 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 ************************************************************************/ 
 bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)
 {
   unsigned  char  TempCount;
   SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
   if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
   {
    return	1;
   }  

   if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
   {
     return	1;
   }  
 
   SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
   if((SendDataBuf[1]&0x10)==0)        //判断RTR,从而得出是数据帧还是远程帧
   { 
     TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
   }

   else
   {
     TempCount =2;                     //远程帧
   }

  memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
   return 0;
}

/************************************************************************
 *函数原型:  bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf);       *
 *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 *返回值:    0;接收成功                                                 *
 *           1;接收失败                                                 * 
 *说明:CAN控制器接收数据,仅限于接收数据                                 *
 ************************************************************************/
 bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
 {
   unsigned  char  TempCount; 
   SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
   if((*SJA_BCANAdr&0x01)==0)               //判断报文是否有效
   {
      return 1;
   }
   
   SJA_BCANAdr = REG_RxBuffer2;             //访问地址指向接收缓冲区2
   if((*SJA_BCANAdr&0x10)==0)               //如果是数据帧
   {
     TempCount=(*SJA_BCANAdr&0x0f)+2;       //计算报文中数据的个数
   }
   
   else
   {
    TempCount=2;
   }
   SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区1
   memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
   return  0;
 }

/************************************************************************
 *函数原型:  bit  BCAN_CMD_PRG(unsigned char cmd)             *
 *参数说明:  cmd:sja1000运行的命令字                                    *
 *             01:发送请求                                              *
 *             02:中止发送                                             *
 *             04:释放接收缓冲区                                       *
 *             08:清除超载状态                                         *
 *             0x10:进入睡眠状态                                        *
 *                                                                      *
 *返回值:                                                               *
 *           0 ; 表示命令执行成功                                       *
 *           1 ; 表示命令执行失败                                       *
 *                                                                      * 
 *说明:      执行sja1000命令                                            * 
 ************************************************************************/ 
 bit  BCAN_CMD_PRG(unsigned char cmd)
 {
   SJA_BCANAdr=REG_COMMAND;            //访问地址指向命令寄存器
   *SJA_BCANAdr=cmd;                   //启动命令字
   switch(cmd)
   {
     case  TR_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; 
     
     case  GTS_CMD:                    //进入睡眠状态命令 
           return    0;
           break; 
     default:
             return  1;
             break; 
   }

 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -