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