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

📄 i2c.lst

📁 i2c读写代码C语言
💻 LST
字号:
C51 COMPILER V7.09   I2C                                                                   10/14/2004 15:45:56 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c ROM(SMALL) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*****************************************************************/
   2          /**Objective:IIC Module                                                                                 **/
   3          /*****************************************************************/
   4          /**Auther       :Seal Luo                                                                                       **/
   5          /**Date         :2004-04-06                                                                                     **/
   6          /**CopyRight:C*Core 2004                                                                                **/
   7          /*****************************************************************/
   8          #include "IICReg.h"
   9          
  10          extern  void Delayms(uint16 uiTime);
  11          
  12          /*--
  13                  Function:Generate a start signal on I2C bus
  14                                  Input:Mode      0:slave         1:master
  15                                  return void
  16          --*/
  17          void    I2C_Start(UCHAR8 ucMode,UCHAR8 ucFistAddr)
  18          {
  19   1              UCHAR8  ucReg;
  20   1      
  21   1      /* Slave mode */
  22   1              if(ucMode == SLAVE_MODE)
  23   1              {
  24   2                      /* enable control */
  25   2                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
  26   2                      ucReg |=0x01;
  27   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
  28   2                      Delayms(10);
  29   2      
  30   2                      /* enable interrupt */
  31   2                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
  32   2                      ucReg |=0x02;
  33   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
  34   2      
  35   2              }
  36   1      
  37   1      /*Master Mode */
  38   1              if(ucMode == MASTER_MODE)
  39   1              {
  40   2      
  41   2                      /* enable control */
  42   2                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
  43   2      
  44   2                      ucReg |=0x01;
  45   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
  46   2      
  47   2                      Delayms(10);
  48   2                       /* enable interrupt */
  49   2                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
  50   2      
  51   2                      ucReg |=0x02;
  52   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
  53   2      
  54   2      
  55   2                      /* config I2CSA */
C51 COMPILER V7.09   I2C                                                                   10/14/2004 15:45:56 PAGE 2   

  56   2                      ucReg = SLAVE_ADDRESS;
  57   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_SLAVE_ADDRESS_REG , ucReg);
  58   2      
  59   2                      /*config I2CCP */
  60   2                      ucReg = CLOCK_PRESCALER;
  61   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CLOCK_PRESCALAR_REG , ucReg);
  62   2                      /* write slave address */
  63   2              ucReg = ucFistAddr;
  64   2      
  65   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucReg);
  66   2      
  67   2              /* check bus whether IDLE */
  68   2      
  69   2                      do
  70   2                      {
  71   3                              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
  72   3      
  73   3                      }while((ucReg>>3)==1);
  74   2      
  75   2                      /* change MSMODE 1 to 0 */
  76   2                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
  77   2      
  78   2                      ucReg |= 0x04;
  79   2                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
  80   2      
  81   2              }
  82   1      
  83   1      }
  84          
  85          
  86          /*--
  87                  Function:I2C Check ACK
  88                                  Input: void
  89                                  Return:1->no receive ACK     2->receive ACK             4->receive AACK
  90          
  91          --*/
  92          UCHAR8  I2C_Check_ACK(void)
  93          {
  94   1              UCHAR8  bRet = 0x01;
  95   1              UCHAR8  ucReg;
  96   1              /* read status register */
  97   1              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
  98   1      
  99   1              if((ucReg & 0x01)==0x01)
 100   1              {
 101   2                      bRet <<=1;
 102   2              }
 103   1              if((ucReg & 0x02)==0x02)
 104   1              {
 105   2                      bRet <<=2;
 106   2              }
 107   1      
 108   1              return bRet;
 109   1      
 110   1      }
 111          
 112          
 113          /*--
 114                  Function:I2C generate a stop signal
 115                                  Input: void
 116                                  Return:void
 117          
C51 COMPILER V7.09   I2C                                                                   10/14/2004 15:45:56 PAGE 3   

 118          --*/
 119          void    I2C_Stop(void)
 120          {
 121   1              UCHAR8 ucReg;
 122   1              /* change MSMODE 1 to 0 */
 123   1              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
 124   1              ucReg &= 0xfb;
 125   1              write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
 126   1      
 127   1      
 128   1      }
 129          
 130          
 131          
 132          /*--
 133                  Function:I2C write data to slave
 134                                  Input:
 135          
 136          --*/
 137          void    I2C_Write(UCHAR8 ucFistAddr,UCHAR8 ucData[],uint16 uiLength)
 138          {
 139   1                      UCHAR8  ucReg;
 140   1                      uint16  i;
 141   1                      ucFistAddr &= 0xfe;
 142   1                      /* send start signal */
 143   1                      I2C_Start(MASTER_MODE,ucFistAddr);
 144   1      
 145   1                      do
 146   1                      {
 147   2                              /* read status register */
 148   2                              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
 149   2                              if((ucReg & I2C_AACK)!=0 )
 150   2                                      goto Exit;
 151   2      
 152   2                      }while((ucReg & I2C_TF) != I2C_TF);
 153   1      
 154   1      
 155   1                      /* check whether receive ack */
 156   1                      for(i=0;i<uiLength;i++)
 157   1                      {
 158   2      
 159   2                              write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucData[i]);
 160   2                              do
 161   2                              {
 162   3                                      /* read status register */
 163   3                                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
 164   3                                      if((ucReg & I2C_AACK)!=0 )
 165   3                                              goto Exit;
 166   3      
 167   3                              }while((ucReg & I2C_TF) != I2C_TF);
 168   2                      }
 169   1      
 170   1      Exit:
 171   1                      /* send stop signal */
 172   1                      I2C_Stop();
 173   1      
 174   1      
 175   1      }
 176          
 177          
 178          /*--
 179                  Function:I2C read data from slave
C51 COMPILER V7.09   I2C                                                                   10/14/2004 15:45:56 PAGE 4   

 180                                  Input:
 181          
 182          --*/
 183          void    I2C_Read(UCHAR8 ucFistAddr,UCHAR8 ucLength)
 184          {
 185   1                      UCHAR8  ucReg,tmp;
 186   1                      uint16  i;
 187   1        
 188   1                      ucFistAddr |= 0x01;
 189   1                      /* send start signal */
 190   1                      I2C_Start(MASTER_MODE,ucFistAddr);
 191   1      
 192   1                      do
 193   1                      {
 194   2                              /* read status register */
 195   2                              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
 196   2                              if((ucReg & I2C_AACK)!=0 )
 197   2                                      goto Exit;
 198   2      
 199   2                      }while((ucReg & I2C_RC)!=I2C_RC );
 200   1      
 201   1                      /* read control register */
 202   1                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
 203   1      
 204   1                      if(ucLength>1)
 205   1                              ucReg |= 0x08;
 206   1                      else
 207   1                      {
 208   2                              ucReg &= 0xf7;
 209   2                              write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
 210   2                              do
 211   2                              {
 212   3                                      /* read status register */
 213   3                                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
 214   3      
 215   3                              }while((ucReg & I2C_TF)!= I2C_TF);
 216   2      
 217   2      //                      pI2cBuf[0] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
 218   2                              tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
 219   2                              write_port_byte(PMC_DATA_REG,tmp);
 220   2                              goto Exit;
 221   2                      }
 222   1                      write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
 223   1                      /* check whether receive ack */
 224   1                      for(i=0;i<ucLength;i++)
 225   1                      {
 226   2      
 227   2                              do
 228   2                              {
 229   3                                      /* read status register */
 230   3                                      ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
 231   3      
 232   3      
 233   3                              }while((ucReg & I2C_TF)!= I2C_TF);
 234   2      
 235   2                              /*read data form bus when tf = 1 */
 236   2                      //      pI2cBuf[i] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
 237   2                  tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
 238   2                              write_port_byte(PMC_DATA_REG,tmp);//Write data into PMC port
 239   2                              
 240   2                              /* read status register */
 241   2                              ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
C51 COMPILER V7.09   I2C                                                                   10/14/2004 15:45:56 PAGE 5   

 242   2      
 243   2                              if(i== ucLength -1)
 244   2                                      goto Exit;
 245   2                              if(i == (ucLength - 2))
 246   2                                      ucReg &= 0xf7;
 247   2                              else
 248   2                                      ucReg |= 0x08;
 249   2                              write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
 250   2      
 251   2      
 252   2                      }
 253   1      
 254   1      Exit:
 255   1                      /* send stop signal */
 256   1                      I2C_Stop();
 257   1      }
 258          
 259          


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