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

📄 can_gps.c

📁 单片机和GPS接收机构成的车载卫星定位系统
💻 C
📖 第 1 页 / 共 4 页
字号:
   return 0;
}

/************************************************************************
 *函数原型:  bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf);       *
 *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 *返回值:    0;接收成功                                                 *
 *           1;接收失败                                                 *
 *说明:CAN控制器接收数据,仅限于接收数据                                 *
 ************************************************************************/
bit BCAN_DATA_RECEIVE(uchar data *RvcDataBuf)
 {
   uchar  TempCount;
   RvcDataBuf++;
   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
   SystemBuf[0]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer2;
   SystemBuf[1]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer3;
   SystemBuf[2]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer4;
   SystemBuf[3]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer5;
   SystemBuf[4]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer6;
   SystemBuf[5]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer7;
   SystemBuf[6]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer8;
   SystemBuf[7]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer9;
   SystemBuf[8]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer10;
   SystemBuf[9]=*SJA_BCANAdr;
   //memcpy(RvcDataBuf,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;
   }

 }
/************************************************************************
 *函数原型:  void InitialCAN()                                          *
 *参数说明:                                                             *
 *																		*
 *返回值:                                                               *
 *说明:      初始化Can总线                                              *
 ************************************************************************/
void InitialCAN()
{
     SJA_reset=0;
     delay(100);
     SJA_reset=1;
     SJA_BCANAdr=REG_CONTROL;                      //设置控制寄存器
     *SJA_BCANAdr=0x02;                            //接收中断使能
     do{;}while(BCAN_ENTER_RETMODEL());            //进入复位模式
     do{;}while(BCAN_CREATE_COMMUNATION());        //建立连接
     do{;}while(BCAN_SET_BANDRATE());              //设置BTR0,BTR1,配置波特率
     do{;}while(BCAN_SET_OBJECT(0x01,0x00));       //设置验收代码寄存器ACR,验收屏蔽寄存器AMR,
                                                   //自身节点ID号为00000000!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     do{;}while(BCAN_SET_OUTCLK(0xda,0x08));       //设置输出控制寄存器OC,时钟分频器CDR
     do{;}while(BCAN_QUIT_RETMODEL());             //进入工作模式
}
/************************************************************************
 *函数原型:  void send_StartorEnd(uchar num,bit SorE,unsigned short CRC)*
 *参数说明:  num  传送的数据量                                          *
 *			 SorE 1:开始帧  0:结束帧									*
 *返回值:                                                               *
 *说明:      向总线发送数据起始帧或停止帧                               *
 ************************************************************************/
void send_StartorEnd(uchar num,bit SorE,unsigned short CRC)
{  uchar CRCH,CRCL;
   CRCL=CRC;
   CRCH=CRC>>8;
   if(SorE)				
	 {//1:开始帧					
     SendBuf[0]=0x00;   
     SendBuf[1]=0x08;
     SendBuf[2]='S';    //Start
     SendBuf[3]='T';
     SendBuf[4]='A';
     SendBuf[5]='R';      
     SendBuf[6]='T';
	 SendBuf[7]=num;      
     SendBuf[8]=CRCH;   //校验码高8位
     SendBuf[9]=CRCL;   //校验码低8位
	 }
   else
     {//0:结束帧					
	 SendBuf[0]=0x00;   
     SendBuf[1]=0x08;
     SendBuf[2]='F';    //Final
     SendBuf[3]='I';
     SendBuf[4]='N';
     SendBuf[5]='A';      
     SendBuf[6]='L';   
	 SendBuf[7]=num;     
     SendBuf[8]=CRCH;   //校验码高8位
     SendBuf[9]=CRCL;   //校验码低8位
	 }
     BCAN_DATA_WRITE(SendBuf);
     BCAN_CMD_PRG(TR_CMD);
}
/************************************************************************
 *函数原型:  void request_data(uchar *sendbuff,uchar num)               *
 *参数说明:                                                             *
 *																		*
 *返回值:                                                               *
 *说明:      向总线发送数据                                             *
 ************************************************************************/
void request_data(uchar *sendbuff,uchar num)
{	 uchar i,j;
     unsigned short CRC;
     green=0;           //发送指示 
	 j=num%8;
	 if(j)j=num/8;
	 else j=num/8+1;

	 //开始帧
	 send_StartorEnd(num,1,CRC);
	 //数据帧 
	 SendBuf[0]=0x00;   
     SendBuf[1]=0x08;	
	 while(j)
	     {
		  for(i=2;i<10;i++){SendBuf[i]=*sendbuff++;}
		  BCAN_DATA_WRITE(SendBuf);
          BCAN_CMD_PRG(TR_CMD);
		  delay(10);
		  j--; 
		  }
     //结束帧 
	 send_StartorEnd(num,0,CRC);
}
/*************************************************************/
/********************** keys *********************************/
/*************************************************************/
uchar keys(void)
 {
 uchar temp;

  return temp;
 }
/*************************************************************/
/********************** 24c256 *******************************/
/*************************************************************/
//start
void start24(void)
{
SDA24=1;
SCL24=1;
cnop24=0;
cnop24=0;
SDA24=0;
cnop24=0;
cnop24=0;
SCL24=0;
cnop24=0;
}
//stop24
void stop24(void)
{
SDA24=0;
SCL24=1;
cnop24=0;
cnop24=0;
SDA24=1;
cnop24=0;
cnop24=0;
SCL24=0;
cnop24=0;
}
//send answer
void tack24(void)
{
SDA24=0;
SCL24=1;
cnop24=0;
cnop24=0;
SCL24=0;
SDA24=1;
}
//check answer
bit get_ACK24(void)
{
SDA24=1;
SCL24=1;
cnop24=0;
cnop24=0;
ACK24=SDA24;
SCL24=0;
cnop24=0;
return ACK24;
}
void wrbyt24(uchar ch)
{
data uchar i;
ab=ch;
for(i=0;i<8;i++){
   SDA24=abit7;
   ab<<=1;
   SCL24=1;
   cnop24=0;
   cnop24=0;
   SCL24=0;
   SDA24=0;
   }
}
//receive a byte
uchar rdbyt24(void)
{
data uchar i;
for(i=0;i<8;i++){
    SDA24=1;
    SCL24=1;
    ab<<=1;
    abit0=SDA24;
    SCL24=0;
    }
return ab;
}
void write_abyte24(uint loc,uchar ch,uchar aa)
{
data uchar i;
bit flag;
stop24();
flag=1; i=0;
while(flag){
     i++; if(i>250)return;;
     start24();
     wrbyt24(aa);
     flag=get_ACK24();
     if(flag)stop24();
     }
i=loc>>8;
wrbyt24(i);
get_ACK24();
i=loc;
wrbyt24(i);
get_ACK24();
wrbyt24(ch);
get_ACK24();
stop24();
}
void write_nbyte24(uint loc,uchar *p,uchar aa)
{
data uchar i,*p1;
bit flag;
p1=p;
stop24();
flag=1; i=0;
while(flag){
     i++; if(i>250)return;;
     start24();
     wrbyt24(aa);
     flag=get_ACK24();
     if(flag)stop24();
     }
i=loc>>8;    //先送高字节
wrbyt24(i);
get_ACK24();
i=loc;
wrbyt24(i);  //再送低字节
get_ACK24();
for(i=0;i<64;i++)  //一页写的字节个数 64个

⌨️ 快捷键说明

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