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

📄 sja1000.lst

📁 周立功单片机中关于can总线的驱动设计
💻 LST
📖 第 1 页 / 共 2 页
字号:
 218   1      return(setting_success);
 219   1      }
 220          //------------------------------------------------------------------------------------------------------
 221          // 函数类别   SJA1000基本操作
 222          // 函数名称   setting_SJA_interrupt
 223          // 入口函数   SJA_OIE,SJA_EIE,SJA_TIE,SJA_RIE
 224          // 出口函数   setting_success
 225          // 操作寄存器 控制寄存器(00)
 226          // 函数功能   设置SJA中断类型和中断状态
 227          // 特殊要求   只能在复位工作模式下设置
 228          //------------------------------------------------------------------------------------------------------
 229          bit setting_SJA_interrupt(void)
 230          {
 231   1      bit setting_success;  
 232   1      unsigned char CONT_buf,temp=0;
 233   1      while(SJA_workmode)
 234   1            {
 235   2                setting_SJA_resetmode();                   //设置SJA工作在复位模式
 236   2                }
 237   1               CONT_buf=CANREG_read(0x00);
 238   1               temp=SJA_OIE;
 239   1               temp=temp<<4;
C51 COMPILER V7.06   SJA1000                                                               06/08/2005 22:08:24 PAGE 5   

 240   1               temp=temp|SJA_EIE;
 241   1               temp=temp<<3;
 242   1               temp=temp|SJA_TIE;
 243   1               temp=temp<<2;
 244   1           temp=temp|SJA_RIE;
 245   1               temp=temp<<1;
 246   1               CONT_buf=(temp&0x1E)|(CONT_buf&0x01);
 247   1           CANREG_write(0x00,CONT_buf);
 248   1           if(CANREG_read(0x00)==CONT_buf)
 249   1                  {
 250   2               setting_success=1;                        //滤波器设置成功
 251   2                      }
 252   1               else 
 253   1                 {
 254   2              setting_success=0;                         //滤波器设置失败
 255   2                  }  
 256   1      return(setting_success);
 257   1      }
 258          //------------------------------------------------------------------------------------------------------
 259          // 函数类别   SJA1000基本操作
 260          // 函数名称   Write_SJAsendBUF
 261          // 入口函数   无
 262          // 出口函数   setting_success
 263          // 操作寄存器 发送缓存器(10-19)状态寄存器02
 264          // 函数功能   写发送缓存器
 265          // 特殊要求   只能在工作模式下写
 266          //------------------------------------------------------------------------------------------------------
 267          bit Write_SJAsendBUF(void)
 268          {
 269   1      bit setting_success=0;  
 270   1      unsigned char i;
 271   1      while(SJA_workmode==0)
 272   1            {
 273   2                setting_SJA_workingmode();                   //设置SJA在工作模式
 274   2                }
 275   1      if((CANREG_read(0x02)&0x10)==0)
 276   1         {
 277   2         if((CANREG_read(0x02)&0x04)!=0)
 278   2          {
 279   3          CANREG_write(0x10,send_BUF.FrameID_H);
 280   3              CANREG_write(0x11,(send_BUF.FrameLENTH<<4)||(send_BUF.FrameKIND<<3)||(send_BUF.FrameID_L3));
 281   3              if(send_BUF.FrameKIND==0)
 282   3                {for(i=0;i<send_BUF.FrameLENTH,i<8;i++)
 283   4                      CANREG_write(0x12+i,send_BUF.Frame_Data[i]);
 284   4              }
 285   3          setting_success=1;                        //发送寄存器写成功
 286   3            }
 287   2          }
 288   1      return(setting_success);
 289   1      }
 290          
 291          //------------------------------------------------------------------------------------------------------
 292          // 函数类别   SJA1000基本操作
 293          // 函数名称   Write_SJAsendBUF
 294          // 入口函数   无
 295          // 出口函数   setting_success
 296          // 操作寄存器 接收缓存器(20-29)状态寄存器02
 297          // 函数功能   写发送缓存器
 298          // 特殊要求   只能在工作模式下写
 299          //------------------------------------------------------------------------------------------------------
 300          bit read_SJAreceiveBUF(void)
 301          {
C51 COMPILER V7.06   SJA1000                                                               06/08/2005 22:08:24 PAGE 6   

 302   1      bit setting_success=0;  
 303   1      unsigned char i;
 304   1      while(SJA_workmode==0)
 305   1            {
 306   2                setting_SJA_workingmode();                   //设置SJA在工作模式
 307   2                }
 308   1      if((CANREG_read(0x02)&0x01)!=0)
 309   1         {
 310   2         if((CANREG_read(0x02)&0x10)==0)
 311   2          {
 312   3          receive_BUF.FrameID_H=CANREG_read(0x20);
 313   3          receive_BUF.FrameLENTH=((CANREG_read(0x21)&0xF0)>>4);
 314   3          receive_BUF.FrameKIND=((CANREG_read(0x21)&0x08)>>3);
 315   3          receive_BUF.FrameID_L3=(CANREG_read(0x21)&0x07);
 316   3              if(receive_BUF.FrameKIND==0)
 317   3                {for(i=0;i<receive_BUF.FrameLENTH,i<8;i++)
 318   4                  receive_BUF.Frame_Data[i]=CANREG_read(0x22+i);
 319   4            }
 320   3          setting_success=1;                        //接收寄存器读成功
 321   3            }
 322   2          }
 323   1      return(setting_success);
 324   1      }
 325          //------------------------------------------------------------------------------------------------------
 326          // 函数类别   供调用子程序
 327          // 函数名称   SJA1000_init
 328          // 入口函数   无
 329          // 出口函数   无
 330          // 操作寄存器  1)控制寄存器(地址00)
 331          //             2)收代码寄存器ACR(地址04)
 332          //             3)验收屏蔽寄存器AMR(地址05)   
 333          //             4)总线定时寄存器BTR0(地址06)
 334          //             5)总线定时寄存器BTR1(地址07)
 335          //             6)输出控制寄存器OCR(地址08)
 336          //             7)测试寄存器(地址09)
 337          //             8)和时钟分频寄存器CDR(地址31)
 338          // 函数功能   SJA1000初始化设置
 339          // 特殊要求   在复位模式进行,初始化结束进入工作状态
 340          //------------------------------------------------------------------------------------------------------
 341          void SJA1000_init(void)
 342          {
 343   1      
 344   1      while(connect_OK==0)             
 345   1        {
 346   2        SJAconnect_judge();             //检测设备连接
 347   2        }
 348   1      while(SJA_workmode)
 349   1        {
 350   2        setting_SJA_resetmode();         //置SJA1000为复位工作模式
 351   2        }
 352   1      while(setting_SJA_rate()==0)
 353   1        {
 354   2        setting_SJA_rate();               //设置总线波特率
 355   2        }
 356   1      while(setting_SJA_dataselect()==0)
 357   1        {
 358   2        setting_SJA_dataselect();          //设置SJA接收数据的格式(标示位)
 359   2        }
 360   1      while(setting_SJA_CLK()==0)
 361   1        {
 362   2        setting_SJA_CLK();                 //设置SJA输出始终的形式
 363   2        }
C51 COMPILER V7.06   SJA1000                                                               06/08/2005 22:08:24 PAGE 7   

 364   1      }
 365          //------------------------------------------------------------------------------------------------------
 366          // 函数类别   中断处理函数
 367          // 函数名称   send_interrupt
 368          // 入口函数   无
 369          // 出口函数   无
 370          // 操作寄存器 
 371          // 函数功能   接收中断处理函数
 372          //------------------------------------------------------------------------------------------------------
 373          send_interrupt()
 374          {
 375   1      
 376   1      }
 377          //------------------------------------------------------------------------------------------------------
 378          // 函数类别   发送中断处理函数
 379          // 函数名称   receive_interrupt
 380          // 入口函数   
 381          // 出口函数   
 382          // 操作寄存器 
 383          // 函数功能    发送中断处理函数
 384          //------------------------------------------------------------------------------------------------------
 385          receive_interrupt()
 386          {
 387   1      
 388   1      }
 389          
 390          //------------------------------------------------------------------------------------------------------
 391          // 函数类别   中断函数
 392          // 函数名称   SJA_INTR
 393          // 入口函数   无
 394          // 出口函数   无
 395          // 操作寄存器 中断寄存器(地址03)
 396          // 函数功能   中断分析,判断是什么中断,调用相应的中断处理函数
 397          //------------------------------------------------------------------------------------------------------
 398          void SJA_INTR() interrupt 0 using 1     //CanBus接口芯片产生中断(INTR0)
 399          {
 400   1        unsigned char sta;
 401   1        unsigned char temp;
 402   1        EX0 = 0;
 403   1        sta = CANREG_read(3);                //读中断寄存器
 404   1        temp = sta & 0x20;
 405   1        if(temp == 0x20)
 406   1          SJA1000_init(); 
 407   1        temp = sta & 0x04;
 408   1        if(temp == 0x04)
 409   1          SJA1000_init();                             //消极错误中断,错误报警中断,均导致重启
 410   1        temp = sta & 0x02;
 411   1        if(temp == 0x02)                  //发送中断处理
 412   1          {
 413   2              send_interrupt();
 414   2              }
 415   1        temp = sta & 0x01;
 416   1        if(temp == 0x01)                           //接收中断,接收数据
 417   1        {
 418   2         receive_interrupt();
 419   2        }  
 420   1        EX0 = 1;
 421   1      }
 422          
 423          
 424          
 425          main()
C51 COMPILER V7.06   SJA1000                                                               06/08/2005 22:08:24 PAGE 8   

 426          {
 427   1      }
 428          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    666    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     38    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       6
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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