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

📄 basiccan_final1.lst

📁 设计了一个基于51单片机的CAN节点
💻 LST
📖 第 1 页 / 共 4 页
字号:
 195   1          TempData    = *SJA_BCANAdr;                  //保存原始值
 196   1          *SJA_BCANAdr=(TempData&0xfe);                        //清除复位请求
 197   1          if((*SJA_BCANAdr&0x01) == 0)
 198   1          {
 199   2             return   0;                               //退出成功
 200   2          }
 201   1          else
 202   1          {
 203   2             return   1;                              //
 204   2          }
 205   1      
 206   1       }
 207          
 208           /************************************************************************
 209          ;*函数原型:   bit   BCAN_SET_BANDRATE(uchar CAN_ByteRate)       *
 210          ;*参数说明:  R7            波特率(Kbit/s) BTR0     BTR1               *
 211          ;*           0              20              053H,    02FH                *
 212          ;*           1              40              087H,    0FFH               *  
 213          ;*           2              50              047H,    02FH               *
 214          ;*           3              80              083H,    0FFH                *
 215          ;*           4              100             043H,    02fH                *
 216          ;*           5              125             03H,     01cH                 *
 217          ;*           6              200             081H,    0faH               *
 218          ;*           7              250             01H,     01cH            *
 219          ;*           8              400             080H,    0faH                *
 220          ;*           9              500             00H,     01cH               *
 221          ;*           10             666             080H,    0b6H                 *
 222          ;*           11             800             00H,     016H             *
 223          ;*           12             1000            00H,     014H                  *
 224          ;*返回值:                                                               *
 225          ;*           0 ;波特率设置成功                                          *
 226          ;*           1 ;波特率设置失败                                          *
 227          ;*                                                                      * 
 228          ;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ,       *
 229          ;*     其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于        *
 230          ;*     复位模式                                                         *  
 231          ;************************************************************************/
 232          unsigned  char  code    SJA_BTR_CODETAB[]={
 233              0x53,0x2F,                         //;20KBPS的预设值
 234              0x87,0xFF,                     //;40KBPS的预设值
 235              0x47,0x2F,                     //;50KBPS的预设值
 236              0x83,0xFF,                     //;80KBPS的预设值
 237              0x43,0x2f,                     //;100KBPS的预设值
 238              0x03,0x1c,                     //;125KBPS的预设值
 239              0x81,0xfa,                     //;200KBPS的预设值
 240              0x01,0x1c,                     //;250KBPS的预设值
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 5   

 241              0x80,0xfa,                     //;400KBPS的预设值
 242              0x00,0x1c,                     //;500KBPS的预设值
 243              0x80,0xb6,                     //;666KBPS的预设值
 244              0x00,0x16,                     //;800KBPS的预设值
 245              0x80,0x23                     //;1000KBPS的预设值
 246             
 247          };
 248          
 249          bit   BCAN_SET_BANDRATE(uchar CAN_ByteRate)
 250          {
 251   1        uchar  BTR0_num,BTR1_num;
 252   1        BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
 253   1        BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
 254   1        //将波特率的的预设值装入sja1000的总线定时器
 255   1        SJA_BCANAdr=REG_BTR0;                         //访问地址指向总线定时寄存器0
 256   1        *SJA_BCANAdr=BTR0_num;                        //写入参数
 257   1        if(*SJA_BCANAdr != BTR0_num)                  //校验写入值
 258   1        {
 259   2          return  1; 
 260   2        }
 261   1        SJA_BCANAdr=REG_BTR1;                         //访问地址指向总线定时寄存器0
 262   1        *SJA_BCANAdr=BTR1_num;                        //写入参数
 263   1        if(*SJA_BCANAdr != BTR1_num)                  //校验写入值
 264   1        {
 265   2          return  1; 
 266   2        }
 267   1      
 268   1        return    0;
 269   1      }  
 270          
 271          
 272          /************************************************************************
 273          ;*函数原型:    BCAN_SET_OBJECT                                          *
 274          *参数说明:                                                              *
 275           *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 276           *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
 277          ;*返回值:                                                               *
 278          ;*           0 ;通信对象设置成功                                        *
 279          ;*           1 ;通信对象设置失败                                        *
 280          ;*                                                                      * 
 281          ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
 282          ;*     允许接收的报文,是由AMR和ACR共同决定的.                           *  
 283          ;*    满足以下条件的ID号的报文才可以被接收                              *
 284          ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
 285          ;*    该子程序只能用于复位模式                                          *                                 
             -                                                                                    *             
 286          ;************************************************************************/
 287          bit    BCAN_SET_OBJECT(uchar  BCAN_ACR,uchar  BCAN_AMR)
 288          {
 289   1         SJA_BCANAdr=REG_ACR;                         //访问地址指向验收代码寄存器(ACR)
 290   1        *SJA_BCANAdr=BCAN_ACR;                        //写入参数
 291   1        if(*SJA_BCANAdr != BCAN_ACR)                  //校验写入值
 292   1        {
 293   2          return  1; 
 294   2        }
 295   1        SJA_BCANAdr=REG_AMR;                          //访问地址指向验收屏蔽寄存器(AMR)
 296   1        *SJA_BCANAdr=BCAN_AMR;                        //写入参数
 297   1        if(*SJA_BCANAdr != BCAN_AMR)                  //校验写入值
 298   1        {
 299   2          return  1; 
 300   2        }
 301   1      
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 6   

 302   1        return    0;
 303   1      }
 304          
 305          
 306          
 307          /************************************************************************
 308          ;*函数原型: bit  BCAN_SET_OUTCLK (uchar Out_Control,            *
 309                                            uchar  Clock_Out);            *
 310          ;*参数说明:                                                                                                                     *
 311           *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 312           *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 313           *                                                                      *   
 314          ;*返回值:                                                               *
 315          ;*           0 ;设置成功                                                *
 316          ;*           1 ;设置失败                                                *
 317          ;*                                                                      * 
 318          ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                 
             -                                                                                    *             
 319          ;************************************************************************/
 320          bit  BCAN_SET_OUTCLK (uchar Out_Control,    
 321                               uchar  Clock_Out)
 322          {
 323   1        SJA_BCANAdr=REG_OCR ;                         //访问地址指向输出控制寄存器
 324   1        *SJA_BCANAdr=Out_Control;                     //写入参数
 325   1        if(*SJA_BCANAdr != Out_Control)               //校验写入值
 326   1        {
 327   2          return  1; 
 328   2        } 
 329   1        SJA_BCANAdr=REG_CDR;                          //访问地址指向时钟分频寄存器,主要用于设置CAN模式
 330   1        *SJA_BCANAdr=Clock_Out;                       //写入参数
 331   1        return    0;
 332   1      }
 333          
 334                                 
 335          /************************************************************************
 336           *函数原型:  bit   BCAN_DATA_WRITE(uchar *SendDataBuf)*
 337           *参数说明:  特定帧各式的数据?                                         *
 338           *返回值:                                                               *
 339           *           0    ; 表示将数据成功的送至发送缓冲区                      *
 340           *           1    ; 表示上一次的数据正在发送,                          *
 341           *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 342           *                ; 表示写入数据错误                                    * 
 343           *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 344           *        SJA1000发送。                                                 *
 345           *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 346           *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 347           *                                                                      *
 348           *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 349           *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 350           ************************************************************************/ 
 351          
 352           bit   BCAN_DATA_WRITE(uchar *SendDataBuf) reentrant   //只是将数据写入SJA1000的发送缓存区
 353           {
 354   1         uchar  TempCount;
 355   1         SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
 356   1         if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
 357   1         {
 358   2          return      1;
 359   2         }  
 360   1      
 361   1         if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
 362   1         {
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 7   

 363   2           return     1;
 364   2         }  
 365   1       
 366   1         SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
 367   1         if((SendDataBuf[1]&0x10)==0)        //判断RTR,从而得出是数据帧还是远程帧
 368   1         { 
 369   2           TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
 370   2         }
 371   1      
 372   1         else
 373   1         {
 374   2           TempCount =2;                     //远程帧
 375   2         }
 376   1      
 377   1        memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
 378   1         return 0;
 379   1      }
 380          
 381          
 382          
 383          /************************************************************************
 384           *函数原型:  bit BCAN_DATA_RECEIVE(uchar *RcvDataBuf);       *
 385           *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 386           *返回值:    0;接收成功                                                 *
 387           *           1;接收失败                                                 * 
 388           *说明:CAN控制器接收数据,仅限于接收数据                                 *
 389           ************************************************************************/
 390          
 391           bit BCAN_DATA_RECEIVE(uchar *RcvDataBuf)    //把数据接收之后出入RcvDataBuf
 392           {
 393   1         uchar  TempCount; 
 394   1         SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
 395   1         if((*SJA_BCANAdr&0x01)==0)               //判断报文是否有效
 396   1         {

⌨️ 快捷键说明

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