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

📄 i2c.lst

📁 在C8051F060上实现嵌入式系统ucos
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   I2C                                                                   03/02/2009 10:49:10 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\Output-files\I2C.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C-files\I2C.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\List-files\I2C.lst)
                    - OBJECT(.\Output-files\I2C.obj)

line level    source

   1          #include "..\ucos-ii\includes.h" 
   2          
   3          
   4          //static OS_EVENT *I2cMbox;
   5          
   6          INT8U COMMAND;     // 在SMBus中断服务程序中用于保存从地址 + R/W 位。
   7                       
   8          INT8U IIC_dat;        // 保持SMBus要发送的数据字节或刚收到的数据
   9                   
  10          INT8U BYTE_NUMBER; // 在中用于检查发送的是什么数据
  11                            // 高地址字节、低地址字节或数据字节
  12          INT8U HIGH_ADD, LOW_ADD; // EEPROM存储器地址的高、低字节
  13          
  14          INT8U SM_BUSY=0;    // 该位在发送或接收开始时被置1,
  15                          // 操作结束后由中断服务程序清0 
  16          
  17                                                                                                                                          
  18          
  19          INT8U I2cInit(void)      reentrant
  20          {
  21   1              SFRPAGE=SMB0_PAGE;
  22   1      
  23   1              SMB0CN = 0x44;  // 允许SMBus在应答周期发送ACK   没有用到超时检查。
  24   1              //SMB0CR = 0x99;        //SMBUS 波特率设置:100KHz
  25   1      
  26   1      //      SMB0CR = 0xC4;  //SMBUS 波特率设置:50KHz
  27   1         SMB0CR = 0x2B;
  28   1          
  29   1              EIE1 |= 0x02;   //开启SMBUS中断
  30   1      
  31   1              /*   
  32   1        I2cMbox = OSMboxCreate((void *)0);   //消息邮箱用于中断向任务传递操作结果 
  33   1        if (I2cMbox ==(void *)0 )            
  34   1            return FALSE;      
  35   1              */  
  36   1          
  37   1        return FALSE;
  38   1      
  39   1      }
  40          
  41          /***********************************************************************
  42          // SMBus 字节写函数-----------------------------------------------------
  43          // 向给定存储器地址写一个字节
  44          //
  45          // out_byte = 待写数据
  46          // byte_address = 待写存储器地址(2字节)
  47          // chip_select = 待写EEPROM芯片的器件地址
  48          
  49          *************************************************************************/
  50          
  51          void SM_Send (INT8U chip_select, INT16U byte_address,INT8U len, INT8U out_byte)  reentrant
  52          {
  53   1                      
  54   1                      while (SM_BUSY); // 等待SMBus空闲
C51 COMPILER V8.08   I2C                                                                   03/02/2009 10:49:10 PAGE 2   

  55   1              
  56   1                      SM_BUSY = 1; // 占用SMBus(设置为忙)                   
  57   1              
  58   1                      SFRPAGE=SMB0_PAGE; 
  59   1                      
  60   1      
  61   1                      SMB0CN = 0x44; // SMBus允许,应答周期发ACK              
  62   1              
  63   1                      COMMAND = (chip_select | WRITE); // 片选 + WRITE    
  64   1                  //(上) 在SMBus中断服务程序中用于保存从地址 + R/W 位。
  65   1      
  66   1      
  67   1                      if(len) //2个字节       
  68   1                  {
  69   2                        BYTE_NUMBER = 2; // 2地址字节 
  70   2      
  71   2                      }
  72   1                      else
  73   1                      {
  74   2                        BYTE_NUMBER = 1; // 1地址字节  
  75   2      
  76   2                                      
  77   2                       }
  78   1                        HIGH_ADD =(INT8U)byte_address;        
  79   1                    LOW_ADD = (INT8U)byte_address;
  80   1                      IIC_dat = out_byte; // 待写数据 
  81   1                      // 保持SMBus要发送的数据字节或刚收到的数据              
  82   1                              
  83   1              
  84   1                      SFRPAGE=SMB0_PAGE;
  85   1                      STA = 1; // 启动传输过程
  86   1                      while (SM_BUSY); // 等待传输结束                        
  87   1              
  88   1              
  89   1      }
  90          
  91          
  92          
  93          
  94          /***********************************************************************
  95          // SMBus随机读函数-----------------------------------------------------
  96          // 从给定存储器地址读一个字节
  97          //
  98          // byte_address = 要读取的存储器地址
  99          // chip_select = 待读EEPROM的器件地址
 100          //len从器件地址字节。
 101          ************************************************************************/
 102          INT8U SM_Receive (INT8U chip_select, INT16U byte_address,INT8U len) reentrant
 103          {        
 104   1        
 105   1              while (SM_BUSY); // 等待总线空闲 
 106   1              SM_BUSY = 1; //占用SMBus(设置为忙)    
 107   1      
 108   1              SFRPAGE=SMB0_PAGE;              
 109   1      
 110   1              SMB0CN = 0x44; // 允许SMBus,应答周期发ACK 
 111   1              
 112   1              COMMAND = (chip_select | READ); // 片选 + READ
 113   1      
 114   1              if(len)//2个字节
 115   1              {
 116   2                      BYTE_NUMBER = 2; // 2地址字节
C51 COMPILER V8.08   I2C                                                                   03/02/2009 10:49:10 PAGE 3   

 117   2                      HIGH_ADD = ((byte_address >> 8) & 0x00FF); // 高8位地址
 118   2                      //LOW_ADD = (byte_address & 0x00FF); // 低8位地址
 119   2                      
 120   2               }
 121   1      
 122   1              else
 123   1               {
 124   2                        BYTE_NUMBER = 1; // 1地址字节
 125   2                              HIGH_ADD =(INT8U)byte_address;  // 高8位地址    
 126   2               }
 127   1      
 128   1              LOW_ADD = (INT8U)byte_address ; // 低8位地址            
 129   1      
 130   1              SFRPAGE=SMB0_PAGE;
 131   1              STA = 1; // 启动传输过程
 132   1      
 133   1              while (SM_BUSY); // 等待传输结束        
 134   1              
 135   1              return IIC_dat;
 136   1      }

⌨️ 快捷键说明

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