你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F407软件模拟IIC驱动RX8025程序加原理图

[复制链接]
STMCU小助手 发布时间:2022-4-22 21:00
一、RX8025T介绍
RX8025-T是一款拥有I2C接口和温度补偿功能的新型实时时钟芯片,内部集成32.768KHz温度补偿晶体振荡器,可用于各种需要高精度时钟的场合。通过设置相应补偿的控制位,可以实现不同间隔的温度补偿功能,从而大大提高了时钟的精度。芯片可设置四种不同的时段进行温度补偿,默认设置是2S补偿。该芯片采用C-MOS工艺生产,具有极低的功能消耗,可长期使用电池供电。

二、原理图

20200924190716928.png

三、参考程序


  1. u8 r8025_init(void)
  2. {
  3.         uint8_t val[3]={0x00,0x00,0x60};  //0x0D、0x0E、0x0F、三个寄存器的值,设置时间更新为“秒”更新,关闭所有闹钟,温补时间为2秒,打开时间更新中断,关闭其他中断。

  4.         iic_init();  //iic接口初始化

  5.         if(rx8025_write_data(RX8025T_EXT_REG,val,3))
  6.                 return 1;               
  7.         return 0;
  8. }
  9. /*******************************************************************************
  10. * 函数名: u8 rx8025_write_data(u8 addr, u8 *buf, u8 len)
  11. * 描述  : 写RX8025T寄存器
  12. * 参数  : addr寄存器地址,*buf写入的数据,len写入的长度
  13. * 返回值: 1=操作失败,0=操作成功
  14. *******************************************************************************/
  15. u8 rx8025_write_data(u8 addr, u8 *buf, u8 len)
  16. {
  17.         uint8_t i;
  18.         iic_start();
  19.         iic_send_byte(0x64); //写操作指令
  20.         if(iic_wait_ack())   //检测ACK信号
  21.         {
  22.                 iic_stop();         //发送IIC停止信号
  23.                 return 1;        
  24.         }
  25.         iic_send_byte(addr); //写寄存器存储地址
  26.         if(iic_wait_ack())
  27.         {
  28.                 iic_stop();
  29.                 return 1;        
  30.         }        
  31.         for(i=0; i<len; i++) //连续写
  32.         {
  33.                 iic_send_byte(buf);
  34.                 if(iic_wait_ack())
  35.                 {
  36.                         iic_stop();
  37.                         return 1;        
  38.                 }               
  39.         }
  40.         iic_stop();
  41.         return 0;
  42. }

  43. /*******************************************************************************
  44. * 函数名: u8 rx8025_read_data(u8 addr,u8 *buf,u8 len)
  45. * 描述  : 读RX8025T寄存器
  46. * 参数  : addr寄存器地址,*buf存储位置,len读取的长度
  47. * 返回值: 1=操作失败,0=操作成功
  48. *******************************************************************************/
  49. u8 rx8025_read_data(u8 addr,u8 *buf,u8 len)
  50. {
  51.         u8 i;
  52.         iic_start();
  53.         iic_send_byte(0x64);  //写操作指令
  54.         if(iic_wait_ack())
  55.         {
  56.                 iic_stop();
  57.                 return 1;        
  58.         }        
  59.         iic_send_byte(addr);  //发送寄存器地址
  60.         if(iic_wait_ack())
  61.         {
  62.                 iic_stop();
  63.                 return 1;        
  64.         }               
  65.         iic_start();          //Sr条件,RESTART
  66.         iic_send_byte(0x65);  //读操作指令
  67.         if(iic_wait_ack())
  68.         {
  69.                 iic_stop();
  70.                 return 1;        
  71.         }        
  72.         for(i=0; i<len; i++) //连续读
  73.         {
  74.    buf =iic_read_byte(1);  //读取数据并发送ACK信号
  75.         }
  76.         //        iic_nack();         //发送一个‘1’
  77.         iic_stop();
  78.         return 0;
  79. }

  80. /*******************************************************************************
  81. * 函数名: u8 get_rx8025_time(TIME* t)
  82. * 描述  : 从RX8025T获取时间
  83. * 参数  : 存储时间的结构体
  84. * 返回值: 0成功,1失败。
  85. *******************************************************************************/
  86. u8 get_rx8025_time(TIME *t)
  87. {
  88.         u8 rtc_str[7];

  89.         if(rx8025_read_data(RX8025T_SEC_REG,rtc_str,7))  //获取日期与时间
  90.                 return 1;  //读取出错

  91.         t->second = ((rtc_str[0]>>4)*10) + (rtc_str[0] & 0x0f);
  92.         t->minute = ((rtc_str[1]>>4)*10) + (rtc_str[1] & 0x0f);
  93.         t->hour   = ((rtc_str[2]>>4)*10) + (rtc_str[2] & 0x0f);
  94.         t->week                = rtc_str[3];        
  95.         t->day    = ((rtc_str[4]>>4)*10) + (rtc_str[4] & 0x0f);
  96.         t->month  = ((rtc_str[5]>>4)*10) + (rtc_str[5] & 0x0f);
  97.         t->year   = ((rtc_str[6]>>4)*10) + (rtc_str[6] & 0x0f);
  98.         t->year+=2000;
  99.         return 0;

  100. }
  101. /*******************************************************************************
  102. * 函数名: u8 set_rx8025_time(TIME* t)
  103. * 描述  : 设置RX8025T时间
  104. * 参数  : 存储时间的结构体
  105. * 返回值: 0成功,1失败。
  106. *******************************************************************************/
  107. u8 set_rx8025_time(u16 year,u8 month,u8 day,u8 week,u8 hour,u8 minute,u8 second)
  108. {
  109.         u8 rtc_str[7];
  110.         year-=2000;
  111.         rtc_str[0] = ((second/10)<<4) | (second%10);
  112.         rtc_str[1] = ((minute/10)<<4) | (minute%10);
  113.         rtc_str[2] = ((hour/10)<<4) | (hour%10);
  114.         rtc_str[3] = week;
  115.         rtc_str[4] = ((day/10)<<4) | (day%10);
  116.         rtc_str[5] = ((month/10)<<4) | (month%10);
  117.         rtc_str[6] = ((year/10)<<4) | (year%10);

  118.         if(rx8025_write_data(RX8025T_SEC_REG,rtc_str,7))        //写入日期与时间
  119.                 return 1;
  120.         else
  121.                 return 0;
  122. }


复制代码

收藏 评论0 发布时间:2022-4-22 21:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版