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

📄 sja_bcanfunc.lst

📁 单片机C51环境下的CAN通讯程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 200          ;*    该子程序只能用于复位模式                                          *                                 
             -                                                                                    *             
 201          ;************************************************************************/
 202          bit    BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
 203          {
 204   1         SJA_BCANAdr=REG_ACR;                 //访问地址指向验收代码寄存器(ACR)
 205   1        *SJA_BCANAdr=BCAN_ACR;                //写入参数
 206   1        if(*SJA_BCANAdr != BCAN_ACR)          //校验写入值
 207   1        {
 208   2          return  1; 
 209   2        }
 210   1        SJA_BCANAdr=REG_AMR;                  //访问地址指向验收屏蔽寄存器(AMR)
 211   1        *SJA_BCANAdr=BCAN_AMR;                //写入参数
 212   1        if(*SJA_BCANAdr != BCAN_AMR)          //校验写入值
 213   1        {
 214   2          return  1; 
 215   2        }
 216   1      
 217   1        return    0;
 218   1      }
 219          
 220          /************************************************************************
 221          ;*函数原型: bit  BCAN_SET_OUTCLK (unsigned char Out_Control,            *
 222                                            unsigned char  Clock_Out);            *
 223          ;*参数说明:                                                                             *
 224           *    Out_Control:存放输出控制寄存器 (OCR)  的参数设置                   *
 225           *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 226           *                                                                      *   
 227          ;*返回值:                                                               *
 228          ;*           0 ;设置成功                                                *
 229          ;*           1 ;设置失败                                                *
 230          ;*                                                                      * 
 231          ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                 
             -                                                                                    *             
 232          ;************************************************************************/
 233          bit  BCAN_SET_OUTCLK (unsigned char Out_Control,    
 234                               unsigned char  Clock_Out)
 235          {
 236   1        SJA_BCANAdr=REG_OCR ;                 //访问地址指向输出控制寄存器
 237   1        *SJA_BCANAdr=Out_Control;             //写入参数
 238   1        if(*SJA_BCANAdr != Out_Control)       //校验写入值
 239   1        {
C51 COMPILER V7.06   SJA_BCANFUNC                                                          12/02/2005 15:25:41 PAGE 5   

 240   2          return  1; 
 241   2        } 
 242   1        SJA_BCANAdr=REG_CDR;                  //访问地址指向输出控制寄存器
 243   1        *SJA_BCANAdr=Clock_Out;               //写入参数
 244   1        return    0;
 245   1      }
 246          /************************************************************************
 247           *函数原型:  bit   BCAN_DATA_WRITE(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_WRITE(unsigned char *SendDataBuf)
 263           {
 264   1         unsigned  char  TempCount;
 265   1         SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
 266   1         if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
 267   1         {
 268   2          return  1;
 269   2         }  
 270   1      
 271   1         if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
 272   1         {
 273   2           return 1;
 274   2         }  
 275   1       
 276   1         SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
 277   1         if((SendDataBuf[1]&0x10)==0)        //判断RTR,从而得出是数据帧还是远程帧
 278   1         { 
 279   2           TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
 280   2         }
 281   1      
 282   1         else
 283   1         {
 284   2           TempCount =2;                     //远程帧
 285   2         }
 286   1      
 287   1        memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
 288   1         return 0;
 289   1      }
 290          
 291          /************************************************************************
 292           *函数原型:  bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf);       *
 293           *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 294           *返回值:    0;接收成功                                                 *
 295           *           1;接收失败                                                 * 
 296           *说明:CAN控制器接收数据,仅限于接收数据                                 *
 297           ************************************************************************/
 298           bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
 299           {
 300   1         unsigned  char  TempCount; 
 301   1         SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
C51 COMPILER V7.06   SJA_BCANFUNC                                                          12/02/2005 15:25:41 PAGE 6   

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    561    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2       5
   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 + -