久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3656|回復: 16
打印 上一主題 下一主題
收起左側

關于時鐘芯片SD3078單片機驅動的問題 [已解決] 及解決方法

[復制鏈接]
回帖獎勵 100 黑幣 回復本帖可獲得 5 黑幣獎勵! 每人限 2 次
跳轉到指定樓層
樓主
最近在做手表,感覺大部分常見RTC要么太大,要么沒內置晶振(誤差大)
前幾周找到了一款芯片,看上去還不錯:

我就在某寶上買了2片,嘗試驅動
這玩意老貴了,一片就要五塊多
數據手冊 SD3078.pdf (858.22 KB, 下載次數: 19)
我按照數據手冊寫的驅動:
  1. //SD3078.c
  2. //I2C功能O口:準雙向
  3. #include "STC8H.h"
  4. #include "SD3078.h"
  5. #include "IIC.h"
  6. //#include "UART.c"

  7. #define RTC_READ 0x65
  8. #define RTC_WRITE 0x64

  9. void Rtc_Enable(){        
  10.         IIC_Start(); //發送起始命令
  11.         IIC_Send(RTC_WRITE); //發送設備地址+寫命令
  12.         IIC_Ack();
  13.         IIC_Send(0x10); //發送地址
  14.         IIC_Ack();
  15.         IIC_Send(0x80); //發送數據
  16.         IIC_Ack();
  17.         IIC_Stop(); //發送停止命令

  18.         IIC_Start(); //發送起始命令
  19.         IIC_Send(RTC_WRITE); //發送設備地址+寫命令
  20.         IIC_Ack();
  21.         IIC_Send(0x0F); //發送地址
  22.         IIC_Ack();
  23.         IIC_Send(0x84); //發送數據
  24.         IIC_Ack();
  25.         IIC_Stop();
  26. }        
  27. void Rtc_Disable(){        
  28.         IIC_Start(); //發送起始命令
  29.         IIC_Send(RTC_WRITE); //發送設備地址+寫命令
  30.         IIC_Ack();
  31.         IIC_Send(0x0F); //發送地址
  32.         IIC_Ack();
  33.         IIC_Send(0x00);
  34.         IIC_Ack();
  35.         IIC_Send(0x00);
  36.         IIC_Ack();
  37.         IIC_Stop();
  38. }        

  39. void Rtc_Write_Time(unsigned char TIME_Set[],bit mode,bit A_P_M){//TIME_Set:秒分時周日月年  mode1:24h mode0:12h  IN:十進制數
  40.         
  41.         unsigned char i;
  42.         
  43.         for(i=0;i<7;i++){
  44.                 TIME_Set[i]=TIME_Set[i]/10*16+TIME_Set[i]%10;
  45.         }
  46.         if(mode)
  47.                 TIME_Set[2]|=0x80;
  48.         else{
  49.                 if(A_P_M)//AM
  50.                         TIME_Set[2]&=0x5f;
  51.                 else{//PM
  52.                         TIME_Set[2]&=0x7f;
  53.                         TIME_Set[2]|=0x20;
  54.                 }
  55.         }
  56.         IIC_Start(); //發送起始命令
  57.         IIC_Send(RTC_WRITE); //發送設備地址+寫命令
  58.         IIC_Ack();
  59.         IIC_Send(0x00);
  60.         IIC_Ack();
  61.         for(i=0;i<7;i++){
  62.                 IIC_Send(TIME_Set[i]);
  63.                 IIC_Ack();
  64.         }
  65.         IIC_Stop();
  66.         
  67. }

  68. void Rtc_Read_Time(TIME_IN *TIME_Read){
  69.         IIC_Regulate(1);
  70.         IIC_Start();
  71.         IIC_Send(RTC_READ);
  72.         IIC_Ack();
  73.         TIME_Read -> second=IIC_Recv();
  74.         IIC_Send_Ack();
  75.         TIME_Read -> minute=IIC_Recv();
  76.         IIC_Send_Ack();
  77.         TIME_Read -> hour=IIC_Recv();
  78.         IIC_Send_Ack();
  79.         TIME_Read -> week=IIC_Recv();
  80.         IIC_Send_Ack();
  81.         TIME_Read -> date=IIC_Recv();
  82.         IIC_Send_Ack();
  83.         TIME_Read -> month=IIC_Recv();
  84.         IIC_Send_Ack();
  85.         TIME_Read -> year=IIC_Recv();
  86.         IIC_Send_Ack();
  87.         IIC_Stop();
  88. }

  89. void SD3078_Init(){
  90.         unsigned char r;
  91.         IIC_Regulate(1);
  92.         Rtc_Enable();//關寫保護
  93.         IIC_Start();
  94.         IIC_Send(RTC_WRITE);
  95.         IIC_Ack();
  96.         IIC_Send(0x0F);
  97.         IIC_Ack();
  98.         IIC_Start();
  99.         IIC_Send(RTC_READ);
  100.         IIC_Ack();
  101.         r=IIC_Recv();
  102.         IIC_Send_Ack();
  103.         IIC_Stop();
  104.         if(r&0x01){//第一次上電
  105.                 Rtc_Write_Time(TIME_SET,1,0);
  106.         }
  107.         Rtc_Disable();//開寫保護
  108. }

  109. void main(){
  110.         
  111.         unsigned char i, j, k;
  112.         
  113.          P0M0 = 0x00;
  114.    P0M1 = 0x00;
  115.    P1M0 = 0x00;
  116.    P1M1 = 0x00;
  117.    P2M0 = 0x00;
  118.    P2M1 = 0x00;
  119.    P3M0 = 0x00;
  120.    P3M1 = 0x00;
  121.    P4M0 = 0x00;
  122.    P4M1 = 0x00;
  123.    P5M0 = 0x00;
  124.    P5M1 = 0x00;
  125.         
  126.         IIC_Init();
  127.         SD3078_Init();
  128.         

  129.         while(1){
  130.                
  131.                 Rtc_Read_Time(&Sys_Time);
  132.                 if(Sys_Time.second==1)P0=0;else P0=1;
  133.                
  134.                 i = 13;
  135.         j = 45;
  136.         k = 214;
  137.         do
  138.         {
  139.                 do
  140.                 {
  141.                         while (--k);
  142.                 } while (--j);
  143.         } while (--i);
  144.         }

  145. }
復制代碼
.h文件
  1. #ifndef _SD3078_H_
  2. #define _SD3078_H_

  3. typedef struct{
  4.         unsigned char year;
  5.         unsigned char month;
  6.         unsigned char date;
  7.         unsigned char hour;
  8.         unsigned char minute;
  9.         unsigned char second;
  10.         unsigned char week;
  11. }TIME_IN;

  12. TIME_IN Sys_Time;

  13. unsigned char TIME_SET[7]={0,0,0,2,18,7,23};//秒分時周日月年



  14. #endif
復制代碼
燒錄后,單片機似乎死循環了(似乎是IIC通訊失敗,但IIC的代碼驅動其他器件是正常的),
排查了幾天都不知原因
有哪位大神幫我改改嗎
-----------------------------------------------------------------------------
7月25日:

跟著數據手冊重寫了一遍代碼,經過一些微調,SD3078被驅動起來了!(激動)
我對比了一下上面的(有問題)代碼,并結合微調時的經過,總結出了上方代碼的問題:
1、讀出的數據是BCD碼,很重要!(不是十進制)
2、 24小時制時讀出數據時要把最高位置零(&0x7f),否則讀出數據是錯誤的···
3、IIC的應答要設定一個時間上限,超過上限就跳出循環,判非應答。(方便調試)
4、好像沒有了···
另外,我用的單片機是STC8H8K64U,使用了硬件IIC,請問大佬們不加上拉電阻保險嗎?
(我試著去除上拉電阻,結果單片機與SD3078通訊仍正常)

----------------------------------------------------完----------------------------------------------------


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:401564 發表于 2023-7-21 12:32 | 只看該作者
1,先驗證IIC代碼對不對,可能用24C01的IIC代碼和功能來進行驗證
2,先驗證IIC從機地址對不對,先不管數據讀寫,先寫一個驗證代碼,向從機發送地址,看一下有沒有響應,可以用一個LED或者某個端口的電平來進行驗證
3,如果單片機沒有內置上拉電阻,你就得在時鐘和數據端口上增加上拉電阻
回復

使用道具 舉報

板凳
ID:639106 發表于 2023-7-21 12:56 | 只看該作者
Y_G_G 發表于 2023-7-21 12:32
1,先驗證IIC代碼對不對,可能用24C01的IIC代碼和功能來進行驗證
2,先驗證IIC從機地址對不對,先不管數據讀寫 ...

單片機引腳設置為準雙向輸出,可以嗎
回復

使用道具 舉報

地板
ID:161164 發表于 2023-7-21 14:54 | 只看該作者
注意電平轉換時間


回復

使用道具 舉報

5#
ID:639106 發表于 2023-7-21 18:58 | 只看該作者
lkc8210 發表于 2023-7-21 14:54
注意電平轉換時間

時序按照數據手冊寫的,為400k,我把它調到200k后也沒反應
回復

使用道具 舉報

6#
ID:401564 發表于 2023-7-21 22:05 | 只看該作者
gqzjl 發表于 2023-7-21 12:56
單片機引腳設置為準雙向輸出,可以嗎

時鐘和數據線必須要加10K的上拉電阻!!!!!
端口設置為標準雙向模式,也就是傳統的8051模式
回復

使用道具 舉報

7#
ID:1085441 發表于 2023-7-21 22:08 | 只看該作者
gqzjl 發表于 2023-7-21 12:56
單片機引腳設置為準雙向輸出,可以嗎

看手冊是有上拉電阻的,你可以接個上拉電阻試試。
像DS1302的IO口必須接上拉電阻,準雙向IO口不行。
回復

使用道具 舉報

8#
ID:883308 發表于 2023-7-22 01:49 | 只看該作者
可以看看數據手冊多試試
回復

使用道具 舉報

9#
ID:639106 發表于 2023-7-22 12:03 | 只看該作者
設置成開漏輸出,SDA接了上拉電阻后還是沒反應
是我寫的驅動有問題嗎
回復

使用道具 舉報

10#
ID:384109 發表于 2023-7-22 13:04 | 只看該作者
看代碼,P0需要至少1分鐘才會有變化,測試時間夠長嗎
回復

使用道具 舉報

11#
ID:639106 發表于 2023-7-22 14:07 | 只看該作者
夠長,把if判斷的值改成<20也一樣要瘋了
回復

使用道具 舉報

12#
ID:401564 發表于 2023-7-22 17:13 | 只看該作者
gqzjl 發表于 2023-7-22 12:03
設置成開漏輸出,SDA接了上拉電阻后還是沒反應
是我寫的驅動有問題嗎

已經告訴你了,你上傳的代碼中,你的端口設置是對的,就不要再去找端口的毛病了
SDA和SCL都要加上拉10K電阻!!!!!!!
IIC可以驅動其它的IIC器件也不一定是對的!!!!!
為什么要叫你用24c01,這個器件是標準的IIC,不支持高速IIC的,在它上面運行正常了,在SD3078就能正常了
不要duang!duang!duang!先寫一堆幾千行的代碼,然后就進行驗證,那么多代碼,問題出在哪里你都不一定知道

"先驗證IIC從機地址對不對,先不管數據讀寫,先寫一個驗證代碼,向從機發送地址,看一下有沒有響應,可以用一個LED或者某個端口的電平來進行驗證"
1,什么其它的代碼都不要,只要端口設置和IIC寫入一個字節函數,外加一個延時函數,延時可以設定為1秒2,P0^1=0;//LED這個端口先滅燈
3,寫入從機地址   0x64
4,等待IIC從機應答,如果不應答就是死循環
5,P0^1 = 1;//

while(1);
6,燒錄驗證,不要仿真!!!!!!!!!

以上6步,從P.01端口的電平信號就可以知道從機是否能響應主機的IIC信號了
低電平:說明從機沒有應答
高電平:說明從機已經應答,寫字節的IIC代碼是對的

再不行,把你的所有代碼,原理圖上傳
還是不行,那就放棄吧

評分

參與人數 1黑幣 +5 收起 理由
gqzjl + 5 贊一個!

查看全部評分

回復

使用道具 舉報

13#
ID:639106 發表于 2023-7-22 17:35 | 只看該作者
Y_G_G 發表于 2023-7-22 17:13
已經告訴你了,你上傳的代碼中,你的端口設置是對的,就不要再去找端口的毛病了
SDA和SCL都要加上拉10K電阻 ...

好的,我試試
回復

使用道具 舉報

14#
ID:821429 發表于 2023-7-23 16:42 | 只看該作者
if(Sys_Time.second==1)P0=0;else P0=1;    恰好能讀到1嗎?如果0秒后延時,2秒時才把時間讀回來,是不是就沒有反應了?這個看你的延時多長時間,按照12MHz1T估算你的延時,應該還是很多時候能進入的,但是也容易出現非預期的情況。
這條語句的第二個問題,如果延時不影響,當且僅當second==1時點亮/熄滅,也就是60秒鐘點亮/滅1秒,這個是你預期的效果?我覺得不確定能不能看清楚這個閃爍
關于調試的方法,你是怎么感覺進入死循環的,是測試出來的嗎?如果不是必須定位,找到出錯點,因為不能在線調試,可以注釋現在點亮指示燈的位置,在你覺得可疑的程序后面點亮指示燈,如果能點亮繼續找前面的程序。

評分

參與人數 1黑幣 +5 收起 理由
gqzjl + 5

查看全部評分

回復

使用道具 舉報

15#
ID:584814 發表于 2023-7-24 11:13 | 只看該作者
先找個任意的IIC器件,調試成功后再上這個東東。
目前,標準的IIC驅動是通用的,RTC也就是讀寫而已,沒多復雜,好像3231和1307的通用。
實驗證明很多器件用STC準雙向I/O無需加上拉什么的也可以用。
也可以找廠家要DEMO,國產可參考“國芯”,說明書寫的是理想也可能是現實。
包括記得有些廠家宣傳可以免費給樣片,然而聯系過結果呵呵呵。
如果自己玩且對體積沒要求的話用8025的,幾毛錢的貨就非常好用。
還有就是,目前常見的8025、3231又大又蠢,甚至還有更過的內置了電池,這個小體積的有“核心技術”了 ?
建議仔細查一遍,廠家不給例程自己還調不過就過了罷。

評分

參與人數 1黑幣 +5 收起 理由
gqzjl + 5 贊一個!

查看全部評分

回復

使用道具 舉報

16#
ID:639106 發表于 2023-7-25 19:07 | 只看該作者
liixaofei5 發表于 2023-7-23 16:42
if(Sys_Time.second==1)P0=0;else P0=1;    恰好能讀到1嗎?如果0秒后延時,2秒時才把時間讀回來,是不是就 ...

謝謝指導,問題解決了
回復

使用道具 舉報

17#
ID:639106 發表于 2023-7-25 19:09 | 只看該作者
man1234567 發表于 2023-7-24 11:13
先找個任意的IIC器件,調試成功后再上這個東東。
目前,標準的IIC驅動是通用的,RTC也就是讀寫而已,沒多 ...

謝謝指導,之前寫的程序確實有忽疏
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频网站 | 国产一区91精品张津瑜 | 国产成人精品免费视频大全最热 | 国产精品美女久久久久aⅴ国产馆 | 韩国精品一区二区三区 | 国产一区二区三区四区 | 欧美成年人网站 | 精品国产乱码久久久久久影片 | 国产精品视频久久 | 香蕉视频一区二区 | 日本成人免费网站 | 亚洲一级毛片 | 一a级片 | 日韩欧美在线观看 | 在线观看成人av | 欧美一级高潮片免费的 | 伊人久久综合 | 亚洲精品久久久久中文字幕二区 | 三级黄色大片网站 | 成人免费视频网站在线看 | 国产96在线 | 日韩欧美在线观看视频网站 | 网站一区二区三区 | 99综合 | 天天久久 | 亚洲第一免费播放区 | 久久精品97 | 麻豆视频在线免费看 | 亚洲精品高清视频在线观看 | 成人免费视频网站在线观看 | 国产高清精品一区二区三区 | 亚洲日本一区二区三区四区 | 成人免费在线 | 国产一区二区三区www | 深夜福利影院 | 国产综合久久 | 天天操天天玩 | 欧美黑人巨大videos精品 | 亚洲免费网 | 一级做a爰片久久毛片 | 欧美一区二区小视频 |