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

来源:互联网 发布:mac口红 百度百科 编辑:程序博客网 时间:2024/06/05 15:08
 

/******************************************************************************************
* 函数名称    :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)
}

原创粉丝点击