C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 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) TABS(2) OBJECT(.\Out
                    -put\FU6812_I2C.obj)

line level    source

   1          /**************************** (C) COPYRIGHT 2018 Fortiortech shenzhen *****************************
   2          * File Name          : IIC.c
   3          * Author             : Willem Wang Fortiortech Market Dept
   4          * Version            : V1.0
   5          * Date               : 20/09/2018
   6          * Description        : This file contains SPI initial function used for Motor Control.
   7          ***************************************************************************************************
   8          * All Rights Reserved
   9          **************************************************************************************************/ 
  10          
  11          #include <FU68xx_2.h>
  12          #include <Myproject.h>
  13          #include <Customer_Debug.h>
  14          #include "FU68xx_Sys.h"
  15          
  16          /**
  17           * 初始化I2C配置
  18           *
  19           */
  20          void Init_I2C(void)
  21          {
  22   1          I2C_CR = 0x00
  23   1          #if defined(I2C_MASTER)                 //I2C被配置为主机模式时进行以下配置
  24   1              | I2CMS | I2C_SPEED                //配置I2C作为主机，并设置速度
  25   1          #endif
  26   1      
  27   1          #if defined(EN_IRQ_I2C)                 //I2C中断使能时进行以下配置
                      | I2CIE                             //使能I2C中断
                  #endif
  30   1      
  31   1          #if defined(I2C_LPF)                    //当I2C启用提高滤波宽度时进行以下配置
                      | I2CFMOD                           //提高滤波宽度
                  #endif
  34   1          ;
  35   1      
  36   1          #if !defined(I2C_MASTER)                //当I2C为从机时进行以下配置
                      I2C_ID = I2C_ADDR7 << 1;            //配置本机I2C地址
                  #endif
  39   1      }
  40          
  41          /**
  42           * 启动I2C传输
  43           *
  44           * @param   rw         读写标志位
  45           *                     0：I2C写
  46           *                     1：I2C读
  47           */
  48          void Start_I2C(bool rw)
  49          {
  50   1          if (rw) I2C_SR = I2CSTA | DMOD;
  51   1          else    I2C_SR = 0x10;
  52   1      
  53   1          while (!ReadBit(I2C_SR, STR));
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 PAGE 2   

  54   1      }
  55          
  56          /**
  57           * 发送停止信号
  58           *
  59           */
  60          void Stop_I2C(void)
  61          {
  62   1          SetBit(I2C_SR, I2CSTP);
  63   1          ClrBit(I2C_SR, STR);
  64   1          while (ReadBit(I2C_SR, I2CSTP));
  65   1      }
  66          
  67          /**
  68           * I2C发送数据
  69           *
  70           * @param   Dat        要发送的数据
  71           */
  72          void Send_I2C(uint8 Dat)
  73          {
  74   1          I2C_DR = Dat;
  75   1          ClrBit(I2C_SR, STR);
  76   1          while (!ReadBit(I2C_SR, STR));
  77   1      }
  78          
  79          /**
  80           * 接收数据
  81           *
  82           * @return             收到的数据
  83           */
  84          uint8 Receive_I2C(void)
  85          {
  86   1          ClrBit(I2C_SR, STR);
  87   1          while (!ReadBit(I2C_SR, STR));
  88   1          return I2C_DR;
  89   1      }
  90          
  91          /**
  92           * 写入一包数据
  93           *
  94           * @param   addr7      从机的7位地址
  95           * @param   reg        寄存器首地址
  96           * @param   len        数据包长度
  97           * @param   dat        数据包数组指针
  98           *
  99           * @return             反馈I2C状态
 100           *                     I2C_FA_ADD： 写过程启动信号发送失败
 101           *                     I2C_FA_REG： 写寄存器失败
 102           *                     I2C_FA_DAT： 写数据失败
 103           *                     I2C_SU：     写成功
 104           */
 105          uint8 Write_I2C(uint8 addr7, uint8 reg, uint8 len, uint8* dat)
 106          {
 107   1          uint8 i;
 108   1      
 109   1          Enable_I2C();                                              //使能I2C
 110   1      
 111   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 112   1      
 113   1          #if defined(I2C_AUTO_ADDR)                                 //与从设备相关，详见头文件
 114   1              Start_I2C(false);                                      //发送启动信号、地址和写信号
 115   1              if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;      //读取应答信号，判断是否发送成功
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 PAGE 3   

 116   1      
 117   1              Send_I2C(reg);                                         //发送寄存器地址
 118   1              if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;      //读取应答信号，判断是否发送成功
 119   1      
 120   1              for (i = 0; i != len; i++)
 121   1              {
 122   2                  Send_I2C(*dat);                                    //发送数据
 123   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_DAT;  //读取应答信号，判断是否发送成功
 124   2                  dat++;
 125   2              }
 126   1      
 127   1              Stop_I2C();
 128   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
 146   1      
 147   1      
 148   1          Disable_I2C();
 149   1      
 150   1          return I2C_SU;
 151   1      }
 152          
 153          /**
 154           * 读出一包数据
 155           *
 156           * @param  addr7  从机7位地址
 157           * @param  reg    第一个读出的寄存器
 158           * @param  len    读出的数据长度
 159           * @param  dat    读出的数据包
 160           *
 161           * @return             反馈I2C状态
 162           *                     I2C_FA_ADD： 写过程启动信号发送失败
 163           *                     I2C_FA_REG： 写寄存器失败
 164           *                     I2C_FA_DAT： 写数据失败
 165           *                     I2C_SU：     写成功
 166           */
 167          uint8 Read_I2C(uint8 addr7, uint8 reg, uint8 len, uint8* dat)
 168          {
 169   1          uint8 i;
 170   1      
 171   1          Enable_I2C();                                              //使能I2C
 172   1      
 173   1      
 174   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 175   1      
 176   1      
 177   1          #if defined(ADDR_AUTO_ADD)                                 //与从设备相关，详见头文件
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 PAGE 4   

              
                      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
 202   1              for (i = 0; i != len; i++)
 203   1              {
 204   2                  Start_I2C(false);
 205   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 206   2      
 207   2                  Send_I2C(reg);
 208   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
 209   2      
 210   2                  Start_I2C(true);
 211   2                  if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 212   2      
 213   2                  *dat = Receive_I2C();
 214   2                  Set_Nack_I2C();
 215   2      
 216   2                  dat++;
 217   2                  reg++;
 218   2      
 219   2                  Stop_I2C();
 220   2              }
 221   1          #endif
 222   1      
 223   1          Disable_I2C();
 224   1      
 225   1          return I2C_SU;
 226   1      }
 227          
 228          uint8 Write_I2C_Byte(uint8 addr7, uint8 reg, uint8 date)
 229          {
 230   1          Enable_I2C();                                              //使能I2C
 231   1      
 232   1          Set_Addr_I2C(addr7);                                       //填写从机地址
 233   1      
 234   1          Start_I2C(false);
 235   1          if (ReadBit(I2C_SR, NACK)) return I2C_FA_ADD;
 236   1      
 237   1          Send_I2C(reg);
 238   1          if (ReadBit(I2C_SR, NACK)) return I2C_FA_REG;
 239   1      
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 PAGE 5   

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    486    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----      12
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
C51 COMPILER V9.52.0.0   FU6812_I2C                                                        09/20/2018 15:17:14 PAGE 6   

END OF MODULE INFORMATION.


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