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

📄 smbus.lst

📁 c8051f020实现4个 产UART 口
💻 LST
字号:
C51 COMPILER V7.50   SMBUS                                                                 06/10/2007 23:11:21 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE SMBUS
OBJECT MODULE PLACED IN .\out\smbus.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE smbus.c LARGE OPTIMIZE(SIZE) REGFILE(.\out\mbtest.ORC) BROWSE INCDIR(C:\Kei
                    -l\C51\LIB\;D:\TEST_C020\MC_55_C\) DEBUG OBJECTEXTEND OBJECT(.\out\smbus.obj)

line level    source

   1          
   2          #include "all.h"
   3          
   4          
   5          void smbus(void) interrupt 7 using 2     //SMBUS中断服务程序
   6          {
   7   1              //char sfrpage_save = SFRPAGE;
   8   1              //SFRPAGE = SMB0_PAGE;
   9   1      
  10   1          watch=SMB0STA;
  11   1      
  12   1              smbus_ms_cnt = 0;//无中断豪秒计数器,在SMBUS中断清0
  13   1              switch (watch)                    
  14   1                                                      //SMBUS状态寄存器SMB0STA
  15   1          {                    
  16   2                                              
  17   2              case 0x08:                      //主发送/接收:起始条件已发出.
  18   2                              STA = 0;                                //人工清除起始位STA
  19   2                              iic_error_flag = 0;     //iic_error_flag=1说明SMBus有问题
  20   2                              AA = 1;                
  21   2                              iic_data_count = 0;
  22   2                              SMB0DAT = slave_add;    //从地址+读/写标志送SMB0DAT,
  23   2                              break;        
  24   2              
  25   2              case 0x10:                              //主发送/接收:重复起始条件已发出。
  26   2                              STA = 0;                                        //人工清除起始位STA
  27   2                              AA = 1;            
  28   2                                  
  29   2                              SMB0DAT = slave_add;            //从地址+读/写标志送SMB0DAT
  30   2      
  31   2                              iic_data_len = iic_data_len+iic_data_count;
  32   2                              iic_buf_p = iic_buf_p - iic_data_count;
  33   2                              iic_data_count = 0;
  34   2                              break;
  35   2      
  36   2              case 0x18:                                      //主发送器:从地址+写标志已发出,收到ACK
  37   2                      if((slave_add&0xfe) == 0xa0)    //如果是存储器操作
  38   2                              {
  39   3                                      //发送MEMORY地址高字节
  40   3                                      SMB0DAT = iic_ram_add;  //>>8;
  41   3                              }
  42   2                              else
  43   2                              {
  44   3                                      SMB0DAT = iic_ram_add;
  45   3                              }
  46   2      
  47   2                              iic_add_count = 0;   //1;
  48   2                              write_start_num = 0;
  49   2                              break;        
  50   2          
  51   2              case 0x20:                                                                      //主发送器:从地址+写标志已发出,收到NACK
  52   2                              write_start_num++;
  53   2                      
  54   2                              if(write_start_num>5)                   //如果超过5次不成功则释放总线
C51 COMPILER V7.50   SMBUS                                                                 06/10/2007 23:11:21 PAGE 2   

  55   2                              {
  56   3                                      STO = 1;
  57   3                                      sm_busy = 0;
  58   3                                      iic_error_flag = 1;
  59   3                              }  
  60   2                      else                                                    //确认查询重复,置位STO+STA。
  61   2                              {
  62   3                                      STO = 1;
  63   3                                      STA = 1;
  64   3                              }                
  65   2      
  66   2                      break;
  67   2      
  68   2              case 0x28:              //数据字节已发出,收到ACK,将下一字节装入SMB0DAT;
  69   2                                                                      //判断,如果是存储器操作,则判断是否发送完2个字节地址
  70   2                              if(((iic_add_count == 1)&&(slave_add&0xfe) == 0xa0))
  71   2                              {
  72   3                                      //发送MEMORY地址低字节
  73   3                                      SMB0DAT = iic_ram_add;
  74   3                                      iic_add_count = 0;
  75   3                              }
  76   2                              else
  77   2                              {
  78   3                                      switch(iic_data_len)
  79   3                                      {
  80   4                                              case 0x00:                                      //如果数据已经发送结束则释放总线    
  81   4                                                      STO=1;
  82   4                                                      sm_busy=0;                                        
  83   4                                                      break;    
  84   4      
  85   4                                              default  :
  86   4                                                      SMB0DAT = *iic_buf_p;
  87   4                                                      iic_buf_p++;
  88   4                                                      iic_data_count++;
  89   4                                                      iic_data_len--;    
  90   4                                                      break;
  91   4                                      }
  92   3                              }
  93   2      
  94   2                      break;
  95   2      
  96   2              case 0x30:                      //主发送器:数据字节已发出,收到NACK,
  97   2                      write_start_num++;
  98   2                      if(write_start_num>5)   //如果超过5次不成功则释放总线 
  99   2                      {
 100   3                              STO=1;
 101   3                              sm_busy=0;
 102   3                              iic_error_flag=1;
 103   3                      }
 104   2                      else                                    //重试传输或置位STO
 105   2                      {
 106   3                              STO=1;
 107   3                              STA=1;
 108   3                      }
 109   2                      break;
 110   2      
 111   2              case 0x38:                               //主发送器:竞争失败,保存当前数据
 112   2                      write_start_num++;
 113   2      
 114   2                      if(write_start_num>5)                           //如果超过5次不成功则释放总线 
 115   2                      {
 116   3                              STO=1;
C51 COMPILER V7.50   SMBUS                                                                 06/10/2007 23:11:21 PAGE 3   

 117   3                              sm_busy=0;
 118   3                              iic_error_flag=1;
 119   3                      }  
 120   2                      else
 121   2                      {
 122   3                              STO=1;
 123   3                              STA=1;
 124   3                      }
 125   2      
 126   2                      break;
 127   2      
 128   2              case 0x40:    
 129   2                      read_start_num=0;                   //主接收器:从地址+读标志已发出,收到ACK,
 130   2                      if(iic_data_len<2)                                      //如果只接收一个字节,清AA位(收到字节后发NACK),等待接收数据
 131   2                      {
 132   3                              AA=0;
 133   3                      }          
 134   2                      break;
 135   2      
 136   2              case 0x48:                               //主接收器:从地址+读标志已发出,收到NACK,
 137   2                      read_start_num++;
 138   2                      if(read_start_num>5)                                    //如果超过5次不成功则释放总线
 139   2                      {
 140   3                              STO=1;
 141   3                              sm_busy=0;
 142   3                              iic_error_flag=1;
 143   3                      }
 144   2                      else                                                                    //确认查询重复,置位STO+STA。
 145   2                      {
 146   3                              STO=1;
 147   3                              STA=1;
 148   3                      }
 149   2                      break; 
 150   2                                                             
 151   2              case 0x50:                                //主接收器:数据字节收到,ACK已发出;读SMB0DAT,等待
 152   2                      //iic_data_buf[iic_data_count++]=SMB0DAT;
 153   2                      *iic_buf_p = SMB0DAT;
 154   2                      iic_buf_p++;
 155   2                      iic_data_count++;
 156   2                      iic_data_len--;
 157   2      
 158   2                   if(iic_data_len<2)
 159   2                      {
 160   3                              AA=0;             //下一个字节,如下一个字节是最后字节,清除AA。
 161   3                      }
 162   2                      break;
 163   2      
 164   2              case 0x58:                                  //主接收器:数据字节收到,NACK已发出,置位STO。
 165   2                   //iic_data_buf[iic_data_count++]=SMB0DAT; //读操作已经完成,读数据寄存器并且发出STOP.
 166   2                      *iic_buf_p = SMB0DAT;
 167   2                      iic_buf_p++;
 168   2                      iic_data_count++;
 169   2                      iic_data_len--;
 170   2                      STO=1;sm_busy=0;                        //Free SMBus    
 171   2                      break;
 172   2      
 173   2              default:                                                                        //Reset communication.
 174   2                      STO=1;
 175   2                      sm_busy=0;
 176   2                      iic_error_flag=1;                   
 177   2                      break;
 178   2          }
C51 COMPILER V7.50   SMBUS                                                                 06/10/2007 23:11:21 PAGE 4   

 179   1      
 180   1              SI=0;                                             //clear interrupt flag
 181   1      
 182   1              //SFRPAGE = sfrpage_save;
 183   1      
 184   1      }
 185          
 186          


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