引言:本文通過以DS1302芯片為基礎(chǔ),介紹該芯片與FPGA之間SPI通信原理,詳細(xì)描述硬件設(shè)計原理及FPGA SPI接口驅(qū)動設(shè)計。
1. DS1302硬件設(shè)計原理
1.1 概述
DS1302是由美國DALLAS公司推出的具有涓細(xì)電流充電能力的低功耗實時時鐘芯片。它提供秒、分鐘、小時、天、日期、月份和年份信息,對于少于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中較大的一個操作。當(dāng)VCC2大于VCC1+0.2V時,VCC2為DS1302供電。當(dāng)VCC2小于VCC1時,VCC1為DS1302供電。
X1/X2:連接標(biāo)準(zhǔn)32.768kHz石英晶體,石英晶體負(fù)載電容典型值為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)部集成了負(fù)載電容,振蕩器電路不需要任何外部電阻器或電容器來操作。表1規(guī)定了外部晶體的參數(shù)要求。
表1:外部晶體的參數(shù)要求
1.4 時鐘精度
時鐘的精度取決于晶體的精度以及振蕩器電路的電容性負(fù)載與晶體的電容性負(fù)荷之間的匹配精度。溫度偏移引起的晶體頻率漂移將增加額外的誤差。耦合到振蕩器電路中的外部電路噪聲可能導(dǎo)致時鐘快速運行。圖3顯示了用于隔離晶體和振蕩器與噪聲的典型PC板布局。
圖3:隔離噪聲的典型PCB板布局
1.5 原理圖設(shè)計
DS1302與FPGA通過三線SPI接口進(jìn)行通信,信號連接較為簡單,信號對IO接口速率無要求。
圖4:DS1302原理圖設(shè)計
2. FPGA軟件設(shè)計
2.1 SPI接口讀寫時序
SPI接口讀時序操作如圖5所示。讀操作分為兩個階段,第一階段進(jìn)行寫命令操作,即往I/O數(shù)據(jù)線上寫入需要讀出的寄存器地址,第二階段是從I/O數(shù)據(jù)線上讀取當(dāng)前寄存器數(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所示。寫操作分為兩個階段,第一階段進(jìn)行寫命令操作,即往I/O數(shù)據(jù)線上寫入需要寫入的寄存器地址,第二階段是往I/O數(shù)據(jù)線上寫入當(dāng)前寄存器數(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)時鐘和日歷初始化:可以通過寫入適當(dāng)?shù)募拇嫫髯止?jié)來設(shè)置或初始化時間和日歷。
(2)時間和日歷寄存器數(shù)據(jù)格式:二進(jìn)制編碼十進(jìn)制(BCD)格式。
(3)星期幾的寄存器在午夜遞增。與星期幾對應(yīng)的值是用戶定義的,但必須是連續(xù)的(即,如果1等于星期日,則2等于星期一,依此類推)。不合理的時間和日期條目會導(dǎo)致未定義的操作。
(4)每當(dāng)寫入秒寄存器時,就會重置倒計時鏈。寫入傳輸發(fā)生在CE的下降沿。為避免滾動問題,一旦重置倒計時鏈,必須在1秒內(nèi)寫入剩余的時間和日期寄存器。
(5)DS1302可以在12小時或24小時模式下運行。小時寄存器的第7位定義為12小時或24小時模式選擇位。當(dāng)為高時,選擇12小時模式。在12小時模式中,第5位為AM/PM位,邏輯高為PM。在24小時模式中第5位是第二個10小時位(20–23小時)。每當(dāng)12/24位發(fā)生變化時,必須重新初始化小時數(shù)據(jù)。
(6)時鐘停止標(biāo)志:秒寄存器的bit7被定義為時鐘停止(CH)標(biāo)志。1:振蕩器停止,DS1302進(jìn)入低功耗待機模式,電流消耗小于100nA;0:時鐘將啟動。 (7)WP寫保護(hù)位:控制寄存器的第7位是寫保護(hù)位WP。前7位(第0位至第6位)強制為0,讀取時始終讀取0。在對時鐘或RAM進(jìn)行任何寫入操作之前,位7必須為0。當(dāng)為高時,寫保護(hù)位防止對任何其他寄存器進(jìn)行寫操作。因此,在嘗試寫入設(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)。