数码之家

 找回密码
 立即注册
搜索
查看: 11488|回复: 30

[C51] RX8025AC时钟芯片驱动有问题的新手可以看看

[复制链接]
发表于 2020-1-4 20:54:21 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2020-1-5 10:47 编辑

最近坛里有玩RX8025时钟芯片的,据说精度仅次于DS3231但是比DS1302好过几条街,关键是这货很便宜,于是跟风撸了些、编编程序来消闲解闷打发时间,查了一下网上的资料,发现这货真的不新鲜,看到最早介绍这个芯片的资料是2003年发表的,真的是挺古老的东西了,常见的有两种尾缀的芯片RX8025AC和RX8025T。
虽然它们都是IIC总线驱动,但是,两种芯片不只是尾缀字母不同、晶振温补与否,驱动也是不同的,RX8025T很容易驱动,只要有DS3231的驱动程序,调整一下写/读地址以及相关时间参数的寄存器地址就可以直接使用了,而RX8025AC则不同,用上述程序是驱动不起来的,下面是我经过实验得到的一点新手玩这东西的经验,如果你是新手并且你也入手了RX8025AC这种芯片而且始终没有正常的驱动运行起来,不妨看看本文,相信一定会解决问题的,如果是专业做产品的高手并且很忙就请去忙吧,如果您是高手并且有时间而且发现了我说的东西有问题也真心请求及时指正,以免误人子弟。
第一种情况:将芯片用手工烙铁焊在板子上(打板或转接板),通电写程序实验,无论怎么调试程序都如同泥牛入海无声无息。
检查方法如下:拆除所有连线,短接Pin6&pin7,连接V+,连接GND,此时用万用表测量pin3的对地电压,如果电压为电源电压的一半左右,证明芯片正常,否则就是芯片损坏了,芯片损坏的原因我只想到了焊接超温(是否芯片本身***不知道),很囧的说我坏了两片。我的这个实验只是测试芯片的32768Hz脉冲输出功能,它只与芯片的好坏有关与芯片的编程无关。
第二种情况:一切都正常,但显示内容混乱,显示的不是自己设定的数据。
这种情况下如果排除了接线错误等问题,请按照我推荐的读写顺序试试看,虽然这款芯片网络资源也有不少,但是说实话我几乎试过了大部分代码,叶落归根时发现其实好用的代码与RX8025T相差很少,程序越复杂越不好用,其实IIC总线驱动代码中基础部分并无不同,不同的IIC芯片驱动所不同的仅在于CLK的相位不同,而RX8025AC与RX8025T的CLK相位是相同的,不同的只有寄存器地址需要放在高4位上这个是必须的,而网上所说的寄存器地址的低4位在读的时候需要或1,对于这种说法不必太认真,真心的说经过实验或1与否并无任何影响,好用的读/写顺序见下图,图片是我根据自己的程序画的,其中S为IIC启动、A为ACK、N为NACK、P为IIC停止。


注:请不要用这个图与中文的PDF资料中的顺序对比,也不要问我诸如IIC再启动、从机不应答信号等等有无体现等问题,因为我真的没弄懂这些,也希望高手能指点一二。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +30 收起 理由
家睦 + 30

查看全部打赏

发表于 2020-1-4 23:25:41 | 显示全部楼层
建议楼主把已有资料百度网盘共享下,也准备开始试一试这个。:handshake:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 10:49:51 | 显示全部楼层
lyy-cy 发表于 2020-1-4 23:25
建议楼主把已有资料百度网盘共享下,也准备开始试一试这个。

好的,等手里的测试全部完成了会整理发帖,届时可以开源代码交流经验。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-5 19:37:56 | 显示全部楼层
楼主把已有资料百度网盘共享下,也准备开始试一试这个。
回复 支持 反对

使用道具 举报

发表于 2020-1-6 11:08:22 | 显示全部楼层
这芯片我用过,以下代码是成功应用的。STVD工程中的R8025AC驱动片断希望能帮到楼主。
  1. /********************************************************************/


  2. void SDA_OUT(void)   //配置SDA引脚为输出

  3. {

  4.         PB_DDR|=0x20;//PB5

  5.         PB_CR1|=0x20;//推挽输出

  6.         PB_CR2&=0xdf;        

  7. }

  8. void SDA_IN(void)   //配置SDA引脚为输入

  9. {

  10.         PB_DDR&=0xdf;//PB5

  11.         PB_CR1&=0xdf;//悬浮输入

  12.         PB_CR2&=0xdf;        

  13. }

  14. void SCL_OUT(void)  //配置SCL引脚为输出

  15. {

  16.         PB_DDR|=0x10;//PB4

  17.         PB_CR1|=0x10;//推挽输出

  18.         PB_CR2&=0xef;        

  19. }

  20. void SCL_IN(void)   //配置SCL引脚为输入

  21. {

  22.         PB_DDR&=0xef;//PB5

  23.         PB_CR1&=0xef;//悬浮输入

  24.         PB_CR2&=0xef;        

  25. }
  26. void IIC_Start(void)
  27. {
  28.         SDA_OUT();     
  29.         SCL=1;
  30.         SDA=1;
  31.         Delay_us(1);
  32.         SDA=0;
  33.         Delay_us(1);
  34.         SCL=0;       
  35.         Delay_us(1);
  36.        
  37.        
  38.        
  39. }          

  40. void IIC_Stop(void)
  41. {
  42.         u8 i;
  43.         SDA_OUT();//sda??ê?3?
  44.         SDA=0;
  45.         Delay_us(1);
  46.         SCL=1;
  47.         Delay_us(1);
  48.         SDA=1;
  49.         for(i=0;i<5;i++)
  50.         {
  51.                 Delay_us(1);
  52.         }                          
  53. }

  54. u8 IIC_Wait_Ack(void)
  55. {
  56.         u8 ucErrTime=0;
  57.         SDA_IN();      //SDAéè???aê?è?  
  58.         Delay_us(1);   
  59.         Delay_us(1);
  60.         while(READ_SDA)
  61.         {
  62.                 ucErrTime++;
  63.                 if(ucErrTime>250)
  64.                 {
  65.                         IIC_Stop();
  66.                         return 1;
  67.                 }
  68.                
  69.         }
  70.         SCL=0;//ê±?óê?3?0           
  71.         return 0;  
  72. }

  73. void IIC_Ack(void)
  74. {
  75.        
  76.         SDA_OUT();
  77.         SDA=0;;
  78.         Delay_us(1);
  79.         SCL=1;
  80.         Delay_us(1);
  81.         SCL=0;
  82.         Delay_us(1);
  83. }
  84.             
  85. void IIC_NAck(void)
  86. {
  87.         SDA_OUT();
  88.         SDA=1;;
  89.         Delay_us(1);
  90.         SCL=1;
  91.         Delay_us(1);
  92.         SCL=0;
  93.         Delay_us(1);
  94. }                                                                              
  95.                   
  96. void IIC_Send_Byte(u8 txd)
  97. {
  98.         u8 i;
  99.         SDA_OUT();
  100.         for(i=0;i<8;i++)
  101.         {
  102.                 if(txd & 0x80) SDA=1;
  103.                 else SDA=0;
  104.                 txd <<= 1;
  105.                 Delay_us(1);
  106.             SCL=1;
  107.                 Delay_us(1);
  108.                 SCL=0;       
  109.         }
  110.         Delay_us(1);
  111.         SCL=1;
  112.         Delay_us(1);
  113.         SCL=0;
  114. }             

  115. u8 IIC_Read_Byte(unsigned char ack)
  116. {
  117.         u8 i,receive=0;
  118.         SDA_IN();//SDA 引脚输入模式
  119.        
  120.                 for(i=0;i<8;i++)
  121.                 {
  122.                         SCL=1;
  123.                         Delay_us(1);
  124.                         receive <<=1;
  125.                         if(READ_SDA) receive |= 0x01;
  126.                        
  127.                         SCL=0;
  128.                         Delay_us(1);
  129.                 }
  130.                 SDA_OUT();
  131.                 return receive;
  132.                
  133. }


  134. void R8025AC_Read(u8 sadd, u8 *buf, u8 len)
  135. {
  136.         u8 i;
  137.         IIC_Start();
  138.         IIC_Send_Byte(0x64);
  139.         IIC_Send_Byte(sadd<<4|0x01);
  140.         IIC_Start();
  141.         IIC_Send_Byte(0x65);
  142.         for(i=0;i<len-1;i++)
  143.         {
  144.                 buf[i] = IIC_Read_Byte(1);
  145.                 IIC_Ack();
  146.         }
  147.         buf[i] = IIC_Read_Byte(0);
  148.         IIC_NAck();
  149.         IIC_Stop();
  150. }

  151. void R8025AC_Write(u8 sadd,u8 *buf,u8 len)
  152. {
  153.         u8 i;
  154.        
  155.         IIC_Start();
  156.         IIC_Send_Byte(0X64);
  157.         IIC_Send_Byte(sadd<<4);
  158.        
  159.         for(i=0;i<len;i++)
  160.         {
  161.                 IIC_Send_Byte(buf[i]);
  162.         }
  163.         IIC_Stop();
  164. }
  165. /********************************************************************/
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-6 18:08:24 | 显示全部楼层
wpppmlah 发表于 2020-1-6 11:08
这芯片我用过,以下代码是成功应用的。STVD工程中的R8025AC驱动片断希望能帮到楼主。

非常感谢坛友的代码分享,我是玩通了RX8025T以后开始玩RX8025AC的,结果弄了两天也没弄通,而后开始认真检查硬件才发现是芯片挂了,说来奇怪的是我自己做的转接板同时焊了一片8025T和一片8025AC,结果那个8025T的板子毫无问题而这个8025AC竟然坏掉了,重新弄好硬件后用原来的8025T的代码稍加改动就可以了,层主分享的代码也有看过,用到STC单片机上时端口方向的设置、延时函数要进行修改所以我没试但还是感谢你的热心分享。
回复 支持 反对

使用道具 举报

发表于 2020-1-8 10:19:29 | 显示全部楼层
本帖最后由 infozx 于 2020-1-8 10:26 编辑

我搞得那个高频烙铁里用了这个Epson得时钟芯片8025T,折腾了几次,写地址没问题;但发现读取得寄存器地址位跟实际地址漂移了1个,不知道为啥,反正能读,后来就一直那样了懒得深究。

8025能获取得厂家标准资料不多,都是犹抱琵琶半遮面得;上一个跟这种一样蛋疼得芯片是LT8920,datasheet讳莫如深,几十个寄存器配置参数跟神符一样,没有厂家人员得支持只能浑水摸鱼。

  1. void R8025AC_Read(u8 sadd, u8 *buf, u8 len)
  2. {
  3.         u8 i;
  4.     i=0;
  5.    
  6.     while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));  //等待总线空闲
  7.     I2C_AcknowledgeConfig(I2C_ACK_CURR);  //开启发送ACK
  8.    
  9.         I2C_GenerateSTART(ENABLE);  //开启I2C起始位
  10.    
  11.     I2C_GenerateSTART(ENABLE);  //开启I2C起始位
  12.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));   /*EV5,主模式*/
  13.     I2C_Send7bitAddress(0x64, I2C_DIRECTION_TX);   //发送iic从器件物理地址,最低位0,写操作; 器件地址0x64
  14.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  15.    
  16.     I2C_SendData((sadd<<4)|0x01); //寄存器地址
  17.     while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  18.    
  19.         //---//
  20.     I2C_GenerateSTART(ENABLE);//开启I2C1起始位
  21.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));   /*EV5,主模式*/
  22.     I2C_Send7bitAddress(0x65, I2C_DIRECTION_RX);   //发送iic从器件物理地址,最低位1,读操作; 器件地址 --
  23.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  24.    
  25.    
  26.         for(i=0;i<len-1;i++)
  27.         {
  28.         while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));  //等待数据接收器非空
  29.         buf[i]=I2C_ReceiveData();    //读取一个字节数据
  30.         }
  31.        
  32.     while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));  //等待数据接收器非空
  33.     buf[i]=I2C_ReceiveData();    //读取最后一个字节数据
  34.        
  35.     I2C_AcknowledgeConfig(I2C_ACK_NONE);  //停止发送ACK

  36.     I2C_GenerateSTOP(ENABLE);//发送STOP,关闭I2C1总线
  37. }

  38. void R8025AC_Write(u8 sadd,u8 *buf,u8 len)
  39. {
  40.         u8 i;
  41.     i=0;
  42.    
  43.     while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));  //等待总线空闲
  44.     I2C_AcknowledgeConfig(I2C_ACK_CURR);  //开启发送ACK
  45.    
  46.         I2C_GenerateSTART(ENABLE);  //开启I2C起始位
  47.    
  48.     I2C_GenerateSTART(ENABLE);  //开启I2C起始位
  49.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));   /*EV5,主模式*/
  50.     I2C_Send7bitAddress(0x64, I2C_DIRECTION_TX);   //发送iic从器件物理地址,最低位0,写操作; 器件地址0x64
  51.     while(!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  52.    
  53.     I2C_SendData((sadd<<4)|0x01); //寄存器地址
  54.     while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  55.    
  56.         for(i=0;i<len;i++)
  57.         {
  58.         while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));  //等待数据发送完毕
  59.         I2C_SendData(buf[i]);    //发送一个字节数据
  60.         }   
  61.        
  62.         I2C_GenerateSTOP(ENABLE);//发送STOP,关闭I2C1总线
  63. }
复制代码



回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 19:42:16 | 显示全部楼层
infozx 发表于 2020-1-8 10:19
我搞得那个高频烙铁里用了这个Epson得时钟芯片8025T,折腾了几次,写地址没问题;但发现读取得寄存器地址位 ...

建议仔细看一下芯片丝印,如果是R8025  T的话,你的代码中的sadd<<4)|0x01肯定是不对的,寄存器地址移入高4位的操作只适合R8025  AC这个芯片,对照说明书再查一下代码会解决问题的,也可以安装我的图片的顺序自己写这部分代码。
回复 支持 反对

使用道具 举报

发表于 2020-1-9 09:06:44 | 显示全部楼层
两种都玩过,垃圾智能电表上直接玩的,NEC单片机点的,没遇到啥麻烦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-9 18:37:31 | 显示全部楼层
jcdzxh 发表于 2020-1-9 09:06
两种都玩过,垃圾智能电表上直接玩的,NEC单片机点的,没遇到啥麻烦

说心里话,这种芯片的IIC驱动真的没啥特别的,如果不是因为芯片焊坏了没留神应该没什么太多的感想。
回复 支持 反对

使用道具 举报

发表于 2021-5-8 14:24:48 | 显示全部楼层
本帖最后由 inthsunshine 于 2021-5-8 14:35 编辑

这个芯片用过,没问题,淘宝买的10几个二手,几毛钱1个
AC不带温补,其实没什么意思,当初没查仔细,T的才是温补好东西




回复 支持 反对

使用道具 举报

发表于 2021-5-9 22:49:47 来自手机浏览器 | 显示全部楼层
想了解下,这个8025t每个月的时间误差大概多少秒?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-10 19:52:07 | 显示全部楼层
广东梁百万 发表于 2021-5-9 22:49
想了解下,这个8025t每个月的时间误差大概多少秒?

我最新制作的表用了两个半月了,当时是跟电脑对时的,方才看了一下秒跳字还没有偏差呐。
回复 支持 反对

使用道具 举报

发表于 2021-5-10 22:20:24 | 显示全部楼层
本帖最后由 广东梁百万 于 2021-5-11 09:44 编辑
慕名而来 发表于 2021-5-10 19:52
我最新制作的表用了两个半月了,当时是跟电脑对时的,方才看了一下秒跳字还没有偏差呐。 ...

看了你这贴后兴趣大增,已经淘宝买了10片拆机的R8025T,
我现在使用的是ds1307和ht1308,在3套试验板上运行都是误差3秒左右/月
回复 支持 反对

使用道具 举报

发表于 2021-5-11 06:50:51 | 显示全部楼层
RX8025T还有细分UA,UB,UC, 其中UA温漂最低
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 10:26:19 | 显示全部楼层
广东梁百万 发表于 2021-5-10 22:20
看了你这贴后兴趣大增,已经淘宝买了10片拆机的R8025T,
我现在使用的是ds1307和ht1308,在3套试验板上运 ...

我刚刚入门时用1302,误差很大起初不懂只是以为调好了谐振电容就会变准确了,后来了解了晶振的温度特性,此后就玩DS3231,也是在本坛知道了这个8025,起初只是想用他做“恒温”晶振但使用后发现它和3231不相上下,现在的制作几乎都是这货了,购买也是一波三折的,第一次买的时候对这货还不很了解入手了10个8025AC的结果差很多,第二次又买来10个8025T但也是在十几天里就能看出误差了的,最后又买来10个才碰到较准确的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-11 10:32:27 | 显示全部楼层
inthsunshine 发表于 2021-5-11 06:50
RX8025T还有细分UA,UB,UC, 其中UA温漂最低

学习了,这个真的没注意到多谢层主的热心指点。
回复 支持 反对

使用道具 举报

发表于 2021-5-11 18:47:58 | 显示全部楼层
慕名而来 发表于 2021-5-11 10:32
学习了,这个真的没注意到多谢层主的热心指点。

你看看你现在准确的那个是UA还是UC?  还有以前误差大的那个又是什么
回复 支持 反对

使用道具 举报

发表于 2021-5-11 19:09:25 | 显示全部楼层
慕名而来 发表于 2021-5-11 10:26
我刚刚入门时用1302,误差很大起初不懂只是以为调好了谐振电容就会变准确了,后来了解了晶振的温度特性, ...

我那个DS1307最大的优点是带有56字节的RAM,配合那个时钟电池就成了非易失性RAM。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-12 21:01:51 | 显示全部楼层
广东梁百万 发表于 2021-5-11 18:47
你看看你现在准确的那个是UA还是UC?  还有以前误差大的那个又是什么

关于这个芯片的版本在昨天讨论后我就找出同批次的看了,遗憾的是芯片的丝印只有R8025   T的字样,关于UA、UC等等貌似只在店家品名中有体现,但很笼统没有可信度应该就是无论啥名称都是那货、好坏碰运气吧,我最后一单如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +8 收起 理由
广东梁百万 + 8 謝謝分享

查看全部打赏

回复 支持 0 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 12:36 , Processed in 0.405600 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表