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

📄 upsd_i2c.lst

📁 ST uPSD32XX I2C This example demo code is provided as is and has no warranty, implied or otherwise.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.00  UPSD_I2C                                                               11/13/2002 09:49:12 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE UPSD_I2C
OBJECT MODULE PLACED IN upsd_i2c.OBJ
COMPILER INVOKED BY: E:\KEIL\C51\BIN\C51.EXE upsd_i2c.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*---------------------------------------------------------------------------- 
   2          Title: upsd_i2c.c
   3          Date: July 22, 2002
   4          Author: Alec Bath
   5          
   6          Description: I2C Routines for DK3200 Board
   7          
   8          Copyright 2002 ST Microelectronics
   9          This example demo code is provided as is and has no warranty,
  10          implied or otherwise.  You are free to use/modify any of the provided
  11          code at your own risk in your applications with the expressed limitation
  12          of liability (see below) so long as your product using the code contains
  13          at least one uPSD products (device).
  14          
  15          LIMITATION OF LIABILITY:   NEITHER STMicroelectronics NOR ITS VENDORS OR 
  16          AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
  17          INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
  18          CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
  19          OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  20          ----------------------------------------------------------------------------*/ 
  21          
  22          #pragma CODE                                            // include assembly in .lst file
  23          
  24          #include "upsd3200.h"
  25          #include "upsd_hardware.h"
  26          #include "upsd_i2c.h"
  27          #include "upsd_timer.h"                         // timer fns for timeout, etc.
  28          //#include "lcd_io.h"
  29          
  30          xdata unsigned char i2c_xmit_buf[256];                                                  // message xmit buffer
  31          xdata unsigned char i2c_rcv_buf[256];                                                   // message rcv buffer
  32          unsigned int i;                                                                                                 // array pointer
  33          unsigned char dummybyte, i2c_timeout;                                                   // dummy byte to rcv, timeout cntr
  34          bit i2c_init_flag, i2cwait, i2c_master, i2c_xmitr;                          // callable status flag bits
  35          bit bus_lost_flag, slave_nack_flag, i2c_timeout_flag;                   // error flag bits
  36          
  37          //-------------------------------------------------- 
  38          //      I2C Initialization Routine
  39          //--------------------------------------------------
  40          
  41          void upsd_i2c_init (void){
  42   1              P3SFS |= 0xC0;                                          // Enable P3.7 for SCL, P3.6 for SDA
  43   1              S2CON |= 0x81;                                          // Setup I2C-2 for 83KHz (40MHz XTAL)
  44   1              i2c_init_flag = 1;                                      // set init done flag
  45   1              i2c_timeout_flag = 0;                           // clear timeout error flag
  46   1              PX1 = 0;                                                        // set low priority for INT1
  47   1              IPA |= 0x02;                                            // set high priority for EI2C
  48   1              IEA     |=      0x02;                                           // set EI2C I2C Int. Enable bit
  49   1              EX1 = 1;                                                        // set EX1 Int. Enable bit (INT1)
  50   1              }
  51          
  52          //-------------------------------------------------- 
  53          //      I2C Transmit Data Routine
  54          //--------------------------------------------------
  55          
C51 COMPILER V7.00  UPSD_I2C                                                               11/13/2002 09:49:12 PAGE 2   

  56          void upsd_i2c_xmit (unsigned char i2c_address, unsigned char start_address, unsigned char data_len){
  57   1              while ((S2STA & BBUSY) != 0);           // wait for BBUSY to be clear
  58   1              i2c_master = 1;
  59   1              i2c_xmitr = 1;                                          // set up for master transmitter
  60   1              S2DAT = i2c_address;                            // set up i2c address
  61   1              S2CON |= ENI;                                           // Set ENI (Enable I2C-2)
  62   1              S2CON &= ~STO;                                          // Clr STO in S2CON
  63   1              S2CON |= STA;                                           // Set STA (Send start bit)
  64   1              S2CON &= ~AA;                                           // Clr AA in S2CON
  65   1              i2c_wait_for_int();                                     // Wait for interrupt
  66   1              S2CON &= ~STA;                                          // clear STA
  67   1              S2DAT = start_address;
  68   1              i2c_wait_for_int();                                     // Wait for interrupt
  69   1              S2CON &= ~STA;                                          // clear STA
  70   1      
  71   1              for     (i=0; i < (data_len-1); i++){
  72   2                      S2DAT = i2c_xmit_buf[i];
  73   2                      i2c_wait_for_int();                             // Wait for interrupt
  74   2                      S2CON &= ~STA;                                  // clear STA
  75   2                      }
  76   1              S2CON |= STO;                                           // set STO (stop bit)
  77   1              S2DAT = i2c_xmit_buf[i];                        // send last data byte
  78   1              i2c_wait_for_int();                                     // Wait for interrupt
  79   1              S2DAT = dummy;                                          // send dummy byte
  80   1      }
  81          
  82          
  83          
  84          //-------------------------------------------------- 
  85          //      I2C Receive Data Routine
  86          //--------------------------------------------------
  87          
  88          void upsd_i2c_rcv (unsigned char i2c_address, unsigned char start_address, unsigned char data_len){
  89   1              while ((S2STA & BBUSY) != 0);           // wait for BBUSY to be clear
  90   1              i2c_master = 1;
  91   1              i2c_xmitr = 0;                                          // set flags for master receiver
  92   1      
  93   1      // set up i2c slave starting address
  94   1              S2DAT = i2c_address;                            // set up i2c address
  95   1              S2CON |= ENI;                                           // Set ENI (Enable I2C-2)
  96   1              S2CON |= STA;                                           // Set STA (Send start bit)
  97   1              S2CON &= ~AA;                                           // Clr AA in S2CON
  98   1              i2c_wait_for_int();                                     // Wait for interrupt
  99   1              S2CON &= ~STA;                                          // clear STA
 100   1              S2CON |= STO;                                           // set STO (stop bit)
 101   1              S2DAT = start_address;                          // send starting address
 102   1              i2c_wait_for_int();                                     // Wait for interrupt
 103   1              S2DAT = dummy;                                          // send dummy byte
 104   1      
 105   1      // receive bytes from slave from starting address
 106   1              S2DAT = (i2c_address | 0x01);           // set up i2c address (set R/W bit)
 107   1              S2CON |= ENI;                                           // Set ENI (Enable I2C-2)
 108   1              S2CON &= ~STO;                                          // Clr STO in S2CON
 109   1              S2CON |= STA;                                           // Set STA (Send start bit)
 110   1              S2CON &= ~AA;                                           // Clr AA in S2CON
 111   1              i2c_wait_for_int();                                     // Wait for interrupt
 112   1              S2CON &= ~STA;                                          // clear STA
 113   1              S2DAT = 0xFF;                                           // send byte for rcv mode
 114   1              S2CON |= AA;                                            // Set AA in S2CON
 115   1              i2c_wait_for_int();                                     // Wait for interrupt
 116   1      
 117   1              for     (i=0; i < (data_len-1); i++){
C51 COMPILER V7.00  UPSD_I2C                                                               11/13/2002 09:49:12 PAGE 3   

 118   2                      dummybyte = S2STA;                              // Dummy Read S2STA
 119   2                      i2c_rcv_buf[i] = S2DAT;                 // Get data byte from Slave
 120   2                      i2c_wait_for_int();                             // Wait for interrupt
 121   2                      }
 122   1              S2CON &= ~AA;                                           // Clr AA in S2CON
 123   1              i2c_rcv_buf[i] = S2DAT;                         // Get last data byte
 124   1              i2c_wait_for_int();                                     // Wait for interrupt
 125   1              dummybyte = S2STA;                                      // Dummy Read S2STA
 126   1              i++;
 127   1              i2c_rcv_buf[i] = S2DAT;                         // Get dummy data byte
 128   1      }
 129          
 130          
 131          
 132          //-------------------------------------------------- 
 133          //      I2C Wait for Interrupt Routine
 134          //--------------------------------------------------
 135          
 136          void i2c_wait_for_int (void){
 137   1              i2cwait = 1;                                                    // 
 138   1              i2c_timeout = 0;
 139   1              while (i2cwait == 1){                                   // .. wait for int to clear flag
 140   2                      if (i2c_timeout >= 10){                     // 10mS timeout loop
 141   3                              i2c_timeout_flag = 1;               // set error flag
 142   3                              i2cwait = 0;                                    // 
 143   3                      }
 144   2                      timer0_delay(1);                                        // 1 mS delay
 145   2                      i2c_timeout++;
 146   2              }
 147   1      }
 148          
 149          
 150          /*-------------------------------------------------- 
 151                  I2C Interrupt Service Routine
 152          --------------------------------------------------*/ 
 153          
 154          void i2c_isr (void) interrupt I2C_VECTOR using 2 {      // I2C Interrupt Routine
 155   1              if ((S2STA & BLOST) == 1){
 156   2      //              printfLCD("\nI2C Bus Lost!\n");         // display on LCD
 157   2      //              timer0_delay(1000);                                     // 1 Sec timeout
 158   2                      S2DAT = dummy;                                          // send dummy byte
 159   2                      bus_lost_flag = 1;
 160   2                      }
 161   1              if ((S2STA & _ACKREP) == 1){
 162   2      //              printfLCD("\nNo Slave ACK!\n");         // display on LCD
 163   2      //              timer0_delay(1000);                                     // 1 Sec timeout
 164   2                      S2DAT = dummy;                                          // send dummy byte
 165   2                      slave_nack_flag = 1;
 166   2                      }
 167   1              if (i2c_master & i2c_xmitr){                    // mstr transmitter mode
 168   2                      i2cwait = 0;                                            // reset wait flag
 169   2                      }
 170   1              if (i2c_master & ~i2c_xmitr){                   // mstr receiver mode
 171   2                      i2cwait = 0;                                            // reset wait flag
 172   2                      }
 173   1      }
 174          
 175          
 176          
C51 COMPILER V7.00  UPSD_I2C                                                               11/13/2002 09:49:12 PAGE 4   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION upsd_i2c_init (BEGIN)
                                           ; SOURCE LINE # 41
                                           ; SOURCE LINE # 42
0000 4393C0            ORL     P3SFS,#0C0H
                                           ; SOURCE LINE # 43
0003 43DC81            ORL     S2CON,#081H
                                           ; SOURCE LINE # 44
0006 D200        R     SETB    i2c_init_flag
                                           ; SOURCE LINE # 45
0008 C200        R     CLR     i2c_timeout_flag
                                           ; SOURCE LINE # 46
000A C2BA              CLR     PX1
                                           ; SOURCE LINE # 47
000C 43B702            ORL     IPA,#02H
                                           ; SOURCE LINE # 48
000F 43A702            ORL     IEA,#02H
                                           ; SOURCE LINE # 49
0012 D2AA              SETB    EX1
                                           ; SOURCE LINE # 50
0014 22                RET     
             ; FUNCTION upsd_i2c_init (END)

             ; FUNCTION _upsd_i2c_xmit (BEGIN)
                                           ; SOURCE LINE # 56
0000 8D00        R     MOV     start_address,R5
0002 8B00        R     MOV     data_len,R3
;---- Variable 'i2c_address' assigned to Register 'R7' ----
0004         ?C0002:
                                           ; SOURCE LINE # 57
0004 E5DD              MOV     A,S2STA
0006 20E3FB            JB      ACC.3,?C0002
0009         ?C0003:
                                           ; SOURCE LINE # 58
0009 D200        R     SETB    i2c_master
                                           ; SOURCE LINE # 59
000B D200        R     SETB    i2c_xmitr
                                           ; SOURCE LINE # 60
000D 8FDE              MOV     S2DAT,R7
                                           ; SOURCE LINE # 61
                                           ; SOURCE LINE # 62
                                           ; SOURCE LINE # 63
                                           ; SOURCE LINE # 64
                                           ; SOURCE LINE # 65
000F 120000      R     LCALL   ?C0026
                                           ; SOURCE LINE # 66
0012 53DCDF            ANL     S2CON,#0DFH
                                           ; SOURCE LINE # 67
0015 8500DE      R     MOV     S2DAT,start_address
                                           ; SOURCE LINE # 68
0018 120000      R     LCALL   i2c_wait_for_int
                                           ; SOURCE LINE # 69
001B 53DCDF            ANL     S2CON,#0DFH
                                           ; SOURCE LINE # 71
001E E4                CLR     A
001F F500        R     MOV     i,A
0021 F500        R     MOV     i+01H,A
0023         ?C0004:
0023 E500        R     MOV     A,data_len
0025 24FF              ADD     A,#0FFH
C51 COMPILER V7.00  UPSD_I2C                                                               11/13/2002 09:49:12 PAGE 5   

0027 FF                MOV     R7,A
0028 E4                CLR     A
0029 34FF              ADDC    A,#0FFH
002B FE                MOV     R6,A
002C C3                CLR     C
002D E500        R     MOV     A,i+01H
002F 9F                SUBB    A,R7
0030 E500        R     MOV     A,i
0032 9E                SUBB    A,R6
0033 501E              JNC     ?C0005
                                           ; SOURCE LINE # 72
0035 7400        R     MOV     A,#LOW i2c_xmit_buf
0037 2500        R     ADD     A,i+01H
0039 F582              MOV     DPL,A

⌨️ 快捷键说明

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