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

📄 selftest.lst

📁 用单片机实现的CAN总线通讯程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 224              0x81,0xfa,                     //;200KBPS的预设值
 225              0x01,0x1c,                     //;250KBPS的预设值
 226              0x80,0xfa,                     //;400KBPS的预设值
 227              0x00,0x1c,                     //;500KBPS的预设值
 228              0x80,0xb6,                     //;666KBPS的预设值
 229              0x00,0x16,                     //;800KBPS的预设值
 230              0x00,0x14                     //;1000KBPS的预设值
 231             
 232          };
 233          
 234          bit   BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
 235          {
 236   1        unsigned  char  BTR0_num,BTR1_num;
 237   1        BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
 238   1        BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
 239   1        //将波特率的的预设值装入sja1000的总线定时器
 240   1        SJA_BCANAdr=REG_BTR0;                         //访问地址指向总线定时寄存器0
 241   1        *SJA_BCANAdr=BTR0_num;                        //写入参数
C51 COMPILER V7.06   SELFTEST                                                              05/09/2005 09:55:25 PAGE 5   

 242   1        if(*SJA_BCANAdr != BTR0_num)                  //校验写入值
 243   1        {
 244   2          return  1; 
 245   2        }
 246   1        SJA_BCANAdr=REG_BTR1;                         //访问地址指向总线定时寄存器0
 247   1        *SJA_BCANAdr=BTR1_num;                        //写入参数
 248   1        if(*SJA_BCANAdr != BTR1_num)                  //校验写入值
 249   1        {
 250   2          return  1; 
 251   2        }
 252   1      
 253   1        return    0;
 254   1      }  
 255          
 256          
 257          
 258          bit    BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
 259          {
 260   1        SJA_BCANAdr=REG_TxBuffer5;                    //访问地址指向验收屏蔽寄存器(AMR)
 261   1        *SJA_BCANAdr=BCAN_AMR;                        //写入参数
 262   1        *(SJA_BCANAdr+1)=BCAN_AMR;
 263   1        *(SJA_BCANAdr+2)=BCAN_AMR;
 264   1        *(SJA_BCANAdr+3)=BCAN_AMR;
 265   1        if(*SJA_BCANAdr != BCAN_AMR)                  //校验写入值
 266   1        {
 267   2          return  1; 
 268   2        }
 269   1      
 270   1        SJA_BCANAdr=REG_TxBuffer1;                    //访问地址指向验收代码寄存器(ACR)
 271   1        *SJA_BCANAdr=BCAN_ACR;                        //写入参数
 272   1      
 273   1        if(*SJA_BCANAdr != BCAN_ACR)                  //校验写入值
 274   1        {
 275   2          return  1; 
 276   2        }
 277   1      
 278   1        return    0;
 279   1      }
 280          
 281          
 282          bit  BCAN_SET_OUTCLK (unsigned char Out_Control,    
 283                               unsigned char  Clock_Out)
 284          { 
 285   1      SJA_BCANAdr=REG_CDR;                    //访问地址指向输出控制寄存器
 286   1        *SJA_BCANAdr=Clock_Out;                       //写入参数
 287   1         if(*SJA_BCANAdr != Clock_Out)                //校验写入值
 288   1        {
 289   2          return  1; 
 290   2        } 
 291   1        SJA_BCANAdr=REG_OCR ;                         //访问地址指向输出控制寄存器
 292   1        *SJA_BCANAdr=Out_Control;                     //写入参数
 293   1        if(*SJA_BCANAdr != Out_Control)               //校验写入值
 294   1        {
 295   2          return  1; 
 296   2        } 
 297   1       
 298   1        return    0;
 299   1      }
 300          
 301          
 302          
 303           bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)
C51 COMPILER V7.06   SELFTEST                                                              05/09/2005 09:55:25 PAGE 6   

 304           {
 305   1         unsigned  char  TempCount;
 306   1         SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
 307   1         if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
 308   1         {
 309   2          return      1;
 310   2         }  
 311   1      
 312   1         if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
 313   1         {
 314   2           return     1;
 315   2         }  
 316   1       
 317   1         SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
 318   1         if((SendDataBuf[0]&0x40)==0)        //判断RTR,从而得出是数据帧还是远程帧
 319   1         { 
 320   2           TempCount =(SendDataBuf[0]&0x0f)+3; //输入数据帧
 321   2         }
 322   1      
 323   1         else
 324   1         {
 325   2           TempCount =3;                     //远程帧
 326   2         }
 327   1      
 328   1        memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
 329   1         return 0;
 330   1      }
 331          
 332          
 333          
 334          bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
 335           {
 336   1         unsigned  char  TempCount; 
 337   1         SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
 338   1         if((*SJA_BCANAdr&0x01)==0)               //判断报文是否有效
 339   1         {
 340   2            return 1;
 341   2         }
 342   1         
 343   1         SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区2
 344   1         if((*SJA_BCANAdr&0x40)==0)               //如果是数据帧
 345   1         {
 346   2           TempCount=(*SJA_BCANAdr&0x0f)+3;       //计算报文中数据的个数
 347   2         }
 348   1         
 349   1         else
 350   1         {
 351   2          TempCount=3;
 352   2         }
 353   1         SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区1
 354   1         memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
 355   1         return  0;
 356   1       }
 357          
 358          bit  BCAN_SET_MOD(void)
 359          {
 360   1        unsigned   char   TempData;
 361   1        SJA_BCANAdr=REG_CONTROL;
 362   1        TempData=  *SJA_BCANAdr;
 363   1        *SJA_BCANAdr=TempData&0xf8;
 364   1        SJA_BCANAdr=REG_EMLR;
 365   1       *SJA_BCANAdr=0xc0;
C51 COMPILER V7.06   SELFTEST                                                              05/09/2005 09:55:25 PAGE 7   

 366   1      
 367   1         return 0;
 368   1      }
 369          
 370          bit  BCAN_CMD_PRG(unsigned char cmd)
 371           {
 372   1         SJA_BCANAdr=REG_COMMAND;            //访问地址指向命令寄存器
 373   1         *SJA_BCANAdr=cmd;                   //启动命令字
 374   1         switch(cmd)
 375   1         {
 376   2       
 377   2                      case  TR_CMD:                     //发送请求命令
 378   2                 return    0;
 379   2                 break;
 380   2      
 381   2                      case  SRR_CMD:                                          //自接收请求
 382   2                         return       0;
 383   2                         break;
 384   2          
 385   2                      case  AT_CMD:                     //夭折发送命令 
 386   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 387   2                 if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
 388   2                 {
 389   3                    return  0;
 390   3                 }
 391   2                 else
 392   2                 {
 393   3                    return  1;
 394   3                 }   
 395   2                 break; 
 396   2           case  RRB_CMD:                    //释放接收缓冲区 
 397   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 398   2                 if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
 399   2                 {
 400   3                   return  1;
 401   3                 }
 402   2                 else
 403   2                 {
 404   3                    return  0;
 405   3                 }   
 406   2                 break; 
 407   2        
 408   2           case  COS_CMD:                    //清除超载状态
 409   2                 SJA_BCANAdr = REG_STATUS;   //访问地址指向状态寄存器   
 410   2                 if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
 411   2                 {
 412   3                   return  0;
 413   3                 }
 414   2                 else
 415   2                 {
 416   3                    return  1;
 417   3                 }   
 418   2                 break; 
 419   2           default:
 420   2                   return  1;
 421   2                   break; 
 422   2         }
 423   1      }
 424          
 425          void    delay(unsigned int k)
 426                  {       unsigned        int     i,j;
 427   1                      for(i=0;i<k;i++)
C51 COMPILER V7.06   SELFTEST                                                              05/09/2005 09:55:25 PAGE 8   

 428   1                      for(j=0;j<100;j++);
 429   1              }
 430          
 431          void    display(unsigned char display_buffer[5])
 432          {
 433   1              unsigned i;
 434   1              for (i=0;i<5;i++)
 435   1         {
 436   2            write7279(DECODE1+i,display_buffer[i]);   
 437   2         }
 438   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    927    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     34      10
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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