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

发布者:玉立风华最新更新时间:2017-01-10 来源: eefocus关键字:LPC21XX系列  ARM7  驱动RTC  RX8025  模拟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)
}


关键字:LPC21XX系列  ARM7  驱动RTC  RX8025  模拟IIC 引用地址:LPC21XX系列ARM7驱动RTC RX8025(I/O模拟IIC)

上一篇:单片机TwinCAN调试心得
下一篇:STM32驱动12bit AD TLC2543(I/O模拟方式)

推荐阅读最新更新时间:2024-03-16 15:29

51单片机 软件模拟IIC
/*========================================================================== 名称:IIC协议 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作一定的修改 (本例是1us机器周期,即晶振频率要小于12MHZ) ============================================================================*/ #include reg52.h #include iic.h bit ack; /*==============================
[单片机]
8051模拟IIC操作EEPROM
注: 本篇内容和STM32模拟IIC操作EEPROM思路是一样的,是一个程序到不同平台的移植。 首先是EEPROM.h文件内容: #ifndef _eeprom_h_ #define _eeprom_h_ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include stdio.h #define EEPROM_ADDRESS 0x57 sbit SDA = P1^2; //EEPROM的数据线 sbit SCL = P1^1; //EEPROM的时钟线 sbit WP = P1^0; //EEPROM的写保护,给低电平表示读写均允许,也就是标准的模式。
[单片机]
如何让 keil MDK v5 支持 ARM7/9 设备
最近有位同事接私活时遇到一个问题,用 Keil-5 可以打开甲方给的工程,但是仿真和下载出错。 根据报的错误,找到了问题,原来是 Keil 5 不支持 LPC2368 这款设备。如下图: 打开 pack installer 也没有找到 LPC2000 系列的单片机。如下图: 最后去官网溜达了一圈,在 MDK5 Device List 中找到了原因。第二段话说的就是: For maintaining existing MDK Version 4 projects, or using devices that are not yet supported by a Software Pack, please install Le
[单片机]
如何让 keil MDK v5 支持 <font color='red'>ARM7</font>/9 设备
ARM7学习---GPS练习
下午抽了点时间在调试ARM7,想把上次用ATMEGA8做的GPS移植到ARM7上去,下午移植了LCD和串口,但是还没把串口中断程序编写好。按键也还没移植,其他OK了,再花点时间就可以完整了。我想GPS和GSM结合起来,这样可以做个比较实用的东西。自己玩玩很不错!哈哈!再接再厉继续努力...... /**************ARM7(LPC2103)练习程序**************************/ /*************************************************************/ /*****File Function : lcd10265液晶显示程序
[单片机]
<font color='red'>ARM7</font>学习---GPS练习
ARM7单片机(学习ing)—(四)、定时器—02
只要知道了Startup.s中对单片机时钟的定义~~ 也就是这句话:当外部晶振频率为12MHz时,系统时钟60MHz,外设时钟15MHz~~ 无敌了~~ 感觉一下子好学了好多~~ 不过我还是有点不太清楚就是外设时钟?为什么是15MHz~~ 现在可以先留着~~慢慢来吧~~ 四、定时器 四—(02)、定时控制LED闪烁(应用查询法~~) MDK4_1.c //------------------------------------------------------------------------------ //使用定时器0实现1s定时,控制LED闪烁 //今天使用的是查询法~~ #include lpc210x.
[单片机]
<font color='red'>ARM7</font>单片机(学习ing)—(四)、定时器—02
ARM7 的中断寄存器的设置方法
以设置外部中断2(EINT2)为例,进行ARM7中断寄存器的设置,并编写其相应的中断程序如下: //设置中断类型 rEXTINT = 0x22221122 ; //EINT2高电平触发中断 //给定中断服务程序入口 pISR_EINT2 = (unsigned)Encoder_int; //打开全局中断和eINT2中断 rINTMSK &= ~(BIT_GLOBAL|BIT_EINT2); /* 当ExINT2为高电平时,旋转编码器有新值,你先读低字节,再读高字节。其中低15位为旋转编码器的值,最高位为其按键的状态。 */ //定义编码器的低地址 #define ENCODER_LOW_ADDR (*(vo
[单片机]
ARM7嵌入式系统中Bootloader分析与设计
1.引言 作为一种16/32位的高性能、低成本、低功耗的嵌入式RISC(Reduced Instruction Set Computer)微处理器,ARM(Advanced RISC Machines )微处理器目前已经成为应用最为广泛的嵌入式微处理器 。在嵌入式系统开发中Bootloader常常是嵌入式系统开发中可能遇到的第一个技术难点。应用程序运行环境能否正确构建,内核能否启动成功,都取决于Bootloader能否正确的工作。一个功能完善的嵌入式系统Bootloader还要求能够提供系统更新的能力,以及为了实现这一操作所需要的一个简单的命令控制台。本文在基于ARM7-uClinux嵌入式系统的硬件平台和软件平台基础上,描述了系统
[单片机]
<font color='red'>ARM7</font>嵌入式系统中Bootloader分析与设计
ARM7与FPGA在工控和故障检测中的应用
工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。 各部分功能简介   图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控制总线和故障检测总线相连。                  
[测试测量]
<font color='red'>ARM7</font>与FPGA在工控和故障检测中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved