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

📄 i2c.lst

📁 单片机开发列程
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V8.01   I2C                                                                   09/30/2007 11:14:56 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c LARGE BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS

line level    source

   1          #define __I2C_H__
   2          
   3          #include "Config.h"
   4          
   5          #define SLA24CL04  0xA4     //1010,0(A2)1(A1)0(高半叶)0  低256字节
   6          
   7          #define SLA3104Mem 0xA0     //1010,*(无关位)0(A1)0(A0)0
   8          #define SLA3104RTC 0xD0     //1101,*(无关位)0(A1)0(A0)0
   9          
  10          /********************************************************************************************************
  11          函数名称:I2CMasterInit
  12          函数功能:初始化I2C模块
  13          输    入:无
  14          输    出:无
  15          ********************************************************************************************************/
  16          void I2CMasterInit(void)
  17          {
  18   1          PERIPHEN1 |= BIT5;      //使能I2C外设模块
  19   1      
  20   1          I2CTIMING  = 0x0C;      //大概100KHz
  21   1          I2CCONFIG  = 0x01;      //主模式
  22   1      
  23   1      }
  24          /********************************************************************************************************
  25          函数名称:WaitTxEmpty
  26          函数功能:等待发送空
  27          输    入:无
  28          输    出:无
  29          ********************************************************************************************************/
  30          void WaitTxEmpty(void)
  31          {
  32   1          #ifdef DOWNLOAD
  33   1              while((I2CSTATUS & BIT0) == 0x00);
  34   1          #endif
  35   1      }
  36          
  37          /********************************************************************************************************
  38          函数名称:WaitRxAvailable
  39          函数功能:等待接收完毕
  40          输    入:无
  41          输    出:无
  42          ********************************************************************************************************/
  43          void WaitRxAvailable(void)
  44          {
  45   1          #ifdef DOWNLOAD
  46   1              while((I2CSTATUS & BIT1) == 0x00);
  47   1          #endif
  48   1      }
  49          
  50          /********************************************************************************************************
  51          函数名称:WaitI2CIdle
  52          函数功能:等待I2C总线空闲
  53          输    入:无
  54          输    出:无
  55          ********************************************************************************************************/
C51 COMPILER V8.01   I2C                                                                   09/30/2007 11:14:56 PAGE 2   

  56          void WaitI2CIdle(void)
  57          {
  58   1          #ifdef DOWNLOAD
  59   1              while((I2CSTATUS & BIT3) == 0x00);
  60   1          #endif
  61   1      }
  62          
  63          /********************************************************************************************************
  64          **函数名称:I2CNByteRecv
  65          **函数功能:I2C总线向有子地址器件读取多字节数据函数
  66              **输    Sla         从机地址;
  67          **          SubAddr     丛机子地址;
  68          **          pRecvBuf    待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
  69          **          Num         待发送数据的字节数
  70          **输    出:返回0表示操作失败,返回1表示操作成功
  71          ********************************************************************************************************/
  72          uchar I2CNByteRecv(uchar Sla, uint SubAddr, uchar *pRecvBuf, uint Num)
  73          {
  74   1          I2CRXTX = Sla;                          //写从机地址,发送写命令
  75   1          WaitTxEmpty();                          //等待发送完成
  76   1          I2CRXTX = (uchar)(SubAddr >> 8);
  77   1          WaitTxEmpty();                          //等待发送完成
  78   1          I2CRXTX = (uchar)(SubAddr & 0xFF);
  79   1          WaitTxEmpty();                          //等待发送完成
  80   1          
  81   1          WaitI2CIdle();                          //等待总线空闲(这将产生一个停止)
  82   1      
  83   1          I2CRXTX = Sla + 1;                      //发送读命令,重新启动总线
  84   1          WaitTxEmpty();                          //等待发送完成
  85   1          
  86   1          for(; Num > 1; Num --)
  87   1          {
  88   2              WaitRxAvailable();                  //等待接收数据完成
  89   2              *pRecvBuf = I2CRXTX;
  90   2              pRecvBuf ++;
  91   2          }
  92   1      
  93   1          I2CCONFIG |= BIT1;                      //接收完最后一个数据发送非应答
  94   1          WaitRxAvailable();                      //等待接收数据完成
  95   1          *pRecvBuf = I2CRXTX;
  96   1      
  97   1          I2CCONFIG &= ~BIT1;                     //接收完最后一个数据发送非应答
  98   1          WaitI2CIdle();
  99   1      
 100   1          return 1;
 101   1      }
 102          
 103          /********************************************************************************************************
 104          **函数名称:I2CNByteSend
 105          **函数功能:I2C 总线向有子地址器件发送多字节数据函数
 106          **输    入:    Sla         从机地址;
 107          **              SubAddr     丛机子地址;
 108          **              pStr        待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
 109          **              Num         待发送数据的字节数
 110          **输    出: 返回0表示操作失败,返回1表示操作成功
 111          ********************************************************************************************************/
 112          uchar I2CNByteSend(uchar Sla, uint SubAddr, uchar *pSendBuf, uint Num)
 113          {                                           
 114   1          I2CRXTX = Sla;                          //写从机地址,发送写命令
 115   1          WaitTxEmpty();                          //等待发送完成
 116   1          I2CRXTX = (uchar)(SubAddr >> 8);
 117   1          WaitTxEmpty();                          //等待发送完成
C51 COMPILER V8.01   I2C                                                                   09/30/2007 11:14:56 PAGE 3   

 118   1          I2CRXTX = (uchar)(SubAddr & 0xFF);
 119   1          WaitTxEmpty();                          //等待发送完成
 120   1      
 121   1          for(; Num > 0; Num --)
 122   1          {
 123   2              I2CRXTX = *pSendBuf;
 124   2              pSendBuf ++;
 125   2              WaitTxEmpty();                      //等待发送完成
 126   2          }
 127   1      
 128   1          WaitI2CIdle();
 129   1          return 1;
 130   1      }
 131          
 132          
 133          /********************************************************************************************************
 134          24CL04的读写有一些特殊故单写出来
 135          ********************************************************************************************************/
 136          /********************************************************************************************************
 137          **函数名称:FM24CL04NByteRecv
 138          **函数功能:I2C总线向有子地址器件读取多字节数据函数
 139          **输    入:Sla         从机地址;
 140          *           SubAddr     丛机子地址;
 141          *           pRecvBuf    待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
 142          *           Num         待发送数据的字节数
 143          **输    出:返回0表示操作失败,返回1表示操作成功
 144          ********************************************************************************************************/
 145          uchar FM24CL04NByteRecv(uchar Sla, uint SubAddr, uchar *pRecvBuf, uint Num)
 146          {
 147   1          uchar UserSla;    
 148   1      
 149   1          if(SubAddr <= 0xFF)                     //写低页数据
 150   1          {
 151   2              UserSla = Sla;                      //保存从机地址
 152   2      
 153   2              I2CRXTX = Sla;                      //写从机地址,发送写命令
 154   2              WaitTxEmpty();                      //等待发送完成
 155   2              I2CRXTX = (uchar)(SubAddr & 0xFF);
 156   2              WaitTxEmpty();                      //等待发送完成
 157   2          }
 158   1          else
 159   1          {
 160   2              UserSla = (Sla | BIT1);             //保存从机地址
 161   2      
 162   2              I2CRXTX = (Sla | BIT1);             //写从机地址,发送写命令,选择低半页,256字节
 163   2              WaitTxEmpty();                      //等待发送完成
 164   2              I2CRXTX = (uchar)(SubAddr & 0xFF);  //低八位地址
 165   2              WaitTxEmpty();                      //等待发送完成
 166   2          }
 167   1      
 168   1          WaitI2CIdle();
 169   1      
 170   1          I2CRXTX = UserSla + 1;                  //发送读命令,重新启动总线
 171   1          
 172   1          WaitTxEmpty();                          //等待发送完成
 173   1          
 174   1          for(; Num > 1; Num --)
 175   1          {
 176   2              WaitRxAvailable();                  //等待接收数据完成
 177   2              *pRecvBuf = I2CRXTX;
 178   2              pRecvBuf ++;
 179   2          }
C51 COMPILER V8.01   I2C                                                                   09/30/2007 11:14:56 PAGE 4   

 180   1      
 181   1          I2CCONFIG |= BIT1;                      //接收完最后一个数据发送非应答
 182   1          WaitRxAvailable();                      //等待接收数据完成
 183   1          *pRecvBuf = I2CRXTX;
 184   1      
 185   1          I2CCONFIG &= ~BIT1;                   //接收完最后一个数据发送非应答
 186   1          WaitI2CIdle();
 187   1          return 1;
 188   1      }
 189          
 190          /********************************************************************************************************
 191          **函数名称:FM24CL04NByteSend
 192          **函数功能:I2C 总线向有子地址器件发送多字节数据函数
 193          **输    入:Sla         从机地址;
 194          *           SubAddr     丛机子地址;
 195          *           pStr        待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
 196          *           Num         待发送数据的字节数
 197          **输    出:返回0表示操作失败,返回1表示操作成功
 198          ********************************************************************************************************/
 199          uchar FM24CL04NByteSend(uchar Sla, uint SubAddr, uchar *pSendBuf, uint Num)
 200          {
 201   1          if(SubAddr <= 0xFF)                     //写低页数据
 202   1          {
 203   2              I2CRXTX = Sla;                      //写从机地址,发送写命令
 204   2              WaitTxEmpty();                      //等待发送完成
 205   2              I2CRXTX = (uchar)(SubAddr & 0xFF);
 206   2              WaitTxEmpty();                      //等待发送完成
 207   2          }
 208   1          else
 209   1          {
 210   2              I2CRXTX = (Sla | BIT1);             //写从机地址,发送写命令,选择低半页,256字节
 211   2              WaitTxEmpty();                      //等待发送完成
 212   2              I2CRXTX = (uchar)(SubAddr & 0xFF);  //低八位地址
 213   2              WaitTxEmpty();                      //等待发送完成
 214   2          }
 215   1      
 216   1          for(; Num > 0; Num --)
 217   1          {
 218   2              I2CRXTX = *pSendBuf;
 219   2              pSendBuf ++;
 220   2              WaitTxEmpty();                      //等待发送完成
 221   2          }
 222   1      
 223   1          WaitI2CIdle();
 224   1          return 1;
 225   1      }
 226          /********************************************************************************************************
 227          **函数名称:FM24CL04Test
 228          **函数功能:24CL04数据存储器测试
 229          **输    入:无
 230          **输    出:无
 231          ********************************************************************************************************/
 232          void FM24CL04Test(void)
 233          {
 234   1          //------------------------------------------------------------
 235   1          //I2C接口存储器FM24CL04测试使用到的变量
 236   1          //------------------------------------------------------------
 237   1          uint  Addr;
 238   1          uchar DatWR;                        //写入的数据
 239   1          uchar xdata WRStore[512] = {0};     //写入数据存储的数组
 240   1          uchar xdata RDStore[512] = {0};     //读取的数据存储殊组
 241   1          //------------------------------------------------------------
C51 COMPILER V8.01   I2C                                                                   09/30/2007 11:14:56 PAGE 5   

 242   1      
 243   1          Addr = 0x0000;              //24CL04的地址计数器
 244   1      
 245   1          UART0_Printf("\n ->FM24CL04 test begin! \n");
 246   1          //------------------------------------------------------------
 247   1          //先将待写的数据存储,方便用写多字节的方法一次写入
 248   1          //------------------------------------------------------------
 249   1          for(Addr = 0x00; Addr < 512; Addr ++)
 250   1          {
 251   2              DatWR = (int)rand();
 252   2              WRStore[Addr] = DatWR;     
 253   2          }
 254   1          FM24CL04NByteSend(SLA24CL04, 0x00, WRStore, 512);
 255   1      
 256   1          #ifdef FM24CL04DATASHOW
                      UART0_Printf("\n\n Write to 0x:%x \n",0x0000);
                      for(Addr = 0x00; Addr < 512; Addr ++)
                      {
                          UART0_Printf(" %d ",(int)WRStore[Addr]);
                      }
                  #endif
 263   1                      
 264   1          //------------------------------------------------------------
 265   1          //读出所有的数据并存起来,下面将其写入的数据挨个比较
 266   1          //------------------------------------------------------------
 267   1          FM24CL04NByteRecv(SLA24CL04, 0x00, RDStore, 512);
 268   1          
 269   1          #ifdef FM24CL04DATASHOW
                      UART0_Printf("\n\n Read from 0x:%x \n",0x0000);
                      for(Addr = 0x00; Addr < 512; Addr ++)
                      {
                          UART0_Printf(" %d ",(int)RDStore[Addr]);
                      }
                  #endif
 276   1          for(Addr = 0x00; Addr < 512; Addr ++)  //检查是否有错误
 277   1          {
 278   2              if(RDStore[Addr] == WRStore[Addr])
 279   2              {;}
 280   2              else

⌨️ 快捷键说明

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