• LPC21XX系列ARM7驱动RTC RX8025(I/O模拟IIC)


     

    /******************************************************************************************
    * 函数名称    :I2C_Delay
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void I2C_Delay(uint32 WaitTime)
    {
     uint32 uiTemp = WaitTime * small;
     while (uiTemp--);
    }
    /******************************************************************************************
    * 函数名称    :IO_Write
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void  IO_Write(uint16 data, uint16 level)
    {
      switch(data)
         {
            case I2C_SDA:                   
             {
                switch(level)
                  {            
                      case High:
                      IO0SET  |= I2C_SDA;
          I2C_Delay(5);
          break;
                   case Low:
                      IO0CLR  |= I2C_SDA;
                   I2C_Delay(5);
           break;
                 }
             }//end case
             break;
            case I2C_SCL:
             {
                switch(level)
                 {
                    case High:
                    IO0SET  |= I2C_SCL;
                    I2C_Delay(5);
                    break;
                  case Low:
                    IO0CLR  |= I2C_SCL;
                   I2C_Delay(5);
                   break;
                   }
              }//end case
              break;
          }
    }

    /******************************************************************************************
    * 函数名称    :I2C_Stop
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void I2C_Stop(void)        // I2C总线操作结止位发送
    {
     IO_Write(I2C_SDA, Low);       // SDA = Low

     IO_Write(I2C_SCL, High);   // SCL = High
     I2C_Delay(10);

     IO_Write(I2C_SDA, High);   // SDA = High
     I2C_Delay(5);

     IO_Write(I2C_SCL, Low);    // SCL = Low
     I2C_Delay(5);
    }

    /******************************************************************************************
    * 函数名称    :I2C_Start
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void I2C_Start(void)
    {
     I2C_Stop();
     I2C_Delay(5);

     IO_Write(I2C_SDA, High); // SDA = High
     I2C_Delay(5);
     
     IO_Write(I2C_SCL, High); // SCL = High
     I2C_Delay(5);
     
     IO_Write(I2C_SDA, Low);     // SDA = Low
     I2C_Delay(5);
     
     IO_Write(I2C_SCL, Low);  // SCL = Low
     I2C_Delay(5); 
    }

    /******************************************************************************************
    * 函数名称    :I2C_Clock
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void I2C_Clock(void)

     I2C_Delay(5);   // SCL = High-> Low

     IO_Write(I2C_SCL, High); // SCL = High
     I2C_Delay(5);

     IO_Write(I2C_SCL, Low);  // SCL = Low
     I2C_Delay(2);
    }
    /******************************************************************************************
    * 函数名称    :I2C_Clock_Ask
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 I2C_Clock_Ask(void)
    {
     uint8 Status;

     I2C_Delay(5);
     IO_Write(I2C_SCL, High);   // SCL = High
     I2C_Delay(5);
     
     switch ( (IO0PIN&I2C_SDA)&I2C_SDA )
         {
       case (1<<14):
               Status = I2CNoAck; // 返回I2CNoAck
          break;

       case (0x00):
              Status = I2CAck;      // 返回I2CAck
          break;
     }
     IO_Write(I2C_SCL, Low);    // SCL = Low
     I2C_Delay(5);
     return (Status);

    /******************************************************************************************
    * 函数名称    :I2C_Ack
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void I2C_Ack(uint8 Status)
    {
     switch (Status)
       {
        case (I2CAck):
          IO_Write(I2C_SDA, Low);//SDA = Low 有应答
           break;

        case (I2CNoAck):
          IO_Write(I2C_SDA, High);//SDA = High 无应答
                 break;
       }
         I2C_Delay(5);

        IO_Write(I2C_SCL, High);  //SCL = High -> Low
        I2C_Delay(5);

        IO_Write(I2C_SCL, Low);
        I2C_Delay(5);

        IO_Write(I2C_SDA, High);  //SDA = High
        I2C_Delay(5);
    }

    /******************************************************************************************
    * 函数名称    :I2C_Send_8Bit
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 I2C_Send_8Bit(uint8 Value)
    {
     uint8 I2C_Loop;

     for (I2C_Loop = 0; I2C_Loop <8; I2C_Loop++)
     {
      switch ((Value << I2C_Loop) & 0x80)
        {
         case   0x80:
           IO_Write(I2C_SDA, High);
            break;
               case   0x00:
           IO_Write(I2C_SDA, Low);
            break;
        }
      I2C_Clock();   // 从SCL 端口发送一个时钟信号
     }
     IO_Write(I2C_SDA, High); //释放SDA
     I2C_Delay(10);
     return (I2C_Clock_Ask()); // 返回ACK 信号
    }

    /******************************************************************************************
    * 函数名称    :I2C_Receive_8Bit
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 I2C_Receive_8Bit(void)
    {
     uint8 I2C_Loop;
     uint8  Value =0x00;

     IO_Write(I2C_SDA, High); //置数据线为输入方式
     
     for (I2C_Loop = 0; I2C_Loop < 8; I2C_Loop++)
     {
      I2C_Delay(5);
      IO_Write(I2C_SCL, Low);// SCL = Low -> High
      I2C_Delay(5);
      
      IO_Write(I2C_SCL, High);
      I2C_Delay(5);
      
      Value <<= 1;
      switch( (IO0PIN&I2C_SDA)&I2C_SDA )
        {
         case (1<<14):
           Value |= 0x01;
            break;
       
         case (0x00):
           Value &= 0xFE;
            break;
        }
      I2C_Delay(5);
     }
     IO_Write(I2C_SCL, Low); // SCL = Low
     I2C_Delay(5);
     return (Value);
    }

    /******************************************************************************************
    * 函数名称    :RTC8025_Write_Bytes
    * 功能描述    :
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 RTC8025_Write_Bytes(uint8 RTCAddr,uint8 Volue)
    {
     I2C_Start();  // 向RTC发送起始位

     if (I2C_Send_8Bit(RTC8025_ID) == I2CNoAck)   //发送硬件地址以及写信号
     {
      return NOTOK;
     }
     if (I2C_Send_8Bit((RTCAddr << 4) & 0xF0) == I2CNoAck)    //发送操作寄存器地址("0")
     {
      return NOTOK;
     }
     if (I2C_Send_8Bit(Volue) == I2CNoAck)    //发送硬件地址以及写信号
     {
      return NOTOK;
     }

     I2C_Stop();   // 向RTC 发送停止位

     return (OK);
    }
    /******************************************************************************************
    * 函数名称    :modify_rx8025time
    * 功能描述    :对时钟进行校时
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 Modify_rx8025time(RTC_STRUCT *modify_time)
    {
            uint8 h;

         h = RTC8025_Write_Bytes(RTC8025_Second, modify_time->second);  //修改" 秒"
      if (h != OK)
      return NOTOK;
      
      h = RTC8025_Write_Bytes(RTC8025_Minute, modify_time->minute);  //修改" 分钟"
      if (h != OK)
      return NOTOK; 
      
      h = RTC8025_Write_Bytes(RTC8025_Hour, modify_time->hour) ;  //修改" 小时"
      if (h != OK)
      return NOTOK;
      
      h = RTC8025_Write_Bytes(RTC8025_Day, modify_time->day);   //修改" 日期"
      if (h != OK)
      return NOTOK;
      
      h = RTC8025_Write_Bytes(RTC8025_Month, modify_time->month);  //修改" 月份"
      if (h != OK)
      return NOTOK;
      
      h = RTC8025_Write_Bytes(RTC8025_Year, modify_time->year);  //修改" 年份"
      if (h != OK)
      return NOTOK;
      
     return  (OK);
    }

    /******************************************************************************************
    * 函数名称    :Get_Time
    * 功能描述    :读取时间
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    uint8 Get_Time(RTC_STRUCT *time_data)
    {
     uint8  ucLoop;
     uint8  week;
     uint8  pon;

     for (ucLoop = 0x01; ucLoop > 0x00; ucLoop--)
     {
      //Dummy_RTC.Date.Century = 0x00;
      I2C_Start(); // 向RTC发送起始位
      if (I2C_Send_8Bit(RTC8025_ID) == I2CNoAck)  //发送硬件地址以及写信号
       {
        continue;
       }
      if (I2C_Send_8Bit((uint8)(RTC8025_Simple_Read | (RTC8025_Control2 << 4)))  //发送操作寄存器地址和读取模式
        == I2CNoAck)
       {
        continue;
       }
      pon = (I2C_Receive_8Bit() & RTC8025_PON) >> 4; // 读寄存器2中电源
       I2C_Ack(I2CAck);
      time_data->second = I2C_Receive_8Bit();     // 读" 秒"
       I2C_Ack(I2CAck);
      time_data->minute = I2C_Receive_8Bit();     // 读" 分钟"
       I2C_Ack(I2CAck);
      time_data->hour = I2C_Receive_8Bit();     // 读" 小时"
       I2C_Ack(I2CAck);
      week = I2C_Receive_8Bit();               // 读" 星期"
       I2C_Ack(I2CAck);
      time_data->day = I2C_Receive_8Bit();     // 读" 日期"
       I2C_Ack(I2CAck);
      time_data->month = I2C_Receive_8Bit();     // 读" 月份"
       I2C_Ack(I2CAck);
      time_data->year = I2C_Receive_8Bit();     // 读" 年份"
       I2C_Ack(I2CNoAck);
      time_data->century = 0x20;              //世纪定死为0x20

      I2C_Stop();  // 向RTC 发送停止位

     }

     return OK; 
    }
    /******************************************************************************************
    * 函数名称    :Rx8025_init
    * 功能描述    :Rx8025初始化
    * 参数        :  参数名称: 输入/输出? 类型  描述
    *
    * 返回值      :
    * 作者        :
    * 创建日期    :2006-12-19
    * 全局变量    :
    * 全局静态变量:
    * 局部静态变量:
    *----------------------------------------修改历史------------------------------------------
    * 当前版本    :     修改人:                  修改日期:
    * 修改说明    :
    ******************************************************************************************/
    void Rx8025_init(void)
    {
     uint8   ucTemp;
     IO0DIR |= I2C_SDA | I2C_SCL;
     IO0CLR = I2C_SCL;

     I2C_Delay(1);
        I2C_Stop();
     ucTemp = 0x20|0x02;
     RTC8025_Write_Bytes(RTC8025_Control1, ucTemp);   // 24小时模式设置,1Hz  频率输出
     ucTemp = 0x20;
     RTC8025_Write_Bytes(RTC8025_Control2, ucTemp);    // 2.1V电压检测模式及电压有效标志(PON)
    }

  • 相关阅读:
    AFNetworking 3.0迁移指南
    富文本常用封装(NSAttributedString浅析)
    如何在 Objective-C 的环境下实现 defer
    iOS之深入了解控制器View的加载
    10+年程序员总结的20+条经验教训
    Foundation: NSNotificationCenter
    做一款仿映客的直播App?看我就够了
    AFNetworking源码分析
    WWDC2016 Session笔记 – Xcode 8 Auto Layout新特性
    iOS页面间传值的一些方式总结
  • 原文地址:https://www.cnblogs.com/pulan/p/2921662.html
Copyright © 2020-2023  润新知