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

📄 sja_basiccan.lst

📁 参考周立功的basic模式的CAN通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
 201   1        Sja_BasicCan  = REG_ACR;                      //访问地址指向验收代码寄存器(ACR)
 202   1        *Sja_BasicCan = BCAN_ACR;                     //写入参数
 203   1        if ( *Sja_BasicCan != BCAN_ACR )              //校验写入值
 204   1        {
 205   2          return  1; 
 206   2        }
 207   1      
 208   1        Sja_BasicCan  = REG_AMR;                      //访问地址指向验收屏蔽寄存器(AMR)
 209   1        *Sja_BasicCan = BCAN_AMR;                     //写入参数
 210   1        if ( *Sja_BasicCan != BCAN_AMR )              //校验写入值
 211   1        {
 212   2          return  1; 
 213   2        }
 214   1      
 215   1        return    0;
 216   1      }
 217          
 218          /************************************************************************
 219          ;*函数原型: bit  BCan_Set_Outclk (unsigned char  BCAN_OCR,                  *
 220                                            unsigned char  BCAN_CDR);             *
 221          ;*参数说明:                                                                                                                     *
 222           *     BCAN_OCR: 存放输出控制寄存器 (OC)  的参数设置                    *
 223           *     BCAN_CDR: 存放时钟分频寄存器 (CDR) 的参数设置                    *
 224           *                                                                      *
 225          ;*返回值:                                                               *
 226          ;*           0 ;设置成功                                                *
 227          ;*           1 ;设置失败                                                *
 228          ;*                                                                      *
 229          ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *
 230          ;************************************************************************/
 231          bit  BCan_Set_Outclk (unsigned char BCAN_OCR,    
 232                               unsigned char  BCAN_CDR)
 233          {
 234   1        Sja_BasicCan  = REG_OCR ;             //访问地址指向输出控制寄存器
 235   1        *Sja_BasicCan = BCAN_OCR;                     //写入参数
 236   1        if ( *Sja_BasicCan != BCAN_OCR )      //校验写入值
 237   1        {
 238   2          return  1; 
 239   2        }
 240   1      
 241   1        Sja_BasicCan  = REG_CDR;                      //访问地址指向输出控制寄存器
C51 COMPILER V7.06   SJA_BASICCAN                                                          05/11/2006 15:34:24 PAGE 5   

 242   1        *Sja_BasicCan = BCAN_CDR;                     //写入参数
 243   1        return    0;
 244   1      }
 245                    
 246          /************************************************************************
 247           *函数原型:  bit   BCan_Data_Send(unsigned char *SendDataBuf)           *
 248           *参数说明:  特定帧各式的数据                                           *
 249           *返回值:                                                               *
 250           *           0    ; 表示将数据成功的送至发送缓冲区                      *
 251           *           1    ; 表示上一次的数据正在发送,                          *
 252           *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 253           *                ; 表示写入数据错误                                    * 
 254           *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 255           *        SJA1000发送。                                                 *
 256           *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 257           *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 258           *                                                                      *
 259           *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 260           *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 261           ************************************************************************/ 
 262           bit   BCan_Data_Send(unsigned char *SendDataBuf)
 263           {
 264   1         unsigned  char  TempCount;
 265   1         Sja_BasicCan = REG_STATUS;                //访问地址指向状态寄存器
 266   1         if ( (*Sja_BasicCan&0x08) == 0 )          //判断上次发送是否完成
 267   1         {
 268   2           return     1;
 269   2         }  
 270   1      
 271   1         if( (*Sja_BasicCan&0x04) == 0 )           //判断发送缓冲区是否锁定
 272   1         {
 273   2           return     1;
 274   2         }  
 275   1       
 276   1         Sja_BasicCan = REG_TxBuffer1;             //访问地址指向发送缓冲区1
 277   1         if ( (SendDataBuf[1]&0x10) == 0 )        //判断RTR,从而得出是数据帧还是远程帧
 278   1         { 
 279   2           //输入数据帧
 280   2               TempCount = ( ((SendDataBuf[1]&0x0f) > 8) ? 8 : TempCount ) + 2;
 281   2         }
 282   1         else
 283   1         {
 284   2           TempCount = 2;                         //远程帧
 285   2         }
 286   1      
 287   1         memcpy(Sja_BasicCan, SendDataBuf, TempCount);
 288   1         return 0;
 289   1      }
 290          
 291          /************************************************************************
 292           *函数原型:  bit    BCan_Data_Recv (unsigned char *RcvDataBuf,          *
 293           *                                  unsigned char *ucBufLen)            *      
 294           *参数说明:  RcvDataBuf, 存放微处理器保存数据缓冲区                     *
 295           *返回值:    0; 接收成功                                                *
 296           *           1; 接收失败                                                * 
 297           *说明: CAN控制器接收数据,仅限于接收数据                                *
 298           ************************************************************************/
 299           bit    BCan_Data_Recv(unsigned char *RcvDataBuf, unsigned char *ucBufLen)
 300           {
 301   1         Sja_BasicCan = REG_STATUS;                   //访问地址指向状态寄存器
 302   1         if ( (*Sja_BasicCan&0x01) == 0 )             //判断报文是否有效
 303   1         {
C51 COMPILER V7.06   SJA_BASICCAN                                                          05/11/2006 15:34:24 PAGE 6   

 304   2            *ucBufLen = 0;
 305   2            return 1;
 306   2         }
 307   1         
 308   1         Sja_BasicCan = REG_RxBuffer2;                //访问地址指向接收缓冲区2
 309   1         if ( (*Sja_BasicCan&0x10) == 0 )             //如果是数据帧
 310   1         {
 311   2               *ucBufLen  = (*Sja_BasicCan&0x0f) + 2;     //计算报文中数据的个数
 312   2         }
 313   1         else
 314   1         {
 315   2               *ucBufLen = 2;
 316   2         }
 317   1         Sja_BasicCan = REG_RxBuffer1;                 //访问地址指向接收缓冲区1
 318   1         memcpy(RcvDataBuf, Sja_BasicCan, *ucBufLen ); //读取接收缓冲区的报文
 319   1      
 320   1         return  0;
 321   1       }
 322          
 323          /************************************************************************
 324           *函数原型:  bit  BCan_Cmd_Prg(unsigned char cmd)                       *
 325           *参数说明:  unsigned char cmd: sja1000运行的命令字                     *
 326           *           0x01: 发送请求                                             *
 327           *           0x02: 中止发送                                             *
 328           *           0x04: 释放接收缓冲区                                       *
 329           *           0x08: 清除超载状态                                         *
 330           *           0x10: 进入睡眠状态                                         *
 331           *                                                                      *
 332           *返回值:                                                               *
 333           *           0 ; 表示命令执行成功                                       *
 334           *           1 ; 表示命令执行失败                                       *
 335           *                                                                      * 
 336           *说明:      执行sja1000命令                                            * 
 337           ************************************************************************/ 
 338          bit  BCan_Cmd_Prg(unsigned char cmd)
 339          {
 340   1         Sja_BasicCan  = REG_COMMAND;        //访问地址指向命令寄存器
 341   1         *Sja_BasicCan = cmd;                //启动命令字
 342   1         switch ( cmd )
 343   1         {
 344   2         case  CMD_SEND:                    //发送请求命令
 345   2            return    0;
 346   2            break;
 347   2      
 348   2         case  CMD_ABORT_SEND:              //夭折发送命令 
 349   2            Sja_BasicCan = REG_STATUS;       //访问地址指向状态寄存器   
 350   2            if ( (*Sja_BasicCan & 0x20) ==0 )//判断是否正在发送
 351   2            {
 352   3               return  0;
 353   3            }
 354   2            else
 355   2            {
 356   3               return  1;
 357   3            }   
 358   2            break; 
 359   2      
 360   2         case  CMD_RELEASE_RXBUFF:           //释放接收缓冲区 
 361   2            Sja_BasicCan = REG_STATUS;        //访问地址指向状态寄存器   
 362   2            if ( (*Sja_BasicCan & 0x01) == 1 )//判断是否释放成功
 363   2            {
 364   3              return  1;
 365   3            }
C51 COMPILER V7.06   SJA_BASICCAN                                                          05/11/2006 15:34:24 PAGE 7   

 366   2            else
 367   2            {
 368   3              return  0;
 369   3            }   
 370   2            break; 
 371   2        
 372   2        case  CMD_CLEAR_OVER_STAT:           //清除超载状态
 373   2            Sja_BasicCan = REG_STATUS;        //访问地址指向状态寄存器   
 374   2            if((*Sja_BasicCan & 0x02) == 0 )  //判断清除超载是否成功
 375   2            {
 376   3              return  0;
 377   3            }
 378   2            else
 379   2            {
 380   3              return  1;
 381   3            }   
 382   2            break; 
 383   2        
 384   2        case  CMD_GOTO_SLEEP:                      //进入睡眠状态命令 
 385   2            return    0;
 386   2            break; 
 387   2      
 388   2        default:
 389   2            return  1;
 390   2            break; 
 391   2        }
 392   1      }
 393          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    772    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----       7
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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