介紹了美國(guó)Dallas公司推出的低功耗時(shí)鐘器件DS3231的結(jié)構(gòu)和工作原理,DS3231能對(duì)年、月、日、時(shí)、分、秒計(jì)時(shí),且具有溫度補(bǔ)償、閏年補(bǔ)償?shù)榷喾N功能。給出了AVR單片機(jī)ATmega8與DS3231的軟、硬件接口設(shè)計(jì)。
由單片機(jī)構(gòu)成的測(cè)控系統(tǒng)或智能顯示屏經(jīng)常需要用到實(shí)時(shí)日歷或時(shí)鐘信號(hào)。為節(jié)省CPU資源,本文節(jié)紹了串行時(shí)鐘器件DS3231的應(yīng)用及其與AVR單片機(jī)ATmega8的接口,該系統(tǒng)具有抗干擾能力強(qiáng),計(jì)時(shí)準(zhǔn)確且不隨季節(jié)變化產(chǎn)生誤差的特點(diǎn)。
1.3231的組成及工作原理
如圖1所示,DS3231的主要組成部分有8個(gè)模塊,劃分為4個(gè)功能組:TCXO、電源控制、按鈕復(fù)位和RTC。
DS3231是低成本、高精度I2C實(shí)時(shí)時(shí)鐘(RTC)器件,具有集成的溫度補(bǔ)償晶體振蕩器(TCXO)。該器件包含電池輸入端,斷開(kāi)主電源時(shí)仍可保持精確計(jì)時(shí)。集成的晶體振蕩器可提高器件的長(zhǎng)期精確度。DS3231的寄存器能保存秒、分、時(shí)、星期、日期、月、年和鬧鐘設(shè)置等信息。少于31天的月份,可自動(dòng)調(diào)整月末日期,包括閏年補(bǔ)償。DS3231提供兩個(gè)可編程日歷鬧鐘和一路可編程方波輸出。地址與數(shù)據(jù)通過(guò)I2C雙向串行總線傳輸。
時(shí)鐘和日歷 RTC
可以通過(guò)讀取適當(dāng)?shù)募拇嫫髯止?jié)獲得時(shí)鐘和日歷信息。通過(guò)寫(xiě)入適當(dāng)?shù)募拇嫫髯止?jié)設(shè)定或者初始化時(shí)鐘和日歷數(shù)據(jù)。時(shí)鐘和日歷寄存器的內(nèi)容采用二-十進(jìn)制編碼(BCD)格式。DS3231運(yùn)行于12小時(shí)或者24小時(shí)模式。小時(shí)寄存器的第6位定義為12或24小時(shí)模式選擇位。該位為高時(shí),選擇12小時(shí)模式。在12小時(shí)模式下,第5位為AM/PM指示位,邏輯高時(shí)為PM。
32 kHz的TCXO
TCXO包括溫度傳感器、振蕩器和控制邏輯。控制器讀取片上溫度傳感器輸出,使用查表法確定所需的電容,加上AGE寄存器的老化修正。然后設(shè)置電容選擇寄存器。僅在溫度變化或者用戶啟動(dòng)的溫度轉(zhuǎn)換完成時(shí),才加載包括AGE寄存器變化的新值。VCC初次上電時(shí)就會(huì)讀取溫度值,然后每隔64 s讀取一次。
電源控制
電源控制功能由溫度補(bǔ)償電壓基準(zhǔn)(VPF)和監(jiān)視VCC電平的比較器電路提供。當(dāng)VCC高于VPF時(shí),DS3231由VCC供電,當(dāng)VCC低于VPF但高于VBAT時(shí),DS3231由VCC供電;當(dāng)VCC低于VPF并低于VBAT時(shí),DS3231由VBAT供電。為保護(hù)電池,VBAT首次加到器件時(shí)振蕩器并不啟動(dòng),除非加載VCC,或者向器件寫(xiě)入一個(gè)有效的I2C地址。典型的振蕩器啟動(dòng)時(shí)間在1 s以內(nèi)。在VCC加電后或者有效的I2C地址寫(xiě)入后大約2 s,器件會(huì)測(cè)量一次溫度,并使用計(jì)算的修正值校準(zhǔn)振蕩器。一旦振蕩器運(yùn)行,只要電源(VCC或者VBAT)有效就會(huì)一直保持工作狀態(tài)。器件每隔64 s進(jìn)行一次溫度測(cè)量并校準(zhǔn)振蕩器頻率。
按鈕復(fù)位
DS3231具有連接至RST輸出引腳的按鈕開(kāi)關(guān)功能。若DS3231不在復(fù)位周期,會(huì)持續(xù)監(jiān)視RST信號(hào)的下降沿。如果檢測(cè)到一個(gè)邊沿轉(zhuǎn)換,DS3231通過(guò)拉低RST完成開(kāi)關(guān)去抖。內(nèi)部定時(shí)器定時(shí)結(jié)束后,DS3231繼續(xù)監(jiān)視RST信號(hào)。如果信號(hào)依舊保持低電平,DS3231持續(xù)監(jiān)視信號(hào)線以檢測(cè)上升沿。一旦檢測(cè)到按鈕釋放,DS3231強(qiáng)制RST為低電平并保持tRST。RST還可用于指示電源故障報(bào)警情況。當(dāng)VCC低于VPF時(shí),產(chǎn)生內(nèi)部電源故障報(bào)警信號(hào),并強(qiáng)制拉低RST引腳。當(dāng)VCC返回至超過(guò)VPF電平時(shí)。RST保持低電平大約250 ms(tREC),使供電電源達(dá)到穩(wěn)定。如果在VCC加載時(shí),振蕩器不工作,將跳過(guò)tREC,RST立刻變?yōu)楦唠娖健?/p>
鬧鐘
DS3231包含2個(gè)定時(shí)/日期鬧鐘。鬧鐘1可通過(guò)寫(xiě)入寄存器07h~0Ah設(shè)定。鬧鐘2可通過(guò)寫(xiě)入寄存器0Bh~0Dh設(shè)定??蓪?duì)鬧鐘進(jìn)行編程(通過(guò)控制寄存器的鬧鐘使能位和INTCN位),從而在鬧鐘匹配條件下觸發(fā)INT/SQW輸出。每個(gè)定時(shí)/日期鬧鐘寄存器的第7位是屏蔽位。當(dāng)每個(gè)鬧鐘的屏蔽位均為邏輯0時(shí),只有當(dāng)計(jì)時(shí)寄存器中的值與存儲(chǔ)于定時(shí)/日期鬧鐘寄存器中的對(duì)應(yīng)值相匹配時(shí)才會(huì)告警。鬧鐘也可以編程為每秒、分、時(shí)、星期或日期重復(fù)告警。當(dāng)RTC寄存器值與鬧鐘寄存器的設(shè)定值相匹配時(shí),相應(yīng)的鬧鐘標(biāo)志位A1F或A2F置為邏輯1。如果對(duì)應(yīng)的鬧鐘中斷使能位A1IE或A2IE也置為邏輯1,并且INTCN位置為邏輯1,鬧鐘條件將會(huì)觸發(fā)INT/SQW信號(hào)。RTC在時(shí)間和日期寄存器每秒更新時(shí)都會(huì)檢測(cè)匹配情況。
2 DS3231的數(shù)據(jù)交換及其格式
DS3231通過(guò)I2C總線的雙向數(shù)據(jù)線SDA和時(shí)鐘線SCL與外界進(jìn)行數(shù)據(jù)交換。DS3231在I2C總線上作為從器件。I2C主機(jī)通過(guò)執(zhí)行START命令并且在驗(yàn)證器件地址后才可以訪問(wèn)DS3231,然后DS3231的寄存器可以被訪問(wèn)直到執(zhí)行一個(gè)STOP命令為止。DS3231有兩種操作方式:寫(xiě)操作和讀操作。DS3231的地址固定為1101 000。
3. DS3231與AVR單片機(jī)的硬件接口
Atmega系列單片機(jī)片內(nèi)集成2線制串行接口模塊,Atmel稱(chēng)其為T(mén)WI接口。事實(shí)上,TWI與Philips的I2C總線是一回事。AVR硬件實(shí)現(xiàn)的TWI接口是面向字節(jié)和基于中斷的,相對(duì)軟件模擬I2C總線有更好的實(shí)時(shí)性和代碼效率,引腳輸入部分還具有毛刺抑制單元,可去除高頻干擾。圖3是DS3231與AVR單片機(jī)ATmega8的硬件接口電路原理圖。
軟件設(shè)計(jì)中,首先要對(duì)AVR單片機(jī)ATmega8與實(shí)時(shí)鐘器件DS3231進(jìn)行初始化,給DS3231準(zhǔn)確的日期和時(shí)間。不論主控模式還是被控模式,都應(yīng)當(dāng)將TWI控制寄存器TWCR的TWEN位置為1,從而使能TWI模塊。TWEN位被置位后,I/O引腳PC5和PC4轉(zhuǎn)換成SCL和SDA,對(duì)TWI控制寄存器TWCR的操作可在總線上產(chǎn)生START和STOP信號(hào)。對(duì)TWI模塊的操作均為寄存器的讀寫(xiě)操作,Avr-libc沒(méi)有提供專(zhuān)門(mén)的API。
下面的程序是DS3231與AVR單片機(jī)接口部分代碼
#define SLA 0xD0
/*I2C總線主機(jī)模式錯(cuò)誤處理*/
void error(unsigned char type) {
switch (type & 0xF8) {
case 0x20: /*址址寫(xiě)失敗*/
/*stop 停止*/
TWCR = (1 《《 TWINT) | (1 《《 TWEN) | (1 《《 TWSTO);
break;
case 0x30: /*數(shù)據(jù)寫(xiě)失敗*/
/*stop 停止*/
TWCR = (1 《《 TWINT) | (1 《《 TWEN) | (1 《《 TWSTO);
break;
case 0x38: /*仲裁失敗*/
TWCR=(1《《TWINT)|(1《《TWEN)|(1《《TWEA);
break;
case 0x48: /*址址讀失敗*/
/*stop 停止*/
TWCR = (1 《《 TWINT) | (1 《《 TWEN) | (1 《《 TWSTO);
break;
}
}
/*I2C總線多字節(jié)寫(xiě)入
*n為需寫(xiě)入字節(jié)數(shù)
*addr為DS3231的寄存器地址
*數(shù)組dd中為需寫(xiě)入數(shù)據(jù)。
*注意,數(shù)組dd中的數(shù)據(jù)必須是BCD編碼格式
*/
unsigned char twi_ds_write(unsigned char addr,
unsigned char dd[],int n) {
int i;
TWBR = 2;
/*start 啟動(dòng)*/
TWCR = (1 《《 TWINT)| (1 《《 TWSTA)| (1 《《 TWEN);
while (!(TWCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x08) {
error(TWSR);
return 0;
}
/*SLA_W芯片地址*/
TWDR = SLA;
TWCR = (1 《《 TWINT) | (1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8) != 0x18) {
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 《《 TWINT) | (1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8) != 0x28) {
error(TWSR);
return 0;
}
/*dd 寫(xiě)入second,minute等數(shù)據(jù)*/
for(i=0;i《n;i++)
{
TWDR = dd[i];
TWCR = (1 《《 TWINT)| (1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x28) {
error(TWSR);
return 0;
}
}
/*stop 停止*/
TWCR = (1 《《 TWINT) | (1《《TWEA)|(1 《《 TWEN) | (1 《《
TWSTO);
return 1;
}
/*I2C總線多字節(jié)讀取
*addr為DS3231寄存器起始地址,數(shù)組dd存放讀取的n字節(jié)數(shù)據(jù)
*/
unsigned char twi_ds_read(unsigned char addr, unsigned char dd[],int
n) {
int i;
TWBR = 2;
/*start 啟動(dòng)*/
TWCR=(1《《TWINT)|(1《《TWSTA)|(1《《TWEN);
while(?。═WCR&(1《《TWINT)));
if ((TWSR & 0xF8) != 0x08) {
error(TWSR);
return 0;
}
/*SLA_W芯片地址*/
TWDR = SLA;
TWCR = (1 《《 TWINT) | (1 《《 TWEN);
while(!(TW R & ( 《《 TWINT)));
if((TWSR & xF ) != x ) {
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 《《 TWINT)| (1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x28) {
error(TWSR);
return 0;
}
/*start 啟動(dòng)*/
TWCR = (1 《《 TWINT)| (1 《《 TWSTA)| (1 《《 TWEN);
while (!(TWCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x10) {
error(TWSR);
return 0;
}
/*SLA_R 芯片地址*/
TWDR = SLA+1;
TWCR = (1 《《 TWINT)| (1 《《 TWEN);
while (!(TWCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x40) {
error(TWSR);
return 0;
}
/*讀取前n-1個(gè)數(shù)據(jù)*/
for(i=0;i《n-1;i++)
{
TWCR = (1 《《 TWINT)|(1《《TWEA)|(1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8) != 0x50) {
error(TWSR);
return 0;
}
dd[i] = TWDR;
}
/*讀取第n個(gè)數(shù)據(jù)*/
TWCR = (1 《《 TWINT)| (1 《《 TWEN);
while (?。═WCR & (1 《《 TWINT)));
if ((TWSR & 0xF8)!= 0x58) {
error(TWSR);
return 0;
}
dd[n-1] = TWDR;
/*stop 停止*/
TWCR = (1 《《 TWINT)|(1《《TWEA) | (1 《《 TWSTO) | (1 《《
TWEN);
return 1;
}
選用實(shí)時(shí)時(shí)鐘器件DS3 3 和 VR單片機(jī) T 設(shè)計(jì)了一個(gè)日歷時(shí)鐘系統(tǒng),該系統(tǒng)體積小,通用性強(qiáng)。DS3231具有集成的溫度補(bǔ)償晶體振蕩器(TCXO),計(jì)時(shí)準(zhǔn)確且不隨季節(jié)的變化而產(chǎn)生誤差。該系統(tǒng)適用于智能顯示屏以及實(shí)時(shí)測(cè)控系統(tǒng)。
評(píng)論