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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302不能寫入,完全斷電重新啟動后能寫入一次,在想寫入還需要完全斷電重新啟動

[復制鏈接]
跳轉到指定樓層
樓主
ID:686011 發表于 2022-10-28 22:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教一下,用STM32F103CBT6驅動DS1302,只有完全掉電后再上電才會向寫入1302寫入一次數據更新時鐘,程序運行過程中向1302中寫數據沒反應。
DS1302.c
  1. #include "ds1302.h"
  2. #include "delay.h"

  3. //初始化時間定義
  4. u8 time_buf[8] = {0x20,0x22,0x10,0x30,0x11,0x09,0x55,0x07}; //初始時間2010年6月1號23點59分55秒 星期二
  5. extern u8 time[15];

  6. //DS1302初始化
  7. void DS1302_Init(void)
  8. {
  9.   GPIO_InitTypeDef GPIO_InitStructure;
  10.         
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  12.         
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 |GPIO_Pin_11;
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  17.         
  18.         GPIO_SetBits(GPIOA, GPIO_Pin_10);                 //PB10拉高
  19.         GPIO_ResetBits(GPIOA, GPIO_Pin_9 | GPIO_Pin_11); //PB9,PB11置低
  20. }


  21. //static void DS1302_IO_IN(void) //設置IO數據引腳的輸入模式的配置  
  22. //{  
  23. //  GPIO_InitTypeDef GPIO_InitStructure;  
  24. //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //開啟GPIOD的時鐘  
  25. //   
  26. //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //設置引腳
  27. //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //速率50MHz  
  28. //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //配置輸入模式為上拉輸入模式  
  29. //   
  30. //  GPIO_Init(GPIOA, &GPIO_InitStructure);//把上面的配置初始化  
  31. //}  
  32. //  
  33. //static void DS1302_IO_OUT(void)//設置IO數據引腳的輸出模式的配置  
  34. //{  
  35. //  GPIO_InitTypeDef GPIO_InitStructure;  
  36. //  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//開啟GPIOD時鐘  
  37. //   
  38. //  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//設置引腳  
  39. //  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  40. //  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置為推挽輸出  
  41. //   
  42. //  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
  43. //}  


  44. //向DS1302寫入一個字節數據
  45. void DS1302_Write_Byte(u8 addr, u8 data)
  46. {
  47.   u8 i;
  48.         DS1302_RST = 0;      //停止DS1302總線
  49.         delay_us(10);
  50.         DS1302_RST = 1;      //啟動DS1302總線
  51.         addr = addr & 0xFE;  //最低位置零,寫數據
  52.         DS1302_IO_OUT();
  53.         for(i = 0; i < 8; i ++)  //寫地址
  54.         {
  55.           if (addr & 0x01)
  56.                         DS1302_DATA_OUT = 1;
  57.                 else
  58.                         DS1302_DATA_OUT = 0;
  59.                
  60.                 DS1302_SCK = 1;    //產生時鐘
  61.                 delay_us(10);
  62.                 DS1302_SCK = 0;
  63.                 addr = addr>>1;
  64.         }
  65.         for (i = 0; i < 8; i ++) //寫數據
  66.         {
  67.           if(data & 0x01)
  68.                         DS1302_DATA_OUT = 1;
  69.                 else
  70.                         DS1302_DATA_OUT = 0;
  71.                
  72.                 DS1302_SCK = 1;   //產生時鐘
  73.                 delay_us(10);
  74.                 DS1302_SCK = 0;
  75.           data = data>>1;
  76.         }
  77.         DS1302_RST = 0;      //停止DS1302總線
  78. }

  79. //從DS1302讀出一個字節數據
  80. u8 DS1302_Read_Byte(u8 addr)
  81. {
  82.   u8 i,temp;
  83.         DS1302_RST = 0;      //停止DS1302總線
  84.         delay_us(10);
  85.         DS1302_RST = 1;      //啟動DS1302總線
  86.         addr = addr | 0x01;  //最低位置高,讀數據
  87.         DS1302_IO_OUT();
  88.         for(i = 0; i < 8; i ++)  //寫地址
  89.         {
  90.           if (addr & 0x01)
  91.                         DS1302_DATA_OUT = 1;
  92.                 else
  93.                         DS1302_DATA_OUT = 0;
  94.                
  95.                 DS1302_SCK = 1;    //產生時鐘
  96.                 delay_us(10);
  97.                 DS1302_SCK = 0;
  98.                 addr = addr>>1;
  99.         }
  100.         DS1302_IO_IN();
  101.         for (i = 0; i < 8; i ++) //讀數據
  102.         {
  103.           temp = temp >> 1;
  104.                 if(DS1302_DATA_IN)
  105.                         temp |= 0x80;
  106.                 else
  107.                         temp &= 0x7F;
  108.                
  109.                 DS1302_SCK = 1;   //產生時鐘
  110.                 delay_us(10);
  111.                 DS1302_SCK = 0;
  112.         }
  113.         DS1302_RST = 0;      //停止DS1302總線
  114.         return temp;
  115. }

  116. //向DS1302寫入時間數據
  117. void DS1302_Write_Time(void)
  118. {
  119.   DS1302_Write_Byte(ds1302_control_add, 0x00);      //關閉寫保護
  120.   DS1302_Write_Byte(ds1302_sec_add, 0x80);          //暫停時鐘
  121.         //DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //涓流充電
  122.         DS1302_Write_Byte(ds1302_year_add,time_buf[1]);                //年
  123.         DS1302_Write_Byte(ds1302_month_add,time_buf[2]);        //月
  124.         DS1302_Write_Byte(ds1302_date_add,time_buf[3]);                //日
  125.         DS1302_Write_Byte(ds1302_hr_add,time_buf[4]);                  //時
  126.         DS1302_Write_Byte(ds1302_min_add,time_buf[5]);                //分
  127.         DS1302_Write_Byte(ds1302_sec_add,time_buf[6]);                //秒
  128.         DS1302_Write_Byte(ds1302_day_add,time_buf[7]);                //周
  129.         DS1302_Write_Byte(ds1302_control_add,0x80);                    //打開寫保護
  130. }

  131. //從DS302讀出時鐘數據
  132. void DS1302_Read_Time(void)  
  133. {
  134.         time[1] = DS1302_Read_Byte(ds1302_year_add);                   //年
  135.         time[2] = DS1302_Read_Byte(ds1302_month_add);                   //月
  136.         time[3] = DS1302_Read_Byte(ds1302_date_add);                   //日
  137.         time[4] = DS1302_Read_Byte(ds1302_hr_add);                     //時
  138.         time[5] = DS1302_Read_Byte(ds1302_min_add);                     //分
  139.         time[6] = (DS1302_Read_Byte(ds1302_sec_add))&0x7f; //秒,屏蔽秒的第7位,避免超出59
  140.         time[7] = DS1302_Read_Byte(ds1302_day_add);                     //周         
  141. }

  142. ////DS1302向上層返回時間數據
  143. //void DS1302_Get_Time(u8 *time)
  144. //{
  145. //        DS1302_Read_Time();
  146. //        time[0]=(time_buf[0]>>4);   //年   
  147. //  time[1]=(time_buf[0]&0x0f);
  148. //   
  149. //  time[2]=(time_buf[1]>>4);   
  150. //  time[3]=(time_buf[1]&0x0f);
  151. //  
  152. //  time[4]=(time_buf[2]>>4);   //月  
  153. //  time[5]=(time_buf[2]&0x0f);

  154. //  time[6]=(time_buf[3]>>4);   //日   
  155. //  time[7]=(time_buf[3]&0x0f);
  156. //   
  157. //  time[8]=(time_buf[7]&0x07); //星期
  158. //   
  159. //  time[9]=(time_buf[4]>>4);   //時   
  160. //  time[10]=(time_buf[4]&0x0f);   

  161. //  time[11]=(time_buf[5]>>4);  //分   
  162. //  time[12]=(time_buf[5]&0x0f);   

  163. //  time[13]=(time_buf[6]>>4);  //秒
  164. //  time[14]=(time_buf[6]&0x0f);
  165. //}
復制代碼





DS1302.h
  1. #ifndef __DS1302_H
  2. #define __DS1302_H
  3. #include "sys.h"

  4. //IO方向設置
  5. #define DS1302_IO_IN()  {GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=8<<8;}
  6. #define DS1302_IO_OUT() {GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=3<<8;}
  7. //IO操作函數                                                                           
  8. #define        DS1302_DATA_OUT PAout(10) //數據端口        PA10
  9. #define        DS1302_DATA_IN  PAin(10)  //數據端口        PA10

  10. #define        DS1302_SCK  PAout(11)
  11. #define        DS1302_RST  PAout(9)

  12. //DS1302地址定義
  13. #define ds1302_sec_add                          0x80                //秒數據地址
  14. #define ds1302_min_add                          0x82                //分數據地址
  15. #define ds1302_hr_add                          0x84                //時數據地址
  16. #define ds1302_date_add                          0x86                //日數據地址
  17. #define ds1302_month_add                  0x88                //月數據地址
  18. #define ds1302_day_add                          0x8a                //星期數據地址
  19. #define ds1302_year_add                          0x8c                //年數據地址
  20. #define ds1302_control_add                0x8e                //控制數據地址
  21. #define ds1302_charger_add                0x90                                          
  22. #define ds1302_clkburst_add                0xbe

  23. void DS1302_Init(void);
  24. void DS1302_Write_Byte(u8 addr, u8 data);
  25. u8 DS1302_Read_Byte(u8 addr);
  26. void DS1302_Write_Time(void);
  27. void DS1302_Read_Time(void);
  28. //void DS1302_Get_Time(u8 *time);

  29. #endif
復制代碼





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

使用道具 舉報

沙發
ID:384109 發表于 2022-10-28 23:41 | 只看該作者
1302的地址錯了,1302讀和寫是不同的地址
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣中文字幕一区二区三区 | 91亚洲欧美 | 日韩久久中文字幕 | 国产精品久久久久久福利一牛影视 | www.99re| 日韩成人在线观看 | 久久久网 | 日韩精品久久久久 | 91精品国产综合久久精品图片 | 国产精品久久久久久久久久免费 | 午夜二区 | 一本一道久久a久久精品蜜桃 | 亚洲精品日韩一区二区电影 | 日韩国产免费观看 | 综合精品 | 国产高清免费视频 | 精品日本久久久久久久久久 | 亚洲免费久久久 | 久久精品二区亚洲w码 | 免费观看一级毛片 | 伊人精品一区二区三区 | 国产一级一级国产 | 日韩国产精品一区二区三区 | 99这里只有精品视频 | 老司机成人在线 | www亚洲精品 | 国产日韩一区二区三区 | 成人欧美一区二区三区在线观看 | 一区二区成人 | 一本久久a久久精品亚洲 | 国产精品久久久久久久久久 | 欧美视频 | 免费av在线网站 | 久久大陆 | 一级美国黄色片 | 天堂男人av| 91久久精品国产免费一区 | 久久久久久久久精 | 国产精品a级 | 国产精品毛片一区二区三区 | 日韩中文在线 |