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

📄 i2cdrive.lst

📁 Philips LPC932 I2C 接口源程序
💻 LST
字号:
C51 COMPILER V7.06   I2CDRIVE                                                              03/01/2005 13:39:02 PAGE 1   


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

stmt level    source

   1          #include "i2cexprt.h"
   2          /* Immediate data to write into I2CON */
   3          /* CRSEL = 0 -> CLK determined by I2SCLH / L */
   4          #define GENERATE_STOP 0x54 /* STO=1, STA=0, SI=0 */
   5          #define RELEASE_BUS_ACK 0x44 /* STO=STA=SI=0, AA=1 */
   6          #define RELEASE_BUS_NOACK 0x40 /* STO=STA=SI=AA=0 */
   7          #define RELEASE_BUS_STA 0x64 /* (rep)START, STA=1 */
   8          static I2C_TRANSFER *tfr; /* Ptr to active trf block */
   9          static I2C_MESSAGE *msg; /* ptr to active msg block */
  10          static BYTE msgCount; /* Nr of messages to sent */
  11          static BYTE dataCount; /* bytes send/received */
  12          void I2C_Interrupt(void) interrupt 6 using 1
  13          {
  14   1          switch(I2STAT)
  15   1          {
  16   2              case 0x00: /* Bus Error has occured */
  17   2                  I2CON = GENERATE_STOP;
  18   2              break;
  19   2              case 0x08:
  20   2              case 0x10:
  21   2                  I2DAT = msg->address;
  22   2                  I2CON = RELEASE_BUS_ACK;
  23   2              break;
  24   2              case 0x18:
  25   2              case 0x28:
  26   2                  if (dataCount < msg->nrBytes)
  27   2                      {
  28   3                      I2DAT = msg->buf[dataCount++];
  29   3                      I2CON = RELEASE_BUS_ACK;
  30   3                  }
  31   2                  else
  32   2                  {
  33   3                      if (msgCount < tfr->nrMessages)
  34   3                      {
  35   4                          dataCount = 0;
  36   4                          msg = tfr->p_message[msgCount++];
  37   4                          I2CON = RELEASE_BUS_STA;
  38   4                      }
  39   3                      else
  40   3                      {
  41   4                          I2CON = GENERATE_STOP;
  42   4                          I2C_Ready(I2C_OK, msgCount);
  43   4                      }
  44   3                  }
  45   2              break;
  46   2              case 0x20:
  47   2              case 0x48:
  48   2                  I2C_Ready(I2C_NACK_ON_ADDRESS, msgCount);
  49   2                  I2CON = GENERATE_STOP;
  50   2              break;
  51   2              case 0x30:
  52   2                  I2C_Ready(I2C_NACK_ON_DATA, msgCount);
  53   2                  I2CON = GENERATE_STOP;
  54   2              break;
  55   2              case 0x38:
C51 COMPILER V7.06   I2CDRIVE                                                              03/01/2005 13:39:02 PAGE 2   

  56   2                  I2CON = RELEASE_BUS_STA;
  57   2              break;
  58   2              case 0x40:
  59   2                  if (msg->nrBytes == 1)
  60   2                      I2CON = RELEASE_BUS_NOACK;
  61   2                  else
  62   2                      I2CON = RELEASE_BUS_ACK;
  63   2              break;
  64   2              case 0x50:
  65   2                  msg->buf[dataCount++] = I2DAT;
  66   2                  if (dataCount + 1 == msg->nrBytes)
  67   2                      I2CON = RELEASE_BUS_NOACK;
  68   2                  else
  69   2                      I2CON = RELEASE_BUS_ACK;
  70   2              break;
  71   2              case 0x58:
  72   2                  msg->buf[dataCount] = I2DAT;
  73   2                  if (msgCount < tfr->nrMessages)
  74   2                  {
  75   3                      dataCount = 0;
  76   3                      msg = tfr->p_message[msgCount++];
  77   3                      I2CON = RELEASE_BUS_STA;
  78   3                  }
  79   2              else
  80   2              {
  81   3                  I2CON = GENERATE_STOP;
  82   3                  I2C_Ready(I2C_OK, msgCount);
  83   3              }
  84   2              break;
  85   2              default: break;
  86   2          }
  87   1      }
  88          void I2C_Init(void)
  89          /*****************/
  90          {
  91   1          // Fpclk = 7.373 Mhz internal oscillator
  92   1          // I2c speed = Fpclk / (2*(I2SCLH+I2SCLL)
  93   1          P1M1 |= 0x0C; /* P1.2 and P1.3 to open drain */
  94   1          P1M2 |= 0x0C;
  95   1          I2ADR = 0x26; /* default slave address */
  96   1          I2SCLH = 19; /* speed ~100KHz, 50% duty */
  97   1          I2SCLL = 19;
  98   1          I2CON = RELEASE_BUS_ACK; /* enable I2C hardware */
  99   1          EI2C = 1; /* enable I2C interrupt */
 100   1      }
 101          void I2C_Transfer(I2C_TRANSFER *p)
 102          {
 103   1          tfr = p;
 104   1          msgCount = 0;
 105   1          dataCount = 0;
 106   1          msg = tfr->p_message[msgCount++];
 107   1          I2CON = RELEASE_BUS_STA;
 108   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    409    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =   ----    ----
C51 COMPILER V7.06   I2CDRIVE                                                              03/01/2005 13:39:02 PAGE 3   

   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 + -