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

📄 smbus.lst

📁 书中详细说明了多路数据采集的方法,以及怎么样用AD来采集数据哟,大家不妨看看嘛,说不定有所帮助哟?
💻 LST
字号:
C51 COMPILER V7.50   SMBUS                                                                 03/17/2007 10:53:09 PAGE 1   


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

line level    source

   1          /***************************************Copyright (c)*************************************
   2          **
   3          /*--------------文件信息------------------------------------------------------------------  
   4          **文 件 名:SMBUS.C 
   5          **创 建 人:王胜
   6          **日    期:2007年2月4日  
   7          **描    述:
   8          **         本库函数可实现I2C总线一次读/写多个字节操作,将这两个文件复制到您的工程目录下,在
   9          **         主函数中使用头文件包含语句  #include "SMBUS.h" 即可,其中包含三个函数:
  10          **
  11          **         SMBUS初始化函数:
  12          **         void SMBus_Init(void);
  13          **
  14          **         多个字节数据的发送函数:
  15          **         void SMBUS_Puts(
  16          **                            unsigned char chip,
  17          **                                                    unsigned char wordadr,
  18          **                                                    char *dat,
  19          **                                                    unsigned char number
  20          **                                                );
  21          **
  22          **         多个字节数据的读取函数:
  23          **         void SMBUS_Gets(
  24          **                            unsigned char chip,
  25          **                                                        unsigned char wordadr,
  26          **                                                        char *dat,
  27          **                                                        unsigned char number
  28          **                                                );
  29          **
  30          **         输入变量定义如下:
  31          **         chip    : 为I2C器件从地址,本实验板3个I2C器件(ZLG7290,24C02,PCF8563)的从地址定义             
             -    
  32          **                  (不包括R/W的控制)在头文件"SMBUS.h"中有定义。
  33          **         wordadr : 为I2C器件内部寄存器从器件子地址。
  34          **         dat     : 为读/写数据指针,当为读取时,通过指针直接修改变量的值。
  35          **         number  : 为每次读/写数据的字节数。
  36          *******************************************************************************************/
  37          
  38          #include <c8051f020.h>
  39          
  40          //与SMBUS操作有关变量定义
  41          bit SM_BUSY;                       //SMB0忙标志位.
  42          unsigned char SMBMODE;             //SMB0读写控制字CHIP_SELECT+R/W.
  43          unsigned char SMB_num;             //SMB0一次读写的字节数..
  44          unsigned char start_adr;           //SMB0读写字节在器件中的起始地址.
  45          char          *SMB_Dat;            //SMBUS中断传输数据指针
  46          
  47          /******************************************************************************************/ 
  48          /*函数名称:SMBus_Init()                                                                  */
  49          /*函数功能:SMBus初始化函数                                                               */
  50          /*输入参数:无                                                                            */
  51          /*输出参数:无                                                                            */
  52          /******************************************************************************************/ 
  53          void SMBus_Init(void)       
  54          {
C51 COMPILER V7.50   SMBUS                                                                 03/17/2007 10:53:09 PAGE 2   

  55   1          SMB0CN    = 0x44;  //允许SMBUS, 应答返回AA(低电平有效)
  56   1          SMB0CR    = 0x00;  //配置传送速度为42Kbit/s
  57   1          EIE1     |= 0x02;  //使能SMBUS中断
  58   1          EIP1     |= 0x02;  //设置SMBUS中断为高优先级
  59   1      }
  60                                                                  
  61          /******************************************************************************************/
  62          /*函数名称:SMBUS_Puts()                                                                  */
  63          /*函数功能:SMBUS 总线综合发送函数,向从机发送number个字节的数据                          */
  64          /*入口参数:chip     从机地址(7位纯地址,不含读写位)                                      
  65                      wordadr  从机的子地址
  66                                  data     待发送的数据指针 
  67                                  number   发送数据的字节数                                                     */                       
             -                              
  68          /*出口参数:无                                                                            */
  69          /******************************************************************************************/
  70          
  71          void SMBUS_Puts(unsigned char chip,unsigned char wordadr,char *dat,unsigned char number)
  72          {  
  73   1         SI = 0;
  74   1         SMB_num=number;          // 确定写数据大小
  75   1         while (SM_BUSY);         // 若SMBUS忙碌就等待
  76   1         SM_BUSY = 1;             // SM_BUSY是忙碌标志位 
  77   1         SMBMODE=chip & 0xfe;
  78   1         start_adr=wordadr;       // 装载写字节起始地址
  79   1         SMB_Dat= dat;
  80   1         STO = 0;
  81   1         STA = 1;  
  82   1         while (SM_BUSY);
  83   1      }
  84           
  85          /******************************************************************************************/
  86          /*函数名称:SMBUS_Gets()                                                                  */
  87          /*函数功能:SMBUS 总线综合接收函数,从从机接收number个字节的数据                          */
  88          /*入口参数:chip     从机地址(7位纯地址,不含读写位)                                      
  89                      wordadr  从机的子地址
  90                                  *data    保存接收到的数据 
  91                                  number   读取数据的字节数                                                     */                       
             -                              
  92          /*出口参数:无                                                                            */
  93          /******************************************************************************************/  
  94          
  95          void SMBUS_Gets(unsigned char chip,unsigned char wordadr,char *dat,unsigned char number)
  96          {
  97   1         SI = 0;
  98   1         SMB_num = number;          //确定写数据大小
  99   1         while (SM_BUSY);           // 若SMBUS忙碌就等待
 100   1         SM_BUSY = 1;               // SM_BUSY是忙碌标志位 
 101   1         SMBMODE = chip | 0x01;   
 102   1         start_adr = wordadr;       //装载写字节起始地址
 103   1         SMB_Dat =dat;    
 104   1         STO = 0;
 105   1         STA = 1; 
 106   1         while (SM_BUSY); 
 107   1      }
 108          
 109          //SMBUS中断服务函数
 110          void SMBUS_ISR (void) interrupt 7
 111          {
 112   1         switch (SMB0STA)
 113   1         {                  
 114   2            case  0x08:                                           //(MT & MR) 发送起始位
C51 COMPILER V7.50   SMBUS                                                                 03/17/2007 10:53:09 PAGE 3   

 115   2               SMB0DAT = (SMBMODE & 0xFE);    //发送从器件地址 + W
 116   2               STA = 0;                      
 117   2               break;
 118   2            case  0x10:                                       //(MT & MR) 重复起始位
 119   2               SMB0DAT = (SMBMODE | 0x01);    // 发送从器件地址 + R.
 120   2               STA = 0;
 121   2               break;
 122   2            case 0x18:                                        //(MT) 发送从地址 + W 后收到ACK
 123   2               SMB0DAT = start_adr;           // 发送SMB0读写字节在器件中的起始地址.
 124   2               break;
 125   2            case  0x20:                                       //(MT) 发送从地址 + W 后收到NACK
 126   2               STO = 1;
 127   2               STA = 1;
 128   2               break;
 129   2            case  0x28:                                           //(MT) 发送数据后收到ACK
 130   2               if(SMB_num)
 131   2                       {                                                          
 132   3                   if (SMBMODE & 0x01)        // 如果为读操作则重新启动总线.
 133   3                               {     
 134   4                       STO = 0;
 135   4                       STA = 1;
 136   4                        } 
 137   3                               else 
 138   3                               { 
 139   4                       SMB0DAT = *SMB_Dat;   //如果为写操作则将数据写入SMB0DAT.
 140   4                       SMB_Dat++;             
 141   4                                       SMB_num--;
 142   4                    }
 143   3                }
 144   2                       else           //如果数据写入完毕则发送停止信号.
 145   2                       { 
 146   3                   STO = 1;
 147   3                   SM_BUSY = 0; 
 148   3                }
 149   2               break;
 150   2            case  0x30:       //(MT) 发送数据后收到NACK
 151   2               STO = 1;
 152   2               STA = 1;
 153   2               break;
 154   2            case  0x38 :          //(MT)竞争失败
 155   2               STO = 1;
 156   2               STA = 1;
 157   2               break;
 158   2            case  0x40:       //(MR) 发送从地址 + R 后收到 ACK
 159   2               if(SMB_num==1) //如果只读一个字节则将应答位AA清0,
 160   2                        AA = 0;       //收到数据以后不发送应答位               
 161   2               else
 162   2                       AA = 1;        //如果读字节数大于1则收到数据以后发送应答位
 163   2               break;
 164   2            case  0x48:           //(MR) 发送从地址 + R 后收到 NACK
 165   2               STO = 0;
 166   2               STA = 1;
 167   2               break;
 168   2            case  0x50:               //(MR) 收到数据字节 后已发送ACK  
 169   2                       if(SMB_num>2)
 170   2                       {                                                               
 171   3                  *SMB_Dat = SMB0DAT;  
 172   3                  SMB_Dat++;
 173   3                              SMB_num--;
 174   3                              AA=1;           
 175   3                }
 176   2                       else if(SMB_num ==2)
C51 COMPILER V7.50   SMBUS                                                                 03/17/2007 10:53:09 PAGE 4   

 177   2                       { 
 178   3                               *SMB_Dat = SMB0DAT;  
 179   3                   SMB_Dat++;
 180   3                               SMB_num--;
 181   3                               AA=0;
 182   3                }                  
 183   2                break;
 184   2            case  0x58:         //(MR) 收到数据字节 后已发送NACK 
 185   2               *SMB_Dat = SMB0DAT;
 186   2               STO = 1;
 187   2               SM_BUSY = 0;                   
 188   2               break;
 189   2            default:
 190   2               STO = 1;                         
 191   2               SM_BUSY = 0;
 192   2               break;
 193   2            }
 194   1           SI=0;    // 清除中断标志
 195   1       }
 196          
 197          
 198          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    332    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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