• 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)
    }

  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/pulan/p/2921662.html
Copyright © 2020-2023  润新知