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

📄 i2cslave.lst

📁 lpc2119I2C是NXP公司嵌入式芯片LPC2119 的串口测试程序part3
💻 LST
字号:
C51 COMPILER V7.06   I2CSLAVE                                                              11/19/2003 11:38:14 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE I2CSLAVE
OBJECT MODULE PLACED IN i2cslave.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2cslave.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /***************************************************************************/
   2          /*  Name of module    : I2CSLAVE.C                                         */
   3          /*  Creation date     : 12 March 2003                                      */
   4          /*  Program language  : C                                                  */
   5          /*  Name              : P.H. Seerden                                       */
   6          /*                                                                         */
   7          /*        (C) Copyright 2003 Philips Semiconductors B.V.                   */
   8          /*                                                                         */
   9          /***************************************************************************/
  10          #include <REG932.H>
  11          #include "ua_exprt.h"
  12          typedef unsigned char    BYTE;
  13          typedef unsigned short   WORD;
  14          
  15          #define SLAVE_IDLE           0
  16          #define SLAVE_BUSY           1
  17          #define SLAVE_READY          2
  18          #define SLAVE_TRX_ERROR      3
  19          #define SLAVE_RCV_ERROR      4
  20          
  21          #define GENERATE_STOP        0x54      // set STO, clear STA and SI
  22          #define RELEASE_BUS_ACK      0x44      // clear STO,STA,SI and set AA (ack)
  23          #define RELEASE_BUS_NOACK    0x40      // clear STO, STA, SI and AA (noack)
  24          #define RELEASE_BUS_STA      0x64      // generate (rep)START, set STA
  25          
  26          static BYTE count;                     // bytes send/received of current message
  27          char slaveBuf[3];
  28          static BYTE size;                      // size of slave mode buffer
  29          static BYTE slaveStatus;               // status of the slave
  30          
  31          void I2C_Interrupt(void) interrupt 6 using 1
  32          {
  33   1          switch(I2STAT)
  34   1          {
  35   2            case 0x60:                         // own SLA+W received, Ack returned 
  36   2            case 0x68:                         // Addressed as slave
  37   2            case 0x70:                         // General call received, Ack returned
  38   2            case 0x78:
  39   2              slaveStatus = SLAVE_BUSY;        // Data will be received
  40   2              count = 0;
  41   2              if (size > 1)
  42   2                  I2CON = RELEASE_BUS_ACK;     // return ACK on first byte
  43   2              else
  44   2                  I2CON = RELEASE_BUS_NOACK;   // return NACK on first byte
  45   2              break;
  46   2            case 0x80:
  47   2            case 0x90:                         // Data received, ACK returned
  48   2              slaveBuf[count++] = I2DAT;       // read data
  49   2              if (count == size)
  50   2                  I2CON = RELEASE_BUS_NOACK;   // return NACK on next byte
  51   2              else
  52   2                  I2CON = RELEASE_BUS_ACK;     //* return ACK on next byte
  53   2              break;
  54   2            case 0x88:
  55   2            case 0x98:                         // data received, NACK returned
C51 COMPILER V7.06   I2CSLAVE                                                              11/19/2003 11:38:14 PAGE 2   

  56   2              slaveStatus = SLAVE_RCV_ERROR;
  57   2              I2CON = RELEASE_BUS_ACK;         // clr SI, set AA
  58   2              break;
  59   2            case 0xA0:                         // STOP or REP.START received, addressed as slave
  60   2              slaveStatus = SLAVE_READY;
  61   2              I2CON = RELEASE_BUS_ACK;         // clr SI, set AA
  62   2              break;
  63   2            case 0xB0:                         // Arb. lost as MST, addressed as slave transmitter
  64   2              slaveStatus = SLAVE_BUSY;
  65   2              count = 0; 
  66   2              I2DAT = slaveBuf[count++];       // Transmit next data, restart
  67   2              I2CON = RELEASE_BUS_STA;         // MST mode if bus is free again
  68   2              break;
  69   2            case 0xA8:                         // Addressed as slave transmitter
  70   2              slaveStatus = SLAVE_BUSY;
  71   2              count = 0; 
  72   2            case 0xB8:                         // Data transmitted, ACK received
  73   2              I2DAT = slaveBuf[count++];       // Transmit next data
  74   2              I2CON = RELEASE_BUS_ACK;         // clr SI, set AA
  75   2              break;
  76   2            case 0xC0:                         // Data transmitted, NOT ACK received
  77   2              slaveStatus = SLAVE_TRX_ERROR;
  78   2            case 0xC8:
  79   2              I2CON = RELEASE_BUS_ACK;         // clr SI, set AA
  80   2              break;
  81   2            default:
  82   2              break;
  83   2          }
  84   1      }
  85          
  86          //void I2C_Init(BYTE *buf, BYTE size)
  87          void I2C_Init(void)
  88          {
  89   1              unsigned char temp;
  90   1          slaveStatus = SLAVE_IDLE;
  91   1          slaveBuf[0] = 0xA5;
  92   1          slaveBuf[1] = 0x55;
  93   1          slaveBuf[2] = 0x99;
  94   1          size = 3;
  95   1      
  96   1          P1M1  |= 0x0C;             // Configure P1.2 and P1.3 to open drain
  97   1          P1M2  |= 0x0C;
  98   1      
  99   1      //*****************************************************************************
 100   1      //*  Modified from Paul's code to select an address depending on the jumper
 101   1      //*  settings of A2, A1 and A0
 102   1      //***************************************************************************** 
 103   1          temp = P0;
 104   1          temp &= 0x07;                                                       // mask out non address bits 
 105   1          temp <<= 1;                                                 // shift left one
 106   1          I2ADR = (0xE0 | temp);                              // generate I2C address depending on P0   
 107   1      //*****************************************************************************
 108   1      //* End modification
 109   1      //*****************************************************************************  
 110   1         
 111   1          I2SCLH = 0x05;
 112   1          I2SCLL = 0x04;
 113   1          I2CON = RELEASE_BUS_ACK;   // enable I2C hardware
 114   1          EI2C  = 1;                 // enable I2C interrupt
 115   1      }
 116          
 117          void I2C_ProcessSlave(void)
C51 COMPILER V7.06   I2CSLAVE                                                              11/19/2003 11:38:14 PAGE 3   

 118          /**************************
 119           * Input(s)   : None.
 120           * Output(s)  : None.
 121           * Returns    : None.
 122           * Description: Process the slave.
 123           *              This function must be called by the application to check
 124           *              the slave status. The USER should adapt this function to
 125           *              his personal needs (take the right action at a certain
 126           *              status).
 127           ***************************************************************************/
 128          {
 129   1          switch(slaveStatus)
 130   1          {
 131   2            case SLAVE_IDLE :
 132   2              /* do nothing or fill transmit buffer for transfer                 */
 133   2              break;
 134   2            case SLAVE_BUSY :
 135   2              /* do nothing if interrupt driven         */
 136   2              break;
 137   2            case SLAVE_READY :
 138   2              /* read or fill buffer for next transfer, signal application       */
 139   2              slaveStatus = SLAVE_IDLE;
 140   2              break;
 141   2            case SLAVE_TRX_ERROR :
 142   2              /* generate error message                                          */
 143   2              slaveStatus = SLAVE_IDLE;
 144   2              break;
 145   2            case SLAVE_RCV_ERROR :
 146   2              /* generate error message                                          */
 147   2              slaveStatus = SLAVE_IDLE;
 148   2              break;
 149   2          }
 150   1      }


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