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

📄 sja_pelican.c

📁 参考周立功的basic模式的CAN通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
  }

  Sja_PeliCan  = REG_AcceptCode3;  	//访问地址指向验收代码寄存器(ACR4)
  *Sja_PeliCan = PCan_ACR3;        	//写入参数
  if ( *Sja_PeliCan != PCan_ACR3 ) 	//校验写入值
  {
    return  1; 
  }

  Sja_PeliCan  = REG_AcceptMask0;  	//访问地址指向验收屏蔽寄存器(AMR)
  *Sja_PeliCan = PCan_AMR0;        	//写入参数
  if ( *Sja_PeliCan != PCan_AMR0 ) 	//校验写入值
  {
    return  1; 
  }

  Sja_PeliCan  = REG_AcceptMask1;  	//访问地址指向验收屏蔽寄存器(AMR)
  *Sja_PeliCan = PCan_AMR1;        	//写入参数
  if ( *Sja_PeliCan != PCan_AMR1 ) 	//校验写入值
  {
    return  1; 
  }

  Sja_PeliCan  = REG_AcceptMask2;  	//访问地址指向验收屏蔽寄存器(AMR)
  *Sja_PeliCan = PCan_AMR2;        	//写入参数
  if ( *Sja_PeliCan != PCan_AMR2 ) 	//校验写入值
  {
    return  1; 
  }

  Sja_PeliCan  = REG_AcceptMask3;  	//访问地址指向验收屏蔽寄存器(AMR)
  *Sja_PeliCan = PCan_AMR3;        	//写入参数
  if ( *Sja_PeliCan != PCan_AMR3 ) 	//校验写入值
  {
    return  1; 
  }

  return    0;
}

/************************************************************************
;*函数原型: bit  PCan_Set_Outclk (unsigned char  PCan_OCR, 	            *
                                  unsigned char  PCan_CDR);             *
;*参数说明:										      					*
 *     PCan_OCR: 存放输出控制寄存器 (OC)  的参数设置                    *
 *     PCan_CDR: 存放时钟分频寄存器 (CDR) 的参数设置                    *
 *                                                                      *
;*返回值:                                                               *
;*           0 ;设置成功                                                *
;*           1 ;设置失败                                                *
;*                                                                      *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *
;************************************************************************/
bit  PCan_Set_OCR (unsigned char PCan_OCR)
{
  Sja_PeliCan  = REG_OCR;          	    //访问地址指向输出控制寄存器
  *Sja_PeliCan = PCan_OCR;      		//写入参数
  if ( *Sja_PeliCan != PCan_OCR )	    //校验写入值
  {
    return  1; 
  }
  return    0;
}
          
/************************************************************************
 *函数原型:  bit   PCan_Data_Send(unsigned char *SendDataBuf)           *
 *参数说明:  特定帧各式的数据                                           *
 *返回值:                                                               *
 *           0    ; 表示将数据成功的送至发送缓冲区                      *
 *           1	  ; 表示上一次的数据正在发送,                          *
 *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 *                ; 表示写入数据错误                                    * 
 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 *        SJA1000发送。                                                 *
 *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 *                                                                      *
 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 ************************************************************************/ 
 bit   PCan_Data_Send(unsigned char *SendDataBuf)
 {
   unsigned  char  TempCount;
   Sja_PeliCan = REG_STATUS;                //访问地址指向状态寄存器
   if ( (*Sja_PeliCan&0x08) == 0 )          //判断上次发送是否完成
   {
     return	1;
   }  

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

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

/************************************************************************
 *函数原型:  bit    PCan_Data_Recv (unsigned char *RcvDataBuf,          *
 *                                  unsigned char *ucBufLen)            *      
 *参数说明:  RcvDataBuf, 存放微处理器保存数据缓冲区                     *
 *返回值:    0; 接收成功                                                *
 *           1; 接收失败                                                * 
 *说明: CAN控制器接收数据,仅限于接收数据                                *
 ************************************************************************/
 bit    PCan_Data_Recv(unsigned char *RcvDataBuf, unsigned char *ucBufLen)
 {
   Sja_PeliCan = REG_STATUS;                   //访问地址指向状态寄存器
   if ( (*Sja_PeliCan&0x01) == 0 )             //判断报文是否有效
   {
      *ucBufLen = 0;
      return 1;
   }

   
   Sja_PeliCan = REG_RxFramInfo;
   RcvDataBuf[0]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer1;
   RcvDataBuf[1]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer2;
   RcvDataBuf[2]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer3;
   RcvDataBuf[3]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer4;
   RcvDataBuf[4]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer5;
   RcvDataBuf[5]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer6;
   RcvDataBuf[6]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer7;
   RcvDataBuf[7]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer8;
   RcvDataBuf[8]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer9;
   RcvDataBuf[9]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer10;
   RcvDataBuf[10]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer11;
   RcvDataBuf[11]  = *Sja_PeliCan;

   Sja_PeliCan = REG_RxBuffer12;
   RcvDataBuf[12]  = *Sja_PeliCan;

   *ucBufLen = 13;

   //if ( (*Sja_PeliCan&0x10) == 0 )             //如果是数据帧
   //{
   //*ucBufLen  = (*Sja_PeliCan&0x0f) + 2;     //计算报文中数据的个数
   //}
   //else
   //{
   //*ucBufLen = 2;
   // }
   //Sja_PeliCan = REG_RxBuffer1;                 //访问地址指向接收缓冲区1
   //memcpy(RcvDataBuf, Sja_PeliCan, *ucBufLen ); //读取接收缓冲区的报文

   return  0;
 }

/************************************************************************
 *函数原型:  bit  PCan_Cmd_Prg(unsigned char cmd)                       *
 *参数说明:  unsigned char cmd: sja1000运行的命令字                     *
 *           0x01: 发送请求                                             *
 *           0x02: 中止发送                                             *
 *           0x04: 释放接收缓冲区                                       *
 *           0x08: 清除超载状态                                         *
 *           0x10: 进入睡眠状态                                         *
 *                                                                      *
 *返回值:                                                               *
 *           0 ; 表示命令执行成功                                       *
 *           1 ; 表示命令执行失败                                       *
 *                                                                      * 
 *说明:      执行sja1000命令                                            * 
 ************************************************************************/ 
bit  PCan_Cmd_Prg(unsigned char cmd)
{
   Sja_PeliCan  = REG_COMMAND;        //访问地址指向命令寄存器
   *Sja_PeliCan = cmd;                //启动命令字
   switch ( cmd )
   {
   case  CMD_SEND:                    //发送请求命令
      return    0;
      break;

   case  CMD_ABORT_SEND:              //夭折发送命令 
      Sja_PeliCan = REG_STATUS;       //访问地址指向状态寄存器   
      if ( (*Sja_PeliCan & 0x20) ==0 )//判断是否正在发送
      {
         return  0;
      }
      else
      {
         return  1;
      }   
      break; 

   case  CMD_RELEASE_RXBUFF:           //释放接收缓冲区 
      Sja_PeliCan = REG_STATUS;        //访问地址指向状态寄存器   
      if ( (*Sja_PeliCan & 0x01) == 1 )//判断是否释放成功
      {
        return  1;
      }
      else
      {
        return  0;
      }   
      break; 
  
  case  CMD_CLEAR_OVER_STAT:           //清除超载状态
      Sja_PeliCan = REG_STATUS;        //访问地址指向状态寄存器   
      if((*Sja_PeliCan & 0x02) == 0 )  //判断清除超载是否成功
      {
        return  0;
      }
      else
      {
        return  1;
      }   
      break; 
  
  case  CMD_GOTO_SLEEP:                      //进入睡眠状态命令 
      return    0;
      break; 

  default:
      return  1;
      break; 
  }
}

⌨️ 快捷键说明

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