01分析
前文對ds1337的功能做了詳細講解,FPGA控制不需要使用中斷功能,并且默認晶體振蕩器處于工作狀態(tài)。所以在ds1337處于工作狀態(tài)后,先對日歷相關(guān)寄存器進行初始化,然后每隔一段時間讀取日歷寄存器的數(shù)據(jù),通過ILA抓取初始化和讀出的數(shù)據(jù),查看ds1337芯片是否正常工作,最后把分秒的時間通過兩個數(shù)碼管顯示。
圖1 ds1337原理圖
4位數(shù)碼管采用兩片74hc595芯片進行驅(qū)動,該芯片的驅(qū)動數(shù)碼管的原理可以在前面的一篇文章中查看。
圖2 數(shù)碼管原理圖
頂層模塊的框圖如下所示,包含一個ds1337的讀寫控制模塊ds1337_drive,I2C接口驅(qū)動模塊iic_drive,另外兩個模塊用于驅(qū)動數(shù)碼管顯示分和秒的數(shù)據(jù)。
此處I2C采用連續(xù)地址讀寫方式,由于只需要對日歷寄存器進行讀寫,所以只需要讀寫前七個寄存器的數(shù)據(jù)即可。上電后對連續(xù)的7個地址數(shù)據(jù)進行初始化,然后每隔500ms讀取一次前面七個寄存器的數(shù)據(jù)。
由于前面設(shè)計I2C驅(qū)動模塊時,對于多字節(jié)數(shù)據(jù),會先發(fā)高位,所以秒寄存器的數(shù)據(jù)會在高字節(jié),年寄存器的數(shù)據(jù)會在最低的字節(jié)中。后面數(shù)碼管顯示秒和分的數(shù)據(jù),也是對讀取的高兩個字節(jié)的數(shù)據(jù)進行顯示。
圖3 頂層框圖
其實上述框圖中I2C的驅(qū)動模塊,數(shù)碼管的驅(qū)動模塊在前文都已經(jīng)提供且詳細講解了,本文只是調(diào)用這些通用模塊,根據(jù)原理圖稍作修改即可。這些模塊的代碼本文就不講解了,需要了解的可查看前文,需要代碼的可以在工程中進行查看。
ds1337讀寫控制模塊也很簡單,只需要上電后先對ds1337進行初始化,初始化具體數(shù)值采用參數(shù)化設(shè)置。然后在I2C驅(qū)動模塊空閑500ms后讀取日歷寄存器的數(shù)據(jù)。對應(yīng)代碼如下所示:
02上板調(diào)試
由于此處并沒有ds1337芯片的仿真模型,可以使用eeprom的I2C仿真模型替代。由于是多字節(jié)讀寫,前文eeprom的仿真模型對多字節(jié)數(shù)據(jù)的仿真也不支持,所以本文就不對工程進行仿真,直接使用ILA在線調(diào)試工具抓取I2C讀寫時序,來判斷ds1337是否讀寫成功。
說到這里,其實對于ILA使用不熟練的同學(xué),可以觀察一下我對ILA的例化,頂層的ILA就可以抓取所有底層模塊中的信號,并且不需要把底層模塊信號從端口引出,就是利用”.”這個符號實現(xiàn)的。
由于ds1337的寄存器中的數(shù)據(jù)采用BCD碼進行編碼,則ILA抓取的數(shù)據(jù)使用十六進制進行顯示,可以直接認為是對應(yīng)的十進制數(shù)據(jù)。
頂層初始化設(shè)置的ds1337初始時間為2年3月15日星期天11時37分42秒,使用ILA抓取初始化波形如下所示:
圖4 抓取初始化時序
將初始化的開始信號放大,結(jié)果如下圖所示,需要初始化的數(shù)據(jù)為56’h42371100150302,表示2年3月15日星期天11時37分42秒,由于先寫高位數(shù)據(jù),所以秒在高字節(jié),年在低字節(jié)數(shù)據(jù)。
圖5 放大初始化數(shù)據(jù)
I2C初始化寫時序如下圖所示,黃色信號表示I2C雙向數(shù)據(jù)信號,紅色信號表示I2C的時鐘信號,而天藍色表示該模塊的I2C數(shù)據(jù)輸出,紫紅色信號表示I2C的數(shù)據(jù)輸出使能信號,低電平表示從機應(yīng)答,高電平表示主機輸出信號。
首先輸出起始位之后,輸出器件地址,然后再輸出寄存器地址0,之后就寫入7字節(jié)的數(shù)據(jù),數(shù)據(jù)寫完之后發(fā)送停止位,初始化寫入完成。
圖6 I2C寫時序放大
ds1337初始化之后,就會按每秒計時運行,然后抓取讀ds1337芯片日歷寄存器的波形,結(jié)果如下所示。粉色信號就是抓取的I2C讀取信號rdata,抓取的數(shù)據(jù)為56’h57371100150302,表示2年3月15日星期天11時37分57秒,由于經(jīng)過了一段時間,所以讀取的數(shù)據(jù)相對初始值已經(jīng)過了幾秒了。
圖7 I2C讀時序
就不對時序進行分析了,前文讀寫eeprom的時候已經(jīng)對I2C時序進行了詳細分析,在經(jīng)過一段時間,抓取讀取時序如下所示,讀取的數(shù)據(jù)為56’h113811001503 02,表示2年3月15日星期天11時38分11秒。
圖8 I2C讀時序
最后數(shù)碼管的顯示如下所示,初始化的時為37分42秒,之后就一直運行。
本文工程就是對ds1337的功能做了驗證,也是對I2C模塊的連續(xù)讀寫能力再次進行測試,功能均正常。
-
FPGA
+關(guān)注
關(guān)注
1643文章
21941瀏覽量
613326 -
寄存器
+關(guān)注
關(guān)注
31文章
5412瀏覽量
123111 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1889瀏覽量
92156 -
晶體振蕩器
+關(guān)注
關(guān)注
9文章
681瀏覽量
29790 -
DS1337
+關(guān)注
關(guān)注
0文章
4瀏覽量
6418
原文標題:基于fpga的ds1337讀寫控制
文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
DS1337/DS1337C pdf datasheet (
DS1337 時鐘芯片在 C8051F 上的實現(xiàn)
DS1337S+T&R 時鐘/定時 - 實時時鐘

DS1337U+ 時鐘/定時 - 實時時鐘

DS1337S+ 時鐘/定時 - 實時時鐘

DS1337+ 時鐘/定時 - 實時時鐘

DS1337C# 時鐘/定時 - 實時時鐘

DS1337 時鐘/定時 - 實時時鐘

DS1337U 時鐘/定時 - 實時時鐘

DS1337S 時鐘/定時 - 實時時鐘

DS1337C#T&R 時鐘/定時 - 實時時鐘

DS1337S/T&R 時鐘/定時 - 實時時鐘

DS1337U/T&R 時鐘/定時 - 實時時鐘

DS1337S+C01 時鐘/定時 - 實時時鐘

DS1337U+T&R 時鐘/定時 - 實時時鐘

評論