天天看點

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

在這裡首先感謝glgoo在google被牆的情況下提供搜尋功能,還要感謝 http://wiringpi.com/ 以及github,盡管自己眼瞎,幾經波折還是發現了塵封已久的少林“七十二絕技”,沒錯,每種絕技都能克制一個樹莓派GPIO控制外設的問題,七十二絕技的核心就是wiringpi這個為Pi GPIO寫的C語言庫了,而每種絕技則暗藏在wiringPi/examples/目錄下,這裡就不一一羅列了,大家想學什麼招式,就去看每個example,都非常簡短。 其實早在第9篇文章“安裝GPIO庫”,就已經下載下傳并安裝了wiringPi,然而後來一直沒用C,而用的是python,python的便捷性、互動式開發使得調試非常友善,直到這一次準備安裝一個DS1302時鐘晶片時,苦于搜不到相關的解決方案,才最終轉回C庫。然而可能會陷入rtc-pi這個C程式來驅動DS1302,這裡面并沒有用wiringPi的封裝,二是直接和<dev/mem>互動了,像我這種菜鳥,暫時不會改裡面的位址,外文網站上又寫的不清楚。好在最終還是搜到了github裡面的ds1302.c,定睛一看原來是在wiringPi項目的examples裡,頓時心中千萬頭草泥馬呼嘯而過。 暫時不必着急看ds1302.c源碼,因為,它相當簡單,把自己的線路連接配接好,引腳編号對應修改就大功告成,然後再仔細品讀源碼不遲。 DS1302時鐘子產品的5個引腳分别是VCC、GND、CLK、DAT、RST,都是有意義的,可以在樹莓派B+上面找到類似的引腳如SCLK、SDA、CE,我們就用這幾個類似的GPIO引腳來和DS1302連接配接,如下圖:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

這裡我們要注意這幾個引腳對應的wPi的編号,而不是BOARD編号,對應關系如下: BOARD - NAME - DS1302 - wPi 1         - 3.3V   - VCC      - 無

23       - SCLK   - CLK      - 14

25       - 0V      - GND      - 無 

27       - SDA.0 - DAT      - 30

24       - CE0    - RST      - 10 是以,我們隻需要用14、30、10這幾個GPIO引腳來程式設計就可以了。 現在,可以打開wiringPi/examples/ds1302.c檔案,它裡面包含了wiring/devLib/下的ds1302.h,隐藏了具體的實作細節,可以先不關注。直接看main函數:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

需要用到的函數就是畫紅線的幾個,首先調用ds1302setup(int clockPin, int dataPin, int csPin)來設定樹莓派GPIO引腳,參數修改成14、30、10即可。setLinuxClock()設定系統的時間,setDSclock()則是根據系統時間設定DS子產品的時間,ramTest對DS子產品的RAM進行測試,ds1302clockRead()從DS子產品讀出時間,細節處理函數這裡略過。現在在examples目錄下make ds1302,成功後即可使用ds1302了。 使用方法: 1)./ds1302 -rtest,測試DS1032的RAM,如果引腳連接配接錯誤GPIO設定錯誤則會報錯:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

成功則會顯示OK:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

2)./ds1302 -sdsc,會調用setDSclock(),将DS子產品設定成系統的時間,在這之前需要把自己的時區設定成本地時區cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime,并且同步網絡時間ntpdate cn.pool.ntp.org

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

3)現在可以從DS子產品讀取時間

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

一段時間後再讀一次:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

看樣子DS子產品已經儲存了系統時間。 4)./ds1302 -slc,從DS子產品讀取時間來設定系統的時間

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

結果設定成了比本地時間慢8個小時,正好是UTC時間。 修改ds1302.c源檔案,找到setDSclocl()函數,其中調用了time()來擷取系統時間,而time()函數傳回的是從UTC(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統的Epoch時間)到目前時刻的秒數,要想從該秒數轉換成本地時間需要用localtime()函數struct tm *localtime(const time_t *clock),最後修改成如下:

(16)給樹莓派B+ 安裝一個實時時鐘晶片DS1302

删除原來的ds1302.o和ds1302,重新make ds1302。 重新執行ntpdate cn.pool.ntp.org同步網絡時間,然後./ds1302 -sdsc設定DS子產品的時間為本地時間,再執行./ds1302檢視時鐘子產品的時間,這時應該就顯示正确了。 5)cp ./ds1302 /usr/bin/下,并添加開機啟動項 Arch下面用的是systemctl,是以需要将/usr/bin/ds1302 -slc指令加到一個service中,我是添加在了網卡啟動服務中。 重新開機後,時間正确,則說明我們的時鐘子產品安裝成功了。

注:本文中的代碼可以通過下載下傳wiring庫然後自行修改examples/ds1302.c,也可以從我的github下載下傳:https://github.com/hustlbj/raspberry

繼續閱讀