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

📄 sja_interface.lst

📁 can总线通信程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 229          //                   0           |         1          |        测试输出模式
 230          //             ---------------------------------------------------------------------
 231          //                   1           |         0          |        正常输出模式
 232          //             ---------------------------------------------------------------------
 233          //                   1           |         1          |        时钟输出模式
 234          //             ---------------------------------------------------------------------
 235          //          时钟分频寄存器用于设置CLKOUT输出的频率,时钟控制寄存器每位的定义如下:
 236          //             ----------------------------------------------------------------------
 237          //              位 |  BIT7 | BIT6  | BIT5  | BIT4  | BIT3   | BIT2  | BIT1  | BIT0  |
 238          //             ----------------------------------------------------------------------
 239          //             功能|CAN模式| CBP   |RXINTEN| 0     |关闭时钟| CD2   | CD1   | CD0   |
 240          //             ----------------------------------------------------------------------
 241          //          CD2~CD0可以在复位模式下访问,也可以在工作模式下访问。用来定义输出时钟CLKOUT的频率.如下:
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 5   

 242          //             ----------------------------------------------------------------------
 243          //                    CD2        |     CD1      |     CD0    |    CLKOUT的频率
 244          //             ----------------------------------------------------------------------
 245          //                     0         |      0       |      0     |       Fosc/2
 246          //             ----------------------------------------------------------------------
 247          //                     0         |      0       |      1     |       Fosc/4
 248          //             ----------------------------------------------------------------------
 249          //                     0         |      1       |      0     |       Fosc/6
 250          //             ----------------------------------------------------------------------
 251          //                     0         |      1       |      1     |       Fosc/8
 252          //             ----------------------------------------------------------------------
 253          //                     1         |      0       |      0     |       Fosc/10
 254          //             ----------------------------------------------------------------------
 255          //                     1         |      0       |      1     |       Fosc/12
 256          //             ----------------------------------------------------------------------
 257          //                     1         |      1       |      0     |       Fosc/14
 258          //             ----------------------------------------------------------------------
 259          //                     1         |      1       |      1     |       Fosc
 260          //             ----------------------------------------------------------------------
 261          //           RXINTEN置1,表示允许TX1输出用来做专用接收中断。当一条接收到的信息成功地通过报文滤波器
 262          //           TX1就会在接收到帧的最后一位期间,输出一位时间长度的脉冲。
 263          //           CBP置1,表示终止CAN输入比较器,只有RX0被激活。此时RX1应该连接到一个固定的电平上。
 264          //           CAN模式用于选择是BasicCAN还是PeilCAN。为0选择BasicCAN;为1选择PeilCAN.
 265          bit set_clk_mode(void)
 266          {
 267   1        while(sja_mode)
 268   1          {
 269   2                set_rst_mode();
 270   2              }
 271   1        write_can(0x08,sja_ocr);
 272   1        write_can(31,sja_cdr);
 273   1        if((read_can(0x08)==sja_ocr)&(read_can(31)==sja_cdr))
 274   1         {
 275   2           return(right);
 276   2         }
 277   1        else
 278   1         {
 279   2           return(error);
 280   2         }
 281   1      }
 282          /********************************************************************************************/
 283          //说明:条件编译,在使用到中断的时候,以下程序参与编译
 284          //#ifdef USE_INT
 285          /********************************************************************************************/
 286          //函数名称:set_int
 287          //函数功能:设置SJA中断类型和中断状态
 288          //入口参数:sja_oie,sja_eie,sja_tie,sja_rie
 289          //出口参数:设置是否成功
 290          //****备注:SJA1000的基本操作,和硬件有关,操作控制寄存器(地址:0)
 291          //          *只能在复位模式下设置
 292          //          SJA1000有五种中断类型:唤醒中断、数据超载中断、错误中断、发送中断、接收中断。其中
 293          //          数据超载中断、错误中断、发送中断和接收中断可以通过设置控制寄存器,选择是否允许中断
 294          bit set_int(void)
 295          {
 296   1        unsigned char buffer=0x00;
 297   1        while(sja_mode)
 298   1          {
 299   2                set_rst_mode();
 300   2              }
 301   1        buffer=read_can(0x00);
 302   1        inttemp_4=sja_oie;
 303   1        inttemp_3=sja_eie;
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 6   

 304   1        inttemp_2=sja_tie;
 305   1        inttemp_1=sja_rie;
 306   1        buffer=inttemp&0x1f;
 307   1        write_can(0x00,buffer);
 308   1        if(read_can(0x00)==(buffer|0x20))
 309   1         {
 310   2           return(right);
 311   2         }
 312   1        else
 313   1         {
 314   2           return(error);
 315   2         }
 316   1      }
 317          /********************************************************************************************/
 318          //函数名称;set_int_sev
 319          //函数功能:中断分析,判断是什么中断,调用相应的中断服务函数
 320          //入口参数:无
 321          //出口参数:无
 322          //****备注:和硬件有关,操作中断寄存器(地址:3)
 323          //          中断寄存器给出中断源信息。当有一个或一个以上中断寄存器的位被置为1时,SJA1000通过
 324          //          INT引脚(低电平有效)向CPU发出中断请求;CPU响应中断请求时,通过读取中断寄存器的内
 325          //          容可获得中断源的状态,判断有哪些中断源发了中断请求。当CPU读取中断寄存器内容时,所
 326          //          有中断寄存器的位被清除,INT处于悬浮状态(逻辑1)。显然,SJA1000的中断机制是一种单
 327          //          线中断,中断优先级和中断查询应由应用软件处理。
 328          //          SJA1000由休眠状态被唤醒时,会产生一个唤醒中断,以提示CPU进行处理。当出现超载时,
 329          //          如果超载中断允许,数据超载中断标志DOI和超载标志位同时被置位。SJA1000接收信息时,
 330          //          接收中断标志位RI和接收缓冲寄存器满标志位同时被置位。
 331          //          中断寄存器的功能定义如下:
 332          //          --------------------------------------------------------------------------------------------
 333          //            位  |  符号  |    名称      |  取值  |             功能
 334          //          --------------------------------------------------------------------------------------------
 335          //           IR.7 |   X    |    保留      |   X    |              X   
 336          //          --------------------------------------------------------------------------------------------
 337          //           IR.6 |   X    |    保留      |   X    |              X
 338          //          --------------------------------------------------------------------------------------------
 339          //           IR.5 |   X    |    保留      |   X    |              X
 340          //          --------------------------------------------------------------------------------------------
 341          //                |        |              |   0    |     CPU的任何读操作将清零
 342          //           IR.4 |  WUI   |  唤醒中断    |-------------------------------------------------------------
 343          //                |        |              |   1    |     当退出休眠状态时置为1
 344          //          --------------------------------------------------------------------------------------------
 345          //                |        |              |   0    |     CPU的任何读操作将清零
 346          //           IR.3 |  DOI   | 数据超载中断 |-------------------------------------------------------------
 347          //                |        |              |   1    |当超载中断允许时,超载标志位的上跳沿置1
 348          //          --------------------------------------------------------------------------------------------
 349          //                |        |              |   0    |     CPU的任何读操作将清零
 350          //           IR.2 |  EI    |  错误中断    |-------------------------------------------------------------
 351          //                |        |              |   1    |当错误中断允许时,错误状态或总线状态位变化将此位置1
 352          //          --------------------------------------------------------------------------------------------
 353          //                |        |              |   0    |     CPU的任何读操作将清零
 354          //           IR.1 |  TI    |  发送中断    |-------------------------------------------------------------
 355          //                |        |              |   1    |当发送中断允许时,发送缓冲寄存器状态的上升沿此位置1
 356          //          --------------------------------------------------------------------------------------------
 357          //                |        |              |   0    |     CPU的任何读操作将清零
 358          //           IR.0 |  RI    |  接收中断    |-------------------------------------------------------------
 359          //                |        |              |   1    |当接收中断允许时,FIFO非空将此位置1
 360          //          --------------------------------------------------------------------------------------------
 361          void set_int_sev(void) interrupt 0 
 362          {
 363   1        unsigned char buffer,temp;
 364   1        EX0=0;      /*关INT0中断*/
 365   1        CAN_bit=1;
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 7   

 366   1        buffer=read_can(0x03);
 367   1        temp=buffer&0x10;  /*判断是否是唤醒中断*/
 368   1        if(temp==0x20)
 369   1         {
 370   2           weakup_sev();  /*执行唤醒中断服务程序*/
 371   2         }
 372   1        temp=buffer&0x08;  /*判断是否是数据超载中断*/
 373   1        if(temp==0x08)
 374   1         {
 375   2           data_over_sev();  /*执行数据超载中断服务程序*/
 376   2         }
 377   1        temp=buffer&0x04;  /*判断是否是错误中断*/
 378   1        if(temp==0x04)
 379   1         {
 380   2           wrong_sev();   /*执行错误中断服务程序*/
 381   2         }
 382   1        temp=buffer&0x02;  /*判断是否是发送中断*/
 383   1        if(temp==0x02)
 384   1         {
 385   2           send_sev();   /*执行发送中断服务程序*/
 386   2         }
 387   1        temp=buffer&0x01;  /*判断是否是接收中断*/
 388   1        if(temp==0x01)
 389   1         {
 390   2           receive_sev();  /*执行接收中断服务程序*/
 391   2         }
 392   1        EX0=1;   /*开INT0中断*/
 393   1      }
 394          /********************************************************************************************/
 395          //函数名称:weakup_sev
 396          //函数功能:唤醒中断服务程序
 397          //入口参数:无
 398          //出口参数:无
 399          //****备注:无
 400          void weakup_sev(void)
 401          {
 402   1        ;
 403   1      }
 404          /********************************************************************************************/
 405          //函数名称:data_over_sev
 406          //函数功能:数据超载中断服务程序
 407          //入口参数:无
 408          //出口参数:无
 409          //****备注:无
 410          void data_over_sev(void)
 411          {
 412   1        ;
 413   1      }
 414          /********************************************************************************************/
 415          //函数名称:wrong_sev
 416          //函数功能:错误中断服务程序
 417          //入口参数:无
 418          //出口参数:无
 419          //****备注:无
 420          void wrong_sev(void)
 421          {
 422   1        ;
 423   1      }
 424          /********************************************************************************************/
 425          //函数名称:send_sev
 426          //函数功能:发送中断服务程序
 427          //入口参数:无
C51 COMPILER V7.50   SJA_INTERFACE                                                         05/24/2007 16:12:27 PAGE 8   

 428          //出口参数:无
 429          //****备注:无
 430          void send_sev(void)
 431          {
 432   1        ;//send_bit=1;
 433   1      }
 434          /********************************************************************************************/
 435          //函数名称:receive_sev
 436          //函数功能:接受中断服务程序
 437          //入口参数:无
 438          //出口参数:无
 439          //****备注:无
 440          void receive_sev(void)
 441          {
 442   1        rece_bit=1;
 443   1      }
 444          /********************************************************************************************/
 445          //#endif
 446          /********************************************************************************************/
 447          /*************************************END OF FILE********************************************/
 448          /********************************************************************************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    474    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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