DS1339
接口:I2C總線
數據:seconds,minutes,hours,day,date,month,year
格式:12 or 24-hour format(AM/PM),時間和日期採用BCD格式
寄存器
地址 |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
功能 |
範圍 |
|||||
00H |
0 |
10秒 |
秒 |
秒 |
00—59 |
|
|||||||||
01H |
0 |
10分 |
分 |
分 |
00-59 |
|
|||||||||
02H |
0 |
12/ |
/PM |
10小時 |
小時 |
小時 |
1-12+AM/PM 00-23 |
|
|||||||
10小時 |
|
||||||||||||||
03H |
0 |
0 |
0 |
0 |
0 |
星期 |
星期 |
1-7 |
|
||||||
04H |
0 |
0 |
10天 |
天 |
天 |
0-31 |
|
||||||||
05H |
世紀 |
0 |
0 |
10月 |
月 |
月/世紀 |
01-12+CENTURY |
|
|||||||
06H |
10年 |
年 |
年 |
00-99 |
|
||||||||||
07H |
A1M1 |
10秒 |
秒 |
報警1秒 |
00-59 |
|
|||||||||
08H |
A1M2 |
10分 |
分 |
報警1分 |
00-59 |
|
|||||||||
09H |
A1M3 |
12/ |
/PM |
10小時 |
小時 |
報警1小時 |
1-12+AM/PM00-23 |
|
|||||||
10小時 |
|
||||||||||||||
0AH |
A1M4 |
DY/DT |
10天 |
星期,天 |
報警1星期,報警1天 |
1-7,1-31 |
|
||||||||
0BH |
A2M2 |
10分 |
分 |
報警2分 |
00-59 |
|
|||||||||
0CH |
A2M3 |
12/ |
/PM |
10小時 |
小時 |
報警2小時 |
1-12+AM/PM00-23 |
|
|||||||
10小時 |
|
||||||||||||||
0DH |
A2M4 |
DY/ |
10天 |
星期,天 |
報警2星期,報警2天 |
1-7,1-31 |
|
||||||||
0EH |
0 |
BBSQI |
RS2 |
RS1 |
INTCN |
A2IE |
A1IE |
控制 |
|
|
|||||
0FH |
OSF |
0 |
0 |
0 |
0 |
0 |
A2F |
A1F |
狀態 |
|
|
||||
10H |
TCS3 |
TCS2 |
TCS1 |
TCS0 |
DS1 |
DS0 |
ROUT1 |
ROUT0 |
涓流充電器 |
|
|
說明:
☆ 時間寄存器的B6選擇12或24小時模式,1=12小時模式,0=24小時模式;
☆ 12小時模式時,AM/PM位=1是PM,0=AM;
☆ 24小時模式時,小時寄存器的B5是10小時位(20到23時);
☆ 當12/24模式改變時,所有的小時值(包括報警)都必須重新輸入;
☆ 當從99年到00年時,就觸發月寄存器的B7(世紀);
☆ 星期寄存器在午夜遞增,和星期對應的值是可以自定義的,但必須是順序的(如1對應星期天,則2就對應星期一,等等);
☆ 控制寄存器的INTCN位使能報警;
☆ 控制寄存器0EH
EOSC:晶振使能0=啓動晶振,1=停止晶振,缺省=0;
BBSQI:1=當沒有VCC使用VBACKUP時輸出方波或中斷,0=當VCC低於VPF時SQW/INT腳變成高阻態。缺省是0;
RS2:RS1:控制方波輸出頻率,如下表所示,缺省是11;
SQW/INT輸出
INTCN |
RS2 |
RS1 |
SQW/ 輸出 |
A2IE |
A1IE |
0 |
0 |
0 |
1Hz |
X |
X |
0 |
0 |
1 |
4.096kHz |
X |
X |
0 |
1 |
0 |
8.192kHz |
X |
X |
0 |
1 |
1 |
32.768kHz |
X |
X |
1 |
X |
X |
0 |
1 |
|
1 |
X |
X |
1 |
0 |
|
1 |
X |
X |
+ |
1 |
1 |
INTCN:1=時間寄存器和報警1或報警2之間匹配時激活SQW/INT腳(假設報警使能),0=SQW/INT輸出方波。缺省是0;
A2IE:1=允許報警2標誌(A2F)激活SQW/INT,0=A2F不能激活中斷,缺省是0;
A1IE:1=允許報警1標誌(A1F)激活SQW/INT,0=A1F不能激活中斷,缺省是0;
☆ 狀態寄存器
OSF:晶振停止標誌,1=晶振停止了或者是停止過,開機後應軟件清零;
A2F:1=表示時間和報警2寄存器匹配,可以軟件清零;
A1F:1=表示時間和報警1寄存器匹配,可以軟件清零;
☆ 涓流充電器寄存器
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
功能 |
X |
X |
X |
X |
0 |
0 |
X |
X |
禁止 |
X |
X |
X |
X |
1 |
1 |
X |
X |
禁止 |
X |
X |
X |
X |
X |
X |
0 |
0 |
禁止 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
沒有二極管,250Ω電阻 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
一個二極管,250Ω電阻 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
沒有二極管,2kΩ電阻 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
一個二極管,2kΩ電阻 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
沒有二極管,4kΩ電阻 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
一個二極管,4kΩ電阻 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
上電初始化值 |
二極管和電阻根據電池的最大充電電流決定,如假設VCC=3.3V,假設選擇了二極管和R2(2KΩ),則:
IMAX=(3.3V-二極管壓降)/R2≈(3.3V-0.7V)/2KΩ≈1.3mA
I2C總線:
SDA和SCL是開漏open-drain輸出;
在傳輸數據時,當時鍾爲高時,數據線必須保持穩定,如果發生改變,就認爲是控制信號;
總線狀態:
☆ 總線不忙:數據和時鐘線都是高電平;
☆ 開始數據傳輸:時鐘爲高電平,數據線有一個下降沿(從高到低);
☆ 停止數據傳輸:時鐘爲高電平,數據線有一個上升沿(從低到高);
☆ 數據有效:在開始條件後,在時鐘爲高電平期間,數據線一直是穩定的,就表示數據有效,數據線必須在時鐘爲低電平時改變,每個數據位一個時鐘脈衝,每個數據從開始條件開始,由停止條件終止;開始和停止之間所傳輸的數據字節數不限。傳輸按字節響應,接收者在第九位返回一個應答。
☆ 應答:每個接收設備在接收到每個字節後必須產生一個應答。主設備必須爲應答送出一個時鐘脈衝;
在應答時,應答設備在應答時鐘脈衝期間拉低SDA線,這樣在應答時鐘脈衝中,SDA線一直是穩定的低電平;
主設備通知從設備數據傳輸結束:最後一個字節後主設備不應答;
☆ 數據傳輸時先送高位;
DS1339作爲從設備(寫模式):
主設備先送地址,地址由1101000(7位)+R/ (方向位,0=寫)組成,在確認地址後,DS1339會給出一個應答;然後主設備可以送寄存器地址給DS1339,同樣DS1339會給一個應答;然後主設備還可以送出0到幾個字節數據,DS1339會對每個字節應答,地址指針每接收到一個字節就遞增一次。
DS1339作爲從設備(讀模式):
第一個字節和上面一樣,但方向位=1;在應答第一個字節後,DS1339就開始送出寄存器指針所指向的寄存器數據,如果在讀之前沒有寫寄存器指針,這寄存器指針就使用用來的值;每送出一個字節,寄存器指針就遞增,DS1339用“不應答”結束一次讀。
上面兩個過程如下圖所示:
數據寫
|
從地址 |
R/W |
|
寄存器地址 |
|
數據 |
|
|
數據 |
|
|
S |
1101000 |
0 |
A |
XXXXXXXX |
A |
XXXXXXXX |
A |
… |
XXXXXXXX |
A |
P |
S—開始,A—應答,P—停止; □—主到從,■—從到主; |
數據讀
|
從地址 |
R/W |
|
數據 |
|
數據 |
|
|
數據 |
|
|
S |
1101000 |
1 |
A |
XXXXXXXX |
A |
XXXXXXXX |
A |
… |
XXXXXXXX |
|
P |
S—開始,A—應答,P—停止; □—主到從,■—從到主; |
數據讀(寫指針,然後讀)
|
|
從地址 |
R/W |
|
寄存器地址 |
|
|
從地址 |
|
R/W |
|
||||||||
|
S |
1101000 |
0 |
A |
XXXXXXXX |
A |
S |
1101000 |
1 |
A |
→ |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
數據 |
|
數據 |
|
|
數據 |
|
|
|
|
|
||||||||
→ |
XXXXXX |
A |
XXXXXX |
A |
… |
XXXXXX |
|
P |
|
|
|
||||||||
S—開始,A—應答,P—停止; □—主到從,■—從到主; |
PIC18F2525 I2C
寄存器
SSPSTAT(狀態寄存器),SSPCON1和SSPCON2(控制寄存器);
SPI模式
寄存器
SSPCON1/SSPSTAT/SSPBUF/SSPSR(不能直接訪問)
接收時,SSPSR和SSPBUF構成雙緩衝,數據先到SSPSR,然後送到SSPBUF;
發送時,數據同時寫到SSPBUF和SSPSR;
SSPSTAT(SPI模式)
B7 |
|
|
|
|
|
|
B0 |
SMP |
CKE |
D/ |
P |
S |
R/ |
UA |
BF |
SMP:採樣
SPI主模式:
1=在數據輸出結尾採樣輸入數據;
0=在數據輸出中間採樣輸入數據;
SPI從模式:
必須=0;
CKE:SPI時鐘選擇位
1=當時鍾狀態從激活變到空閒時傳輸;
0=當時鍾狀態從空閒變到激活時傳輸;
時鐘狀態的極性由CKP位設置。
D/A:地址/數據位
只用在I2C模式中。
P:停止位
只用在I2C模式中。
S:開始位
只用在I2C模式中。
R/W:讀/寫信息位
只用在I2C模式中。
UA:更新地址位
只用在I2C模式中。
BF:緩衝區滿狀態位(接收模式)
1=接收完成,SSPBUF滿;
0=接收沒有完成,SSPBUF空;
SSPCON1:
B7 |
|
|
|
|
|
|
B0 |
WCOL |
SSPOV |
SSPEN |
CKP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
WCOL:寫衝突檢測位(發送模式)
1=寫SSPBUF時仍在發送前一個數據(必須軟件清除);
0=沒有衝突;
SSPOV:接收溢出
SPI從模式:
1=接收到一個新數據,但SSPBUF仍保存了前一個數據,這時,SSPSR中的數據就會丟失;
0=沒有溢出;
SSPEN:同步串行端口使能
1=使能串行端口,把SCK,SDO,SDI和SS配置爲串行端口腳;
0=禁止串行端口;
使能時,這些腳必須正確配置輸入或輸出。
CKP:時鐘極性選擇
1=時鐘的空閒狀態是高電平;
0=時鐘的空閒狀態時低電平;
SSPM3:SSPM0:同步串行端口模式選擇
0101=SPI從模式,時鐘=SCK腳,SS腳控制禁止,SS可以用作I/O腳;
0100=SPI從模式,時鐘=SCK,SS腳控制允許;
0011=SPI主模式,時鐘=TMR2輸出/2;
0010=SPI主模式,時鐘=FOSC/64;
0001=SPI主模式,時鐘=FOSC/16;
0000=SPI主模式,時鐘=FOSC/4;
操作
初始化操作:
4 主(SCK是時鐘輸出)或從(SCK是時鐘輸入)模式
4 時鐘極性
4 數據輸入採樣時間
4 時鐘邊沿(在SCK的上升或下降沿輸出數據)
4 時鐘速率(只對主模式)
4 從選擇模式(只對從模式)
注意:送出數據時高位在先。
I2C模式
寄存器
SSPSTAT(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
SMP |
CKE |
D/ |
P |
S |
R/ |
UA |
BF |
SMP:轉換速率控制
1=標準速度模式,轉換速率控制禁止(100kHz和1MHz);
0=高速模式,允許轉換速率控制(400kHz);
CKE:SMBus選擇
1=使能SMBus特定輸入;
0=禁止SMBus特定輸入;
D/A:數據/地址
主模式:保留
從模式:
1=表示最後一個發送或接收的字節是數據;
0=表示最後發送或接收到的字節是地址;
P:停止位
1=表示最後檢測到一個停止位;
0=最後沒有檢測到停止位;
注:本位在復位和SSPEN=0時清零;
S:開始
1=表示最後檢測到了一個開始位;
0=最後沒有檢測到開始位;
注:本位在復位和SSPEN=0時清零;
R/W:讀/寫信息位
在從模式:
1=讀;
0=寫;
注:本位保存了最後一次地址匹配時的R/W信息,本位只在地址匹配到下一個開始位、停止位或無應答位之間有效。
在主模式:
1=正在發送;
0=沒在發送;
注:本位和SEN、RSEN、PEN、RCEN或ACKEN相或可以指示MSSP是否激活;
UA:更新遞增(只用在10位從模式)
1=表示用戶需要更新SSPADD寄存器中的地址;
0=地址不需要更新;
BF:緩衝區滿狀態位
在發送模式:
1=SSPBUF滿;
0=SSPBUF空;
在接收模式:
1=SSPBUF滿(不包括ACK和停止位);
0=SSPBUF空(不包括ACK和停止位);
SSPCON1:(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
WCOL |
SSPOV |
SSPEN |
CKP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
WCOL:寫衝突檢測位(發送模式)
在主發送模式:
1=當I2C不具備開始發送條件時寫SSPBUF寄存器(必須軟件清零);
0=沒有衝突;
在從發送模式:
1=還在發送前一個數據時寫SSPBUF寄存器(必須軟件清零);
0=沒有衝突;
接收模式:無關位;
SSPOV:接收溢出指示
在接收模式:
1=SSPBUF寄存器前一個數據沒有讀走,又接收到新數據(必須軟件清零);
0=沒有溢出;
在發送模式:無關位;
SSPEN:同步串口使能
1=使能串口,SDA和SCL配置爲串口腳;
0=禁止串口,這些腳配置爲I/O腳;
注:當使能時,必須正確配置SDA和SCL的方向;
CKP:SCK釋放控制
在從模式:
1=釋放時鐘;
0=保持時鐘爲低電平(時鐘擴展),以保證數據建立時間;
在主模式:未用;
SSPM3:SSPM0:同步串口模式選擇
1111=I2C從模式,10位地址,開始和停止位中斷使能;
1110=I2C從模式,7位遞增,開始和停止位中斷使能;
1011=I2C軟件控制主模式(從空閒);
1000=I2C主模式,時鐘=FOSC/(4*(SSPADD+1))
0111=I2C從模式,10位地址;
0110=I2C從模式,7位地址;
SSPCON2:(I2C模式)
B7 |
|
|
|
|
|
|
B0 |
GCEN |
ACKSTAT |
ACKDT |
ACKEN |
RCEN |
PEN |
RSEN |
SEN |
GCEN:通呼使能(只對從模式)
1=當SSPSR接收到一個通呼地址(0000H)時中斷使能;
0=禁止通呼地址;
ACKSTAT:應答狀態(只對主發送模式)
1=沒有從從設備接收到應答;
0=從從設備接收到了應答;
ACKDT:應答數據(只對主接收模式)
1=沒有應答;
0=應答;
ACKEN:應答序列使能(只對主接收模式)
1=初始化SDA和SCL腳的應答序列,併發送ACKDT數據位,硬件自動清零;
0=應答序列無效;
RCEN:接收使能(只對主模式)
1=使能I2C的接收模式;
0=接收無效;
PEN:停止條件使能(只對主模式)
1=初始化SDA和SCL腳的停止條件,硬件自動清零;
0=停止條件無效;
RSEN:重複開始條件使能(只對主模式)
1=初始化SDA和SCL腳的重複開始條件,硬件自動清零;
0=重複開始條件無效;
SEN:開始條件使能/擴展使能
在主模式:
1=初始化SDA和SCL腳的開始條件,硬件自動清零;
0=開始條件無效;
在從模式:
1=從發送和接收都使能時鐘擴展(擴展使能);
0=禁止時鐘擴展;
操作
I2C可以選擇如下模式:
4 I2C主模式時鐘
4 I2C從模式(7位地址)
4 I2C從模式(10位地址)
4 I2C從模式(7位地址),開始和停止位中斷使能
4 I2C從模式(10位地址),開始和停止位中斷使能
4 I2C軟件控制主模式,從模式無效
主模式
一個典型的主模式發送過程可以如下:
1.用戶設置SEN=1,產生一個開始條件;
2.硬件SSPIF=1(需要軟件清零),MSSP在開始其他操作前需要等待所需的啓動時間;
3.從地址加載到SSPBUF;
4.地址從SDA腳送出;
5.MSSP模塊從從設備讀入ACK位,使SSPCON2寄存器的ACKSTAT=0;
6.MSSP模塊在第九個時鐘週期產生一箇中斷,使SSPIF=1(需要軟件清零);
7.8位數據加載到SSPBUF;
8.數據從SDA送出;
9.MSSP模塊從從設備接收ACK信號並寫到SSPCON2寄存器的ACKSTAT位;
10.MSSP模塊在第九個時鐘週期產生一箇中斷,使SSPIF=1;
11.用戶設置PEN=1,產生一個停止條件;
12.一旦停止條件完成就會產生一箇中斷。
一個典型的主模式接收過程可以如下:
1.用戶設置SEN=1,產生一個開始條件;
2.硬件SSPIF=1(需要軟件清零),MSSP在開始其他操作前需要等待所需的啓動時間;
3.從地址加載到SSPBUF;
4.地址從SDA腳送出;
5.MSSP模塊從從設備讀入ACK位,使SSPCON2寄存器的ACKSTAT=0;
6.MSSP模塊在第九個時鐘週期產生一箇中斷,使SSPIF=1(需要軟件清零);
7.用戶使RCEN1=1,開始一次接收;
8.MSSP模塊在接收到8位數據後使SSPIF=1(需要軟件清零);
9.用戶設置ACKDT=0(應答)或1(不應答),並使ACKEN=1(需要軟件清零),使ACKDT從SDA送出;
10.MSSP模塊在第九個時鐘週期產生一箇中斷,使SSPIF=1(需要軟件清零);
11.用戶設置PEN=1,產生一個停止條件;
12.一旦停止條件完成就會產生一箇中斷。
波特率
波特率發生器自動加載SSPADD中的值;
I2C主模式發送
4 ACKSTAT狀態標誌
當從設備應答時,ACKSTAT=0,沒有應答時,ACKSTAT=1;