C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 1   


C51 COMPILER V9.52.0.0, COMPILATION OF MODULE FU6812_I2C
OBJECT MODULE PLACED IN .\Output\FU6812_I2C.obj
COMPILER INVOKED BY: F:\keil\C51\BIN\C51.EXE ..\User\Source\Hardware\FU6812_I2C.c LARGE OMF2 WARNINGLEVEL(0) BROWSE INCD
                    -IR(..\Library\FU68xx_Hardware_Driver\Include;..\User\Include) DEBUG PRINT(.\Listing\FU6812_I2C.lst) OBJECT(.\Output\FU68
                    -12_I2C.obj)

line level    source

   1          //////////////////////////////////////////////////////////////////////
   2          //文件名：FU6802_I2C.c                                              //
   3          //说明：FU68系列芯片的I2C底层驱动                                   //
   4          //Log                                                               //
   5          //Timer         Writer      Thing                               Ver //
   6          //2017-02-07    Any         由FU68xx_UART.c移植过来             V1.0//
   7          //2017-02-07    Any         把使能、启动和停止函数extern        V1.1//
   8          //2017-02-16    Any         从机地址修改为直接输入要发送的地址  V1.2//
   9          //2017-07-28    Any         配置I2C在头文件里配置               V1.3//
  10          //                          I2C使能由两个宏定义控制                 //
  11          //2017-07-31    Any         I2C应答由两个宏控制                 V1.4//
  12          //                          删除I2C位操作函数                       //
  13          //                          I2C地址设定改由宏设置                   //
  14          //                          删除单字节读写函数                      //
  15          //                          I2C地址设定改由宏设置                   //
  16          //                          添加从机地址初始化                      //
  17          //////////////////////////////////////////////////////////////////////
  18          
  19          #include <FU68xx_2.h>
  20          #include <Myproject.h>
  21          #include <Customer_Debug.h>
  22          #include "FU68xx_Sys.h"
  23          //#include <FU6812_Config.h>
  24          
  25          /**
  26           * 初始化I2C配置
  27           *
  28           */
  29          void Init_I2C(void)
  30          {
  31   1          I2C_CR = 0x00
  32   1          #if defined(I2C_MASTER)                 //I2C被配置为主机模式时进行以下配置
  33   1              | I2CMS | I2C_SPEED                //配置I2C作为主机，并设置速度
  34   1          #endif
  35   1      
  36   1          #if defined(EN_IRQ_I2C)                 //I2C中断使能时进行以下配置
                      | I2CIE                             //使能I2C中断
                  #endif
  39   1      
  40   1          #if defined(I2C_LPF)                    //当I2C启用提高滤波宽度时进行以下配置
                      | I2CFMOD                           //提高滤波宽度
                  #endif
  43   1          ;
  44   1      
  45   1          #if !defined(I2C_MASTER)                //当I2C为从机时进行以下配置
                      I2C_ID = I2C_ADDR7 << 1;            //配置本机I2C地址
                  #endif
  48   1      }
  49          
  50          /**
  51           * 启动I2C传输
  52           *
  53           * @param   rw         读写标志位
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 2   

  54           *                     0：I2C写
  55           *                     1：I2C读
  56           */
  57          void Start_I2C(bool rw)
  58          {
  59   1          if (rw) I2C_SR = I2CSTA | DMOD;
  60   1          else    I2C_SR = 0x10;
  61   1      
  62   1          while (!ReadBit(I2C_SR, STR));
  63   1      }
  64          
  65          /**
  66           * 发送停止信号
  67           *
  68           */
  69          void Stop_I2C(void)
  70          {
  71   1          SetBit(I2C_SR, I2CSTP);
  72   1          ClrBit(I2C_SR, STR);
  73   1          while (ReadBit(I2C_SR, I2CSTP));
  74   1      }
  75          
  76          /**
  77           * I2C发送数据
  78           *
  79           * @param   Dat        要发送的数据
  80           */
  81          void Send_I2C(uint8 Dat)
  82          {
  83   1          I2C_DR = Dat;
  84   1          ClrBit(I2C_SR, STR);
  85   1          while (!ReadBit(I2C_SR, STR));
  86   1      }
  87          
  88          /**
  89           * 接收数据
  90           *
  91           * @return             收到的数据
  92           */
  93          uint8 Receive_I2C(void)
  94          {
  95   1          ClrBit(I2C_SR, STR);
  96   1          while (!ReadBit(I2C_SR, STR));
  97   1          return I2C_DR;
  98   1      }
  99          
 100          /**
 101           * 写入一包数据
 102           *
 103           * @param   addr7      从机的7位地址
 104           * @param   reg        寄存器首地址
 105           * @param   len        数据包长度
 106           * @param   dat        数据包数组指针
 107           *
 108           * @return             反馈I2C状态
 109           *                     I2C_FA_ADD： 写过程启动信号发送失败
 110           *                     I2C_FA_REG： 写寄存器失败
 111           *                     I2C_FA_DAT： 写数据失败
 112           *                     I2C_SU：     写成功
 113           */
 114          uint8 Write_I2C(uint8 addr7, uint8 reg, uint8 len, uint8* dat)
 115          {
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 3   

 116   1          uint8 i;
 117   1      
 118   1          Enable_I2C();                                              //使能I2C
 119   1      
 120   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 121   1      
 122   1          #if defined(I2C_AUTO_ADDR)                                 //与从设备相关，详见头文件
 123   1              Start_I2C(false);                                      //发送启动信号、地址和写信号
 124   1              if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;      //读取应答信号，判断是否发送成功
 125   1      
 126   1              Send_I2C(reg);                                         //发送寄存器地址
 127   1              if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;      //读取应答信号，判断是否发送成功
 128   1      
 129   1              for (i = 0; i != len; i++)
 130   1              {
 131   2                  Send_I2C(*dat);                                    //发送数据
 132   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_DAT;  //读取应答信号，判断是否发送成功
 133   2                  dat++;
 134   2              }
 135   1      
 136   1              Stop_I2C();
 137   1          #else
                      for (i = 0; i != len; i++)
                      {
                          Start_I2C(false);
                          if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
              
                          Send_I2C(reg);
                          if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
              
                          Send_I2C(*dat);
                          if (ReadBit(I2C_SR, NACK)) return I2C_FA_DAT;
              
                          dat++;
                          reg++;
              
                          Stop_I2C();
                      }
                  #endif
 155   1      
 156   1      
 157   1          Disable_I2C();
 158   1      
 159   1          return I2C_SU;
 160   1      }
 161          
 162          /**
 163           * 读出一包数据
 164           *
 165           * @param  addr7  从机7位地址
 166           * @param  reg    第一个读出的寄存器
 167           * @param  len    读出的数据长度
 168           * @param  dat    读出的数据包
 169           *
 170           * @return             反馈I2C状态
 171           *                     I2C_FA_ADD： 写过程启动信号发送失败
 172           *                     I2C_FA_REG： 写寄存器失败
 173           *                     I2C_FA_DAT： 写数据失败
 174           *                     I2C_SU：     写成功
 175           */
 176          uint8 Read_I2C(uint8 addr7, uint8 reg, uint8 len, uint8* dat)
 177          {
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 4   

 178   1          uint8 i;
 179   1      
 180   1          Enable_I2C();                                              //使能I2C
 181   1      
 182   1      
 183   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 184   1      
 185   1      
 186   1          #if defined(ADDR_AUTO_ADD)                                 //与从设备相关，详见头文件
              
                      Start_I2C(false);                                      //发送启动信号、地址和写信号
                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;      //读取应答信号，判断是否发送成功
              
              
                      Send_I2C(reg);                                         //发送寄存器地址
                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;      //读取应答信号，判断是否发送成功
              
              
                      Start_I2C(true);                                       //发送启动信号、地址和读信号
                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
              
                      for (i = 0; i != len; i++)
                      {
                          *dat = Receive_I2C();
              
                          if (i == (len - 1)) Set_Ack_I2C();
                          else                Set_Nack_I2C();
              
                          dat++;
                      }
              
                      Stop_I2C();
                  #else
 211   1              for (i = 0; i != len; i++)
 212   1              {
 213   2                  Start_I2C(false);
 214   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 215   2      
 216   2                  Send_I2C(reg);
 217   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
 218   2      
 219   2                  Start_I2C(true);
 220   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 221   2      
 222   2                  *dat = Receive_I2C();
 223   2                  Set_Nack_I2C();
 224   2      
 225   2                  dat++;
 226   2                  reg++;
 227   2      
 228   2                  Stop_I2C();
 229   2              }
 230   1          #endif
 231   1      
 232   1          Disable_I2C();
 233   1      
 234   1          return I2C_SU;
 235   1      }
 236          
 237          uint8 Write_I2C_Byte(uint8 addr7, uint8 reg, uint8 date)
 238          {
 239   1          Enable_I2C();                                              //使能I2C
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 5   

 240   1      
 241   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 242   1      
 243   1                      Start_I2C(false);
 244   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 245   1      
 246   1                      Send_I2C(reg);
 247   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
 248   1      
 249   1                      Send_I2C(date);
 250   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_DAT;
 251   1      
 252   1      
 253   1                      Stop_I2C();
 254   1      
 255   1      
 256   1          Disable_I2C();
 257   1      
 258   1          return I2C_SU;
 259   1      }
 260          
 261          uint8 Read_I2C_Byte(uint8 addr7, uint8 reg, uint8* dat)
 262          {
 263   1          Enable_I2C();                                              //使能I2C
 264   1      
 265   1      
 266   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 267   1      
 268   1      
 269   1                      Start_I2C(false);
 270   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 271   1      
 272   1                      Send_I2C(reg);
 273   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
 274   1      
 275   1                      Start_I2C(true);
 276   1                      if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 277   1      
 278   1                      *dat = Receive_I2C();
 279   1                      Set_Nack_I2C();
 280   1      
 281   1                      Stop_I2C();
 282   1      
 283   1          Disable_I2C();
 284   1      
 285   1          return I2C_SU;
 286   1      }
 287          
 288          
 289          void MPU6060_Init(void)
 290          {
 291   1              Write_I2C_Byte(SlaveAddress >> 1, PWR_MGMT_1, 0x00);
 292   1              Write_I2C_Byte(SlaveAddress >> 1, SMPLRT_DIV, 0x07);
 293   1              Write_I2C_Byte(SlaveAddress >> 1, CONFIG, 0x06);
 294   1              Write_I2C_Byte(SlaveAddress >> 1, GYRO_CONFIG, 0x18);
 295   1              Write_I2C_Byte(SlaveAddress >> 1, ACCEL_CONFIG, 0x01);
 296   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    486    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/25/2018 17:39:42 PAGE 6   

   XDATA SIZE       =   ----      12
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


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