|
Xilinx FPGA入門連載63:基于數(shù)碼管顯示的RTC讀取之RTC芯片解析 特權(quán)同學,版權(quán)所有 配套例程和更多資料下載鏈接:
本實例使用的RTC實時時鐘芯片是型號為PCF8563,是PHILIPS 公司推出的一款工業(yè)級內(nèi)含IIC 總線接口功能的具有極低功耗的多功能時鐘/日歷芯片。PCF8563的多種報警功能、定時器功能、時鐘輸出功能以及中斷輸出功能能完成各種復雜的定時服務,甚至可為單片機提供看門狗功能。內(nèi)部時鐘電路、內(nèi)部振蕩電路、內(nèi)部低電壓檢測電路(1.0V) 以 及兩線制IIC 總線通訊方式,不但使外圍電路及其簡潔,而且也增加了芯片的可靠性。同時每次讀寫數(shù)據(jù)后內(nèi)嵌的字地址寄存器會自動產(chǎn)生增量,因而PCF8563 是一款性價比極高的時鐘芯片,它已被廣泛用于電表、水表、氣表、電話、傳真機、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域。 特性 ● 寬電壓范圍1.0 5.5V 復位電壓標準值Vlow=0.9V ● 超低功耗典型值為0.25 A VDD=3.0V,Tamb=25°C ● 可編程時鐘輸出頻率為32.768KHz/1024Hz/32Hz/1Hz ● 四種報警功能和定時器功能 ● 開漏中斷輸出 ● 400kHz的IIC 總線(VDD=1.8-5.5V) 其從地址讀0xa3,寫0xa2 PCF8563的引腳排列及描述如下所示。
PCF8563有16 個位寄存器:一個可自動增量的地址寄存器,一個內(nèi)置32.768KHz 的振蕩器(帶有一個內(nèi)部集成的電容),一個分頻器用于給實時時鐘RTC 提供源時鐘,一個可編程時鐘輸出,一個定時器,一個報警器,一個掉電檢測器和一個400KHz的IIC 總線接口。 所有 16 個寄存器設(shè)計成可尋址的8 位并行寄存器,但不是所有位都有用。前兩個寄存器(內(nèi)存地址00H 01H)用于控制寄存器和狀態(tài)寄存器,內(nèi)存地址02H~08H 用于時鐘計數(shù)器(秒~年計數(shù)器),地址09H~0CH用于報警寄存器(定義報警條件),地址0DH 控制CLKOUT 引腳的輸出頻率,地址0EH 和0FH分別用于定時器控制寄存器和定時器寄存器。秒、分鐘、小時、日、月、年、分鐘報警、小時報警、日報警寄存器,編碼格式為BCD,星期和星期報警寄存器不以BCD 格式編碼。 當一個 RTC 寄存器被讀時,所有計數(shù)器的內(nèi)容被鎖存。因此,在傳送條件下,可以禁止對時鐘日歷芯片的錯讀。 PCF8563 共有16 個寄存器,其中00H~01H為控制方式寄存器;09H~0CH為報警功能寄存器;0DH為時鐘輸出寄存器;0EH 和0FH 為定時器功能寄存器,02H~08H為秒~年時間寄存器。各寄存器的位描述如下示。
看了這么多條條框框的寄存器描述,大家一定有些累了,下面我們來電實用的,和大家簡單說說如何使用這個芯片初始設(shè)置或讀出年月日時分秒等信息。 我們將并且只能夠使用IIC接口來讀寫這個芯片的各個寄存器,IIC接口有一定的協(xié)議,需要按照協(xié)議規(guī)定送起始位、器件地址、讀寫寄存器地址、讀寫數(shù)據(jù)、停止位等,這個內(nèi)容我們下一小節(jié)的設(shè)計中詳細探討,后面我們先拋開IIC具體讀寫控制時序,先從宏觀角度來把該讀寫哪些寄存器這碼事理清楚。 正常來說,一個芯片的使用,無外乎設(shè)置一下控制寄存器,然后讀寫相關(guān)數(shù)據(jù),必要的話產(chǎn)生一個中斷,此時可能回去看看狀態(tài)寄存器。不過,我們這顆RTC更簡單,地址0x00和0x01的控制寄存器1和2默認狀態(tài)即可,我們只需要讀寫時間便可,其他什么報警、中斷等功能留待大家有興趣自己琢磨去。好,那么簡單又是怎么操作的,不急,精彩馬上送到。 地址0x02~0x08寄存器的內(nèi)容是秒、分、時、日、星期、月、年信息,我們只要操作他們便可以了。 假設(shè)現(xiàn)在我們就是要把這些基本的時間信息讀出來,然后以我們最常規(guī)的大家都能看得懂的10進制方式顯示出來,那么如何操作?就按下面這個步驟就好,至于原理,大家回去對照各個寄存器的定義稍微一想也就能夠領(lǐng)會。 ① 讀地址0x02的秒寄存器數(shù)據(jù)second,在顯示時,十位數(shù)據(jù)為((second&0x70)>>4),個位的數(shù)據(jù)為(second&0x0f)。 ② 讀地址0x03的分鐘寄存器數(shù)據(jù)minute,在顯示時,十位數(shù)據(jù)為((minute&0x70)>>4),個位的數(shù)據(jù)為(minute&0x0f)。 ③ 讀地址0x04的小時寄存器數(shù)據(jù)hour,在顯示時,十位數(shù)據(jù)為((hour&0x30)>>4),個位的數(shù)據(jù)為(hour&0x0f)。 ④ 讀地址0x05的日寄存器數(shù)據(jù)day,在顯示時,十位數(shù)據(jù)為((day&0x30)>>4),個位的數(shù)據(jù)為(day&0x0f)。 ⑤ 讀地址0x06的星期寄存器數(shù)據(jù)week,在顯示時,數(shù)據(jù)為(week&0x07)。 ⑥ 讀地址0x07的月份寄存器數(shù)據(jù)month,在顯示時,十位數(shù)據(jù)為((month&0x10)>>4),個位的數(shù)據(jù)為(month&0x0f)。 ⑦ 讀地址0x08的年寄存器數(shù)據(jù)year,在顯示時,十位數(shù)據(jù)為((year&0xf0)>>4),個位的數(shù)據(jù)為(year&0x0f)。 以上這些寄存器值,如果我們希望重設(shè),直接往里面寫數(shù)據(jù)即可,這樣我們便可以調(diào)整當前的時間和實際時間同步,因為我們芯片是由3V的紐扣電池供電的,所以即便我們的電路板下電后,芯片內(nèi)部的時間計數(shù)單元還是在正常工作運轉(zhuǎn)的。 |