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

📄 i2c.lst

📁 用于Slave I2C得读写,此代码针对特定得芯片,但对其他得芯片也有借鉴作用.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\output\i2c.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c LARGE OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\output\i2c.
                    -lst) OBJECT(.\output\i2c.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      T8Lib
   4          * File:         i2c.c
   5          * Contents:
   6          *           The i2c module c file
   7          *           use GPIO to control SDA and SCL, communicate with T8
   8          * $Date: 10/13/05    Michal    T8R01LIB v0.1  initial
   9          * $Date: 11/29/05    Michal    T8R01LIB v0.2  test finish  both 51 and MCF5249
  10          * $Date: 11/30/05    Michal    T8R01LIB v0.3  make lib OK  on  MCF5249
  11          * $Date: 12/01/05    Michal    T8R01LIB v0.4  Add HW_IIC ,HW_SPI macro
  12          * $Date: 12/02/05    Michal    T8R01LIB v0.5  Add  function below
  13          *                 static void DoXX(BYTE* out ,BYTE* in,BYTE len,BOOL mode)
  14          *                 static BOOL DoComunication(BYTE* array, BYTE len,BOOL mode)
  15          *
  16          
  17          *
  18          *                Moidfy some *Cmd Fuction and Reply() function
  19          * $Date: 12/05/05    Michal    T8R02LIB v0.1  Add errcode1 to identify T8 off i2c bus state
  20          * $Date: 12/29/05 Michal T8R02LIB v0.2
  21                               Modify InitezT8(BOOL mode ) to BOOL  InitezT8Lib(BOOL ComMod,BYTE I2cSlvAdr,BOOL I2cIsHigh,B
             -YTE SpiCLkMod,WORD SpiRate,BYTE *key);
  22                                  void I2c_Init( ); void I2c_Sel( BYTE  SlvAdr, BOOL isHigh)  to void I2c_Init(BYTE 
             - SlvAdr, BOOL isHigh);
  23                                  void  Spi_Init();BOOL  Spi_ClkSel(BYTE mode, WORD rate);  To void  Spi_Init(BYTE m
             -ode, WORD rate);
  24                           Delete void SpiClkSelOpr(BYTE mode, WORD rate) ;
  25                                  void I2c_Sel( BYTE  SlvAdr, BOOL isHigh);
  26                                  void SetXXKey(BYTE* key);
  27          * $Date: 12/29/05 Michal T8R02LIB v0.5 test communiction at 400khz speed  is OK
  28          * Copyright (c) 2005 Fameg, Inc. All rights reserved
  29          ***********************************************************************************************
  30          */
  31          
  32          #include "ezT8.h"
  33          #include "I2c.h"
  34          
  35          
  36          #if  SW_IIC
  37          
  38          
  39          static BOOL iHighMode;
  40          BYTE  BusSlvAdr=0xEA;     //default I2c bus slave address for communiction
  41          
  42          static void Stop_I2c();
  43          static void Ack_I2c(BOOL a);
  44          static BYTE  I2cRcvByte();
  45          
  46          
  47          //Pin operation
  48          #if 1
  49                  void  WritePinSCL(){SCL=1;      }
  50          
  51                  void ClearPinSCL(){SCL=0;}
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 2   

  52          
  53                  void  setSDAin(){}
  54                  void  setSDAout(){}
  55          
  56                  void WritePinSDA(){SDA=1;}
  57                  void ClearPinSDA(){SDA=0;}
  58          
  59                  BOOL ReadPinSDA(){return(SDA);}
  60                  void InitReadAck(){SDA=1;}
  61          //Delay
  62                  void Delay_0_5us(unsigned char cnt)
  63             {
  64   1        //  unsigned char ct=1;
  65   1              while(cnt--)
  66   1              {
  67   2              //      while(ct--);
  68   2              //      asm("nop");
  69   2              //      ct=1;
  70   2              }
  71   1         }
  72          
  73           #else
                      #define   WritePinSCL() SCL=1
              
                      #define   ClearPinSCL() SCL=0
              
                      #define    setSDAin() /##/
                      #define    setSDAout()/##/
              
                      #define   WritePinSDA() SDA=1
                      #define   ClearPinSDA() SDA=0
              
                      #define   ReadPinSDA()  SDA
                      #define   InitReadAck() SDA
              
              //Delay
                  BYTE delay;
              //      #define Delay_0_5us(cnt)        //{/*delay =cnt ;while(delay--);*/} /##/
                      void Delay_0_5us(unsigned char cnt)
                 {
                //  unsigned char ct=1;
              //      while(cnt--)
              //      {
                      //      while(ct--);
                      //      asm("nop");
                      //      ct=1;
              //      }
                 }
              
              #endif
 102          
 103          void I2c_Init(BYTE  SlvAdr,BOOL isHigh)
 104          {
 105   1          /* SDA */
 106   1              iHighMode=isHigh;
 107   1              BusSlvAdr=SlvAdr;
 108   1          Stop_I2c();
 109   1      }
 110          
 111          
 112          /*void I2c_Sel( BYTE  SlvAdr,BOOL isHigh)
 113          {
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 3   

 114            iHighMode=isHigh;
 115            BusSlvAdr=SlvAdr;
 116          }*/
 117          
 118          /*******************************************************************
 119                               起动总线函数
 120          函数原型: void  Start_I2c();
 121          功能:       启动I2C总线,即发送I2C起始条件.
 122          
 123          ********************************************************************/
 124          void Start_I2c()
 125          {
 126   1        setSDAout();
 127   1        WritePinSDA();
 128   1        Delay_0_5us(10)  ;   /*发送结束条件的时钟信号*/
 129   1        WritePinSCL();
 130   1        Delay_0_5us(10);    /*起始条件建立时间大于4.7us,延时*/
 131   1      
 132   1        ClearPinSDA();      /*发送起始信号*/
 133   1        Delay_0_5us(10);    /* 起始条件锁定时间大于4μs*/
 134   1      
 135   1        ClearPinSCL();   /*钳住I2C总线,准备发送或接收数据 */
 136   1      //  Delay_0_5us(2);
 137   1      }
 138          
 139          
 140          /*******************************************************************
 141                                结束总线函数
 142          函数原型: void  Stop_I2c();
 143          功能:       结束I2C总线,即发送I2C结束条件.
 144          
 145          ********************************************************************/
 146          static void Stop_I2c()
 147          {
 148   1         setSDAout();
 149   1         ClearPinSDA();  /*发送结束条件的数据信号*/
 150   1         Delay_0_5us(10)  ;   /*发送结束条件的时钟信号*/
 151   1         WritePinSCL();  /*结束条件建立时间大于4μs*/
 152   1         Delay_0_5us(10);
 153   1         WritePinSDA();  /*发送I2C总线结束信号*/
 154   1         Delay_0_5us(10);
 155   1      }
 156          
 157          
 158          
 159          
 160          /*******************************************************************
 161                           字节数据传送函数
 162          函数原型: void  I2cSendByte(BYTE c);
 163          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 164               此状态位进行操作.(不应答或非应答都使ack=0 假)
 165               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 166          ********************************************************************/
 167          BOOL  I2cSendByte(BYTE c)
 168          {
 169   1       BYTE BitCnt;
 170   1       BOOL t,ack;
 171   1      
 172   1       setSDAout();
 173   1       for(BitCnt=0x80;BitCnt!=0;BitCnt=BitCnt>>1)  /*要传送的数据长度为8位*/
 174   1       {
 175   2      
C51 COMPILER V7.02b   I2C                                                                  08/28/2006 18:59:06 PAGE 4   

 176   2               if(iHighMode==true)
 177   2                   Delay_0_5us(1);
 178   2               else
 179   2               Delay_0_5us(4);
 180   2      
 181   2           if(c&BitCnt)
 182   2           {
 183   3      //        t=SDA;
 184   3               WritePinSDA();   /*判断发送位*/
 185   3            }
 186   2           else
 187   2               ClearPinSDA();
 188   2      
 189   2               if(iHighMode)
 190   2               Delay_0_5us(1);
 191   2               else
 192   2               Delay_0_5us(4);
 193   2      
 194   2      
 195   2      //        t=SCL;
 196   2           WritePinSCL();/*置时钟线为高,通知被控器开始接收数据位*/
 197   2      
 198   2               if(iHighMode)         /*保证时钟高电平周期大于4μs*/
 199   2               {
 200   3              Delay_0_5us(1);
 201   3              Delay_0_5us(1);
 202   3                      }
 203   2               else
 204   2               {
 205   3              Delay_0_5us(4);
 206   3              Delay_0_5us(4);
 207   3           }
 208   2           ClearPinSCL();
 209   2           // InitReadAck();          //11.22 add
 210   2         }      //9 clocks
 211   1      
 212   1      
 213   1      /*       if(iHighMode)
 214   1               {
 215   1              Delay_0_5us(1);
 216   1                      }
 217   1               else
 218   1               {
 219   1              Delay_0_5us(4);
 220   1                      }*/
 221   1            //WritePinSDA
 222   1            InitReadAck();
 223   1      
 224   1           if(iHighMode)
 225   1               {
 226   2              Delay_0_5us(1);
 227   2              Delay_0_5us(1);

⌨️ 快捷键说明

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