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