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

📄 can_gps.lst

📁 单片机和GPS接收机构成的车载卫星定位系统
💻 LST
📖 第 1 页 / 共 5 页
字号:
 237   1        {
 238   2          return  1;
 239   2        }
 240   1      
C51 COMPILER V8.05a   CAN_GPS                                                              06/20/2008 15:11:44 PAGE 5   

 241   1        return    0;
 242   1      }
 243          
 244          
 245          /************************************************************************
 246          ;*函数原型:    BCAN_SET_OBJECT                                          *
 247          *参数说明:                                                              *
 248           *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 249           *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
 250          ;*返回值:                                                               *
 251          ;*           0 ;通信对象设置成功                                        *
 252          ;*           1 ;通信对象设置失败                                        *
 253          ;*                                                                      *
 254          ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
 255          ;*     允许接收的报文,是由AMR和ACR共同决定的.                           *
 256          ;*    满足以下条件的ID号的报文才可以被接收                              *
 257          ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
 258          ;*    该子程序只能用于复位模式                                          *                                 
             -                                                                                    *
 259          ;************************************************************************/
 260          bit    BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
 261          {
 262   1         SJA_BCANAdr=REG_ACR;                         //访问地址指向验收代码寄存器(ACR)
 263   1        *SJA_BCANAdr=BCAN_ACR;                        //写入参数
 264   1        if(*SJA_BCANAdr != BCAN_ACR)                  //校验写入值
 265   1        {
 266   2          return  1;
 267   2        }
 268   1        SJA_BCANAdr=REG_AMR;                          //访问地址指向验收屏蔽寄存器(AMR)
 269   1        *SJA_BCANAdr=BCAN_AMR;                        //写入参数
 270   1        if(*SJA_BCANAdr != BCAN_AMR)                  //校验写入值
 271   1        {
 272   2          return  1;
 273   2        }
 274   1      
 275   1        return    0;
 276   1      }
 277          
 278          /************************************************************************
 279          ;*函数原型: bit  BCAN_SET_OUTCLK (unsigned char Out_Control,            *
 280                                            unsigned char  Clock_Out);            *
 281          ;*参数说明:                                                                                                                     *
 282           *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 283           *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 284           *                                                                      *
 285          ;*返回值:                                                               *
 286          ;*           0 ;设置成功                                                *
 287          ;*           1 ;设置失败                                                *
 288          ;*                                                                      *
 289          ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                 
             -                                                                                    *
 290          ;************************************************************************/
 291          bit  BCAN_SET_OUTCLK (unsigned char Out_Control,
 292                               unsigned char  Clock_Out)
 293          {
 294   1        SJA_BCANAdr=REG_OCR ;                         //访问地址指向输出控制寄存器
 295   1        *SJA_BCANAdr=Out_Control;                     //写入参数
 296   1        if(*SJA_BCANAdr != Out_Control)               //校验写入值
 297   1        {
 298   2          return  1;
 299   2        }
 300   1        SJA_BCANAdr=REG_CDR;                          //访问地址指向输出控制寄存器
C51 COMPILER V8.05a   CAN_GPS                                                              06/20/2008 15:11:44 PAGE 6   

 301   1        *SJA_BCANAdr=Clock_Out;                       //写入参数
 302   1        return    0;
 303   1      }
 304          /************************************************************************
 305           *函数原型:  bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
 306           *参数说明:  特定帧各式的数据?                                         *
 307           *返回值:                                                               *
 308           *           0    ; 表示将数据成功的送至发送缓冲区                      *
 309           *           1    ; 表示上一次的数据正在发送,                          *
 310           *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 311           *                ; 表示写入数据错误                                    *
 312           *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 313           *        SJA1000发送。                                                 *
 314           *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 315           *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 316           *                                                                      *
 317           *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 318           *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 319           ************************************************************************/
 320           bit   BCAN_DATA_WRITE(unsigned char data *SendDataBuf)
 321           {
 322   1         unsigned  char  TempCount;
 323   1         SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
 324   1         if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
 325   1         {
 326   2          return      1;
 327   2         }
 328   1      
 329   1         if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
 330   1         {
 331   2           return     1;
 332   2         }
 333   1      
 334   1         SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
 335   1         if((SendDataBuf[1]&0x10)==0)        //判断RTR,从而得出是数据帧还是远程帧
 336   1         {
 337   2           TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
 338   2         }
 339   1      
 340   1         else
 341   1         {
 342   2           TempCount =2;                     //远程帧
 343   2         }
 344   1      
 345   1        memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
 346   1         return 0;
 347   1      }
 348          
 349          /************************************************************************
 350           *函数原型:  bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf);       *
 351           *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 352           *返回值:    0;接收成功                                                 *
 353           *           1;接收失败                                                 *
 354           *说明:CAN控制器接收数据,仅限于接收数据                                 *
 355           ************************************************************************/
 356          bit BCAN_DATA_RECEIVE(uchar data *RvcDataBuf)
 357           {
 358   1         uchar  TempCount;
 359   1         RvcDataBuf++;
 360   1         SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
 361   1         if((*SJA_BCANAdr&0x01)==0)               //判断报文是否有效
 362   1         {
C51 COMPILER V8.05a   CAN_GPS                                                              06/20/2008 15:11:44 PAGE 7   

 363   2           return 1;
 364   2         }
 365   1      
 366   1         SJA_BCANAdr = REG_RxBuffer2;             //访问地址指向接收缓冲区2
 367   1         if((*SJA_BCANAdr&0x10)==0)               //如果是数据帧
 368   1         {
 369   2           TempCount=(*SJA_BCANAdr&0x0f)+2;       //计算报文中数据的个数
 370   2         }
 371   1      
 372   1         else
 373   1         {
 374   2          TempCount=2;
 375   2         }
 376   1         SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区1
 377   1         SystemBuf[0]=*SJA_BCANAdr;
 378   1         SJA_BCANAdr = REG_RxBuffer2;
 379   1         SystemBuf[1]=*SJA_BCANAdr;
 380   1         SJA_BCANAdr = REG_RxBuffer3;
 381   1         SystemBuf[2]=*SJA_BCANAdr;
 382   1         SJA_BCANAdr = REG_RxBuffer4;
 383   1         SystemBuf[3]=*SJA_BCANAdr;
 384   1         SJA_BCANAdr = REG_RxBuffer5;
 385   1         SystemBuf[4]=*SJA_BCANAdr;
 386   1         SJA_BCANAdr = REG_RxBuffer6;
 387   1         SystemBuf[5]=*SJA_BCANAdr;
 388   1         SJA_BCANAdr = REG_RxBuffer7;
 389   1         SystemBuf[6]=*SJA_BCANAdr;
 390   1         SJA_BCANAdr = REG_RxBuffer8;
 391   1         SystemBuf[7]=*SJA_BCANAdr;
 392   1         SJA_BCANAdr = REG_RxBuffer9;
 393   1         SystemBuf[8]=*SJA_BCANAdr;
 394   1         SJA_BCANAdr = REG_RxBuffer10;
 395   1         SystemBuf[9]=*SJA_BCANAdr;
 396   1         //memcpy(RvcDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文???????????????????
 397   1         return  0;
 398   1       }
 399          /************************************************************************
 400           *函数原型:  bit  BCAN_CMD_PRG(unsigned char cmd)             *
 401           *参数说明:  cmd:sja1000运行的命令字                                    *
 402           *             01:发送请求                                              *
 403           *             02:中止发送                                             *
 404           *             04:释放接收缓冲区                                       *
 405           *             08:清除超载状态                                         *
 406           *             0x10:进入睡眠状态                                        *
 407           *                                                                      *
 408           *返回值:                                                               *
 409           *           0 ; 表示命令执行成功                                       *
 410           *           1 ; 表示命令执行失败                                       *
 411           *                                                                      *
 412           *说明:      执行sja1000命令                                            *
 413           ************************************************************************/
 414           bit  BCAN_CMD_PRG(unsigned char cmd)
 415           {
 416   1         SJA_BCANAdr=REG_COMMAND;            //访问地址指向命令寄存器
 417   1         *SJA_BCANAdr=cmd;                   //启动命令字
 418   1         switch(cmd)
 419   1         {
 420   2           case  TR_CMD:                     //发送请求命令
 421   2                 return    0;
 422   2                 break;
 423   2           case  AT_CMD:                     //中止发送命令
 424   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器
C51 COMPILER V8.05a   CAN_GPS                                                              06/20/2008 15:11:44 PAGE 8   

 425   2                 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
 426   2                 {
 427   3                    return  0;
 428   3                 }
 429   2                 else
 430   2                 {
 431   3                    return  1;
 432   3                 }
 433   2                 break;
 434   2           case  RRB_CMD:                    //释放接收缓冲区
 435   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器
 436   2                 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
 437   2                 {
 438   3                   return  1;
 439   3                 }
 440   2                 else
 441   2                 {
 442   3                    return  0;
 443   3                 }
 444   2                 break;
 445   2      
 446   2           case  COS_CMD:                    //清除超载状态
 447   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器
 448   2                 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
 449   2                 {
 450   3                   return  0;
 451   3                 }
 452   2                 else
 453   2                 {
 454   3                    return  1;
 455   3                 }
 456   2                 break;
 457   2      
 458   2           case  GTS_CMD:                    //进入睡眠状态命令
 459   2                 return    0;
 460   2                 break;
 461   2           default:
 462   2                   return  1;
 463   2                   break;
 464   2         }
 465   1      
 466   1       }
 467          /************************************************************************
 468           *函数原型:  void InitialCAN()                                          *
 469           *参数说明:                                                             *
 470           *                                                                                                                                              *
 471           *返回值:                                                               *
 472           *说明:      初始化Can总线                                              *
 473           ************************************************************************/
 474          void InitialCAN()
 475          {
 476   1           SJA_reset=0;
 477   1           delay(100);
 478   1           SJA_reset=1;

⌨️ 快捷键说明

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