久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
一起來(lái)搞定 ds1302
[打印本頁(yè)]
作者:
xiaoyao
時(shí)間:
2014-12-16 17:46
標(biāo)題:
一起來(lái)搞定 ds1302
最近在論壇看到很多同仁在研究ds1302這款時(shí)鐘芯片,正巧公司項(xiàng)目上也用到這個(gè),因?yàn)閷W(xué)習(xí)過(guò)程中遇到些問(wèn)題,略有所悟。突然萌生一個(gè)想法,召集老鳥(niǎo)們過(guò)來(lái)一起吃透這款芯片,然后記錄下來(lái),留給后來(lái)的同學(xué),希望他們能夠獲益,避免走一些彎路...以后也不會(huì)有那么多帖子來(lái)問(wèn)ds1302問(wèn)題。。。。
也希望高手們過(guò)來(lái)一起補(bǔ)充,一起討論遇到的問(wèn)題...更希望曾經(jīng)研究過(guò)這款芯片的同學(xué)來(lái)分享學(xué)習(xí)ds1302遇到的 問(wèn)題以及解決方法....總之,謹(jǐn)以綿薄之力為 后來(lái)要用的這款芯片的同學(xué),提供參考。。。不勝感激!!
DS1302編程注意事項(xiàng):
通信:
1、單片機(jī)通過(guò)三線(xiàn)與ds1302芯片進(jìn)行數(shù)據(jù)通信:reset, data, sclk,但并非I2C通信方式。
2、reset其實(shí)質(zhì)相當(dāng)于片選CE,兩個(gè)作用:
a、選中芯片,開(kāi)啟ds1302移位寄存器,以進(jìn)行數(shù)據(jù)傳輸,且整個(gè)數(shù)據(jù)傳輸過(guò)程中,需要保持為 高電平;
b、突發(fā)訪問(wèn)(多字節(jié)傳輸)模式下,通過(guò)拉低reset來(lái)結(jié)束本次突發(fā)訪問(wèn)模式。
需要注意必須保證在sclk拉低的前提前才能拉高reset(換言之,每次開(kāi)始數(shù)據(jù)通信之前,必須sclk必須為低電平,那么sclk第一個(gè)邊緣則一定為上升沿)。
3、data引腳應(yīng)配置成可以雙向通信的模式(例如:開(kāi)漏輸出,外接上拉電阻),在程序中應(yīng)注意在單片機(jī)從接收ds1302數(shù)據(jù)之前,應(yīng)拉高data,避免影響ds1302輸出數(shù)據(jù);
4、sclk 與 reset引腳,配置為普通輸出模式即可。
5、ds1302時(shí)序:ds1302在sclk上升沿讀取data數(shù)據(jù),下降沿發(fā)布數(shù)據(jù)到data上。應(yīng)注意在ds1302有數(shù)據(jù)輸出時(shí),輸出數(shù)據(jù)開(kāi)始位是緊接著命令發(fā)送字節(jié)的末尾的下降沿輸出的。
操作:
1、任何寫(xiě)操作之前應(yīng)先清除寫(xiě)保護(hù)bit(特別重要)。
2、ds1302應(yīng)外接32768Hz晶振,但并非直接就能起振的 ,需要軟件清除 秒寄存器的bit7 即CH Bit,晶振才能正常工作,從而驅(qū)動(dòng)ds1302內(nèi)部計(jì)數(shù)器,達(dá)到準(zhǔn)確計(jì)時(shí) 的目的,若正常起振,則此時(shí)可以用示波器在晶振引腳處測(cè)出波形。
3、對(duì)于突發(fā)訪問(wèn)模式:即是在sclk的驅(qū)動(dòng)下,可以一次對(duì)多個(gè)寄存器進(jìn)行讀寫(xiě),但是均是從(ram或者時(shí)間/日歷寄存器)地址0開(kāi)始訪問(wèn)的。應(yīng)注意若是突發(fā)模式下寫(xiě) 時(shí)鐘/日歷寄存器 ,則必須要求傳輸8字節(jié)數(shù)據(jù),若是突發(fā)訪問(wèn)ram數(shù)據(jù),則不需要限定字節(jié)數(shù),可以通過(guò)拉低reset來(lái)結(jié)束本次突發(fā)訪問(wèn)。
4、ds1302的ram區(qū)域,掉電丟失,可以利用這種特性來(lái)檢測(cè)ds1302是否為第一次上電,從而確定是否需要配置ds1302。
作者:
xiaoyao
時(shí)間:
2014-12-16 17:46
以下是我編寫(xiě)的DS1302芯片驅(qū)動(dòng)代碼,已測(cè)試,可以正常操作芯片,但是我用到的是stm32單片機(jī),估計(jì)會(huì)有同學(xué)不習(xí)慣使用庫(kù)的風(fēng)格,但是不重要,感興趣的同學(xué)可以參考程序的步驟就可以了,比如要看時(shí)序,就只看那一個(gè) 函數(shù)就可以了。。。。。
更希望用51單片機(jī)開(kāi)發(fā)的同學(xué)要是方便的話(huà),能上傳你寶貴的代碼,讓更多的人簡(jiǎn)單清楚的明白驅(qū)動(dòng)步驟,更好的幫助他們...........謝謝!
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "ds1302.h"
#define DS1302_RESET_PORT GPIOC
#define DS1302_RESET_BIT GPIO_Pin_10
#define DS1302_SCLK_PORT GPIOC
#define DS1302_SCLK_BIT GPIO_Pin_11
#define DS1302_DATA_PORT GPIOC
#define DS1302_DATA_BIT GPIO_Pin_12
void DS1302Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//打開(kāi)時(shí)鐘模塊
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DS1302_RESET_BIT;//reset
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(DS1302_RESET_PORT, &GPIO_InitStructure);//復(fù)位引腳
GPIO_InitStructure.GPIO_Pin = DS1302_SCLK_BIT;
GPIO_Init(DS1302_SCLK_PORT, &GPIO_InitStructure);//SCLK
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);
GPIO_InitStructure.GPIO_Pin = DS1302_DATA_BIT;//data
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//開(kāi)漏輸出,通過(guò)外接上拉電阻,達(dá)到雙向通信
GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);
DS1302TimeConfig();
}
unsigned char CommunicationByte(unsigned char value)
{
unsigned char i, temp;
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
temp = 0;
i = 0;
for(i = 0; i < 8; i++)
{
//接收數(shù)據(jù),數(shù)據(jù)是緊接著控制字最后一位輸出的
asm("NOP");asm("NOP");asm("NOP");asm("NOP");
temp >>= 1;//低位在前
if (GPIO_ReadInputDataBit(DS1302_DATA_PORT, DS1302_DATA_BIT) == 1)
{
temp |= 0x80;
}
//發(fā)送數(shù)據(jù)
if ((value & 0x01) != 0)
{
GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_SET);
}
else
{
GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_RESET);
}
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 1, 上升沿
value >>= 1;//低位在前
asm("NOP");asm("NOP");asm("NOP");asm("NOP");
GPIO_WriteBit(DS1302_DATA_PORT, DS1302_DATA_BIT, Bit_SET);//拉高DATA IO,避免影響芯片輸出
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0,下降沿
}
return temp;
}
void DS1302WriteRegister(unsigned char reg, unsigned char value)
{
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平
CommunicationByte(reg);
CommunicationByte(value);
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;
}
unsigned char DS1302ReadRegister(unsigned char reg)
{
unsigned char temp;
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//只有在SCLK為低電平時(shí)候,才允許將rst置位高電平
CommunicationByte(reg);
temp = CommunicationByte(0xff);
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;
return temp;
}
void DS1302WriteTime(unsigned char *data)
{
unsigned char i;
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//reset = 1;
CommunicationByte(0xbe);//連續(xù)寫(xiě) 日歷/時(shí)鐘寄存器
for (i = 0; i < 8; i++)
{
CommunicationByte(data[i]);
}
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;
}
void DS1302ReadTime(unsigned char *buffer)
{
unsigned char i;
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_RESET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_SET);//reset = 1;
CommunicationByte(0xbf);//連續(xù)讀 日歷/時(shí)鐘寄存器
for (i = 0; i < 8; i++)
{
buffer[i] = CommunicationByte(0xff);
}
GPIO_WriteBit(DS1302_SCLK_PORT, DS1302_SCLK_BIT, Bit_SET);//sclk = 0;
GPIO_WriteBit(DS1302_RESET_PORT, DS1302_RESET_BIT, Bit_RESET);//reset = 0;
}
void DS1302TimeConfig(void)
{
unsigned char temp;
unsigned char data[8] = {0x01,0x10,0x11,0x30,0x11,0x05,0x12};//for test
temp = DS1302ReadRegister(0xc1);//讀取ds1302ram 數(shù)據(jù)
if (temp != 0xaa)//第一次上電
{
DS1302WriteRegister(0x8e, 0x00);//允許寫(xiě)操作
DS1302WriteRegister(0xc0, 0xaa);//置標(biāo)志位
DS1302WriteTime(data);
DS1302WriteRegister(0x8e, 0x80);//禁止寫(xiě)操作
/*
DS1302WriteRegister(0x80,0x01);//設(shè)置秒
DS1302WriteRegister(0x82,0x18);//設(shè)置分
DS1302WriteRegister(0x84,0x17);//設(shè)置時(shí)
DS1302WriteRegister(0x86,0x29);//設(shè)置日
DS1302WriteRegister(0x88,0x11);//設(shè)置月
DS1302WriteRegister(0x8a,0x04);//設(shè)置星期
DS1302WriteRegister(0x8c,0x12);//設(shè)置年
*/
}
}
void DS1302TimeUpdate(unsigned char *data)
{
//data 數(shù)據(jù)應(yīng)為壓縮bcd碼
DS1302WriteRegister(0x8e, 0x00);//允許寫(xiě)操作
DS1302WriteRegister(0xc0, 0xaa);//置標(biāo)志位
DS1302WriteTime(data);//連續(xù)寫(xiě)入 時(shí)鐘/日歷 寄存器數(shù)據(jù)
DS1302WriteRegister(0x8e, 0x80);//禁止寫(xiě)操作
}
復(fù)制代碼
作者:
exv
時(shí)間:
2014-12-16 22:31
樓主真要吃透ds1302可別拉下那31個(gè)ram,參考下這篇文章 “DS1302在溫室CO2增施控制器中的應(yīng)用” 。
作者:
忠信1314
時(shí)間:
2014-12-17 06:34
頂一下 不過(guò)DS1302好像還需要 BCD轉(zhuǎn)碼的吧
作者:
3263065307
時(shí)間:
2016-5-9 11:13
樓主教下我stm32的軟件安裝相關(guān)細(xì)節(jié)可好我的qq3263065307
作者:
hnsyz
時(shí)間:
2018-11-26 16:59
STC芯片需要接上拉電阻,我試了幾天,才想起。
現(xiàn)象:不接外部供電,一讀數(shù)據(jù)就丟失
估計(jì)電池那點(diǎn)電不夠引腳底電平吸的吧。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩在线视频一区二区三区
|
中文字幕亚洲视频
|
中文字幕在线一区二区三区
|
国产精品久久久久久久久动漫
|
黄色一级视频免费
|
欧美日韩中文在线
|
在线成人免费观看
|
日韩av一二三区
|
中国毛片免费
|
亚洲国产精品99久久久久久久久
|
国产福利在线小视频
|
久久成人av电影
|
久久久久一区
|
毛片高清
|
a级毛片免费高清视频
|
久久久精
|
在线观看国产视频
|
国产精品视频观看
|
欧美日韩在线视频一区
|
一区二区三区在线
|
欧美日韩视频在线
|
琪琪午夜伦伦电影福利片
|
视频一区二区在线观看
|
精品欧美黑人一区二区三区
|
日韩成人免费av
|
五月天综合网
|
国产精品免费一区二区三区四区
|
国产乱码精品一区二区三区中文
|
亚洲精品99
|
欧美国产精品一区二区三区
|
久久久久久久久毛片
|
瑟瑟激情
|
欧美999
|
成人在线免费视频
|
国产精品不卡
|
欧美久久久久
|
狠狠狠干
|
日韩蜜桃视频
|
91久久国产综合久久
|
色偷偷噜噜噜亚洲男人
|
福利电影在线
|