引言:本文通過以DS1302芯片為基礎(chǔ),介紹該芯片與FPGA之間SPI通信原理,詳細描述硬件設(shè)計原理及FPGA SPI接口驅(qū)動設(shè)計。
1. DS1302硬件設(shè)計原理
1.1 概述
DS1302是由美國DALLAS公司推出的具有涓細電流充電能力的低功耗實時時鐘芯片。它提供秒、分鐘、小時、天、日期、月份和年份信息,對于少于31天的月份,月末日期會自動調(diào)整,包括閏年的更正。時鐘以24小時或12小時的形式運行,帶有AM/PM指示器。它通過一個簡單的串行SPI接口與微處理器通信,如下圖所示。
圖1:DS1302管腳定義及典型應(yīng)用電路
圖2顯示了DS1302芯片內(nèi)部的主要組件:電源控制、輸入移位寄存器、命令和控制邏輯、振蕩器、實時時鐘和RAM。
圖2:DS1302芯片內(nèi)部框圖
1.2 管腳定義說明:
VCC2:雙電源配置中的主電源引腳。VCC1連接到備用電源(通常為紐扣電池),以在沒有主電源的情況下保持時間和日期。DS1302從VCC1或VCC2中較大的一個操作。當VCC2大于VCC1+0.2V時,VCC2為DS1302供電。當VCC2小于VCC1時,VCC1為DS1302供電。
X1/X2:連接標準32.768kHz石英晶體,石英晶體負載電容典型值為6pF。DS1302也可以由外部32.768kHz振蕩器驅(qū)動,在該配置中,X1引腳連接到外部振蕩器信號,并且X2引腳懸空。
GND:地信號。
CE:使能信號,輸入CE信號必須在讀取或?qū)懭肫陂g被斷言為高電平。該引腳有一個內(nèi)部40kΩ(典型值)下拉電阻器,用于接地。
I/O:輸入/推拉輸出。I/O引腳是3線接口的雙向數(shù)據(jù)引腳。該引腳有一個內(nèi)部40kΩ(典型值)下拉電阻器,用于接地。
SCLK:SCLK用于同步串行接口上的數(shù)據(jù)通信。該引腳有一個內(nèi)部40kΩ(典型值)下拉電阻器,用于接地。
VCC1:單電源和電池操作系統(tǒng)中的低功率操作以及低功率電池備份。
1.3 振蕩電路
DS1302使用外部32.768kHz晶體,由于芯片內(nèi)部集成了負載電容,振蕩器電路不需要任何外部電阻器或電容器來操作。表1規(guī)定了外部晶體的參數(shù)要求。
表1:外部晶體的參數(shù)要求
1.4 時鐘精度
時鐘的精度取決于晶體的精度以及振蕩器電路的電容性負載與晶體的電容性負荷之間的匹配精度。溫度偏移引起的晶體頻率漂移將增加額外的誤差。耦合到振蕩器電路中的外部電路噪聲可能導致時鐘快速運行。圖3顯示了用于隔離晶體和振蕩器與噪聲的典型PC板布局。
圖3:隔離噪聲的典型PCB板布局
1.5 原理圖設(shè)計
DS1302與FPGA通過三線SPI接口進行通信,信號連接較為簡單,信號對IO接口速率無要求。
圖4:DS1302原理圖設(shè)計
2. FPGA軟件設(shè)計
2.1 SPI接口讀寫時序
SPI接口讀時序操作如圖5所示。讀操作分為兩個階段,第一階段進行寫命令操作,即往I/O數(shù)據(jù)線上寫入需要讀出的寄存器地址,第二階段是從I/O數(shù)據(jù)線上讀取當前寄存器數(shù)據(jù)。
圖5:SPI接口讀操作時序
(1)使能信號CE為高電平,開啟讀操作,啟動時,SCLK必須為低電平;
(2)在SCLK時鐘的上升沿寫入命令字節(jié)到I/O數(shù)據(jù)線;
(3)在SCLK時鐘的下降沿從I/O數(shù)據(jù)線讀取數(shù)據(jù),要注意第一個讀取的bit D0是在寫命令最后一個bit時鐘的下降沿采樣的;
(4)使能信號CE為低電平,結(jié)束讀操作。SPI接口寫時序操作如圖6所示。寫操作分為兩個階段,第一階段進行寫命令操作,即往I/O數(shù)據(jù)線上寫入需要寫入的寄存器地址,第二階段是往I/O數(shù)據(jù)線上寫入當前寄存器數(shù)據(jù)。
圖6:SPI接口寫操作時序
(1)使能信號CE為高電平,開啟寫操作;
(2)在SCLK時鐘的上升沿寫入命令字節(jié)到I/O數(shù)據(jù)線;
(3)在SCLK時鐘的上升沿寫入數(shù)據(jù)字節(jié)到I/O數(shù)據(jù)線;
(4)使能信號CE為低電平,結(jié)束寫操作。
2.2 寄存器說明
命令字節(jié)
DS1302地址/命令字節(jié)如下表所示。
(1)bit7(MSB):必須是邏輯1。0:禁用對DS1302的寫入;
(2)bit6:0:選擇時鐘/日歷數(shù)據(jù),1:選擇RAM數(shù)據(jù);
(3)bit5~bit1:指定要寫或讀出的指定寄存器地址;
(4)bit0:0:寫操作,1:讀操作。
注意:命令字節(jié)總是從LSB(位0)開始傳輸。
時鐘和日歷寄存器
時間和日歷信息是通過讀取DS1302的寄存器字節(jié)來獲得的。表2說明了RTC寄存器。
表2:RTC寄存器
寄存器說明:
(1)時鐘和日歷初始化:可以通過寫入適當?shù)募拇嫫髯止?jié)來設(shè)置或初始化時間和日歷。
(2)時間和日歷寄存器數(shù)據(jù)格式:二進制編碼十進制(BCD)格式。
(3)星期幾的寄存器在午夜遞增。與星期幾對應(yīng)的值是用戶定義的,但必須是連續(xù)的(即,如果1等于星期日,則2等于星期一,依此類推)。不合理的時間和日期條目會導致未定義的操作。
(4)每當寫入秒寄存器時,就會重置倒計時鏈。寫入傳輸發(fā)生在CE的下降沿。為避免滾動問題,一旦重置倒計時鏈,必須在1秒內(nèi)寫入剩余的時間和日期寄存器。
(5)DS1302可以在12小時或24小時模式下運行。小時寄存器的第7位定義為12小時或24小時模式選擇位。當為高時,選擇12小時模式。在12小時模式中,第5位為AM/PM位,邏輯高為PM。在24小時模式中第5位是第二個10小時位(20–23小時)。每當12/24位發(fā)生變化時,必須重新初始化小時數(shù)據(jù)。
(6)時鐘停止標志:秒寄存器的bit7被定義為時鐘停止(CH)標志。1:振蕩器停止,DS1302進入低功耗待機模式,電流消耗小于100nA;0:時鐘將啟動。 (7)WP寫保護位:控制寄存器的第7位是寫保護位WP。前7位(第0位至第6位)強制為0,讀取時始終讀取0。在對時鐘或RAM進行任何寫入操作之前,位7必須為0。當為高時,寫保護位防止對任何其他寄存器進行寫操作。因此,在嘗試寫入設(shè)備之前,應(yīng)清除WP位。
2.3 軟件設(shè)計
軟件設(shè)計模塊劃分如下圖7所示。
圖7:軟件設(shè)計模塊劃分框圖
軟件主要實現(xiàn)功能:
(1)DS1302芯片SPI接口驅(qū)動功能;
(2)DS1302芯片寄存器讀寫控制功能,可以實現(xiàn)時鐘初始化設(shè)置;
(2)按鍵消抖功能;
(3)數(shù)碼管動態(tài)顯示功能。
各個模塊功能:
(1)ds1302_segma.v模塊為頂層模塊,用于實現(xiàn)模塊間互聯(lián);(2)spi_driver.v實現(xiàn)DS1302 SPI接口通信功能;
(3)ds1302_ctrl_m.v實現(xiàn)DS1302寄存器讀寫控制功能,包括將設(shè)置值寫入芯片和將芯片寄存器值讀出控制。
(4)set_init_time.v實現(xiàn)通過按鍵實現(xiàn)時間初始值設(shè)置;(5)Segma.v實現(xiàn)數(shù)碼管動態(tài)顯示功能(數(shù)碼管位有限,只顯示時、分、秒);
(6)KeyJitters.v實現(xiàn)按鍵消抖功能。
3. 軟件實測
軟件下載至電路板,通過SignaTap II在線邏輯分析儀抓取數(shù)據(jù)如下圖所示。
圖8:軟件設(shè)計模塊劃分框圖
圖9:數(shù)碼管顯示實時時鐘初始值
圖8顯示計時初始值正確寫入ds1302芯片寄存器,圖9數(shù)碼管顯示了正確的時、分、秒初始值。
測試結(jié)果詳見視頻號:FPGA技術(shù)實戰(zhàn)。