wiringpi2顯然也把i2c驅動帶給了Python,手頭上正巧有一個DS3231的模塊,上邊帶了一個DS3231 RTC(實時時鐘),與一片24C32,兩個晶元均為iic匯流排設備,與樹莓派接線如下: 也就是VCC GND SDA SCL四個腳分別接到樹莓派的1(3.3v)、9(0v)、3(SDA...
wiringpi2顯然也把i2c驅動帶給了Python,手頭上正巧有一個DS3231的模塊,上邊帶了一個DS3231 RTC(實時時鐘),與一片24C32,兩個晶元均為iic匯流排設備,與樹莓派接線如下:
也就是VCC GND SDA SCL四個腳分別接到樹莓派的1(3.3v)、9(0v)、3(SDA.1)、5(SCL.1)上,因為樹莓派的I2C介面預設是關閉的,需要先編輯一下/boot/config.txt,去掉 device_tree_param=i2c_arm=on上的註釋(ArchlinuxARM RasperryPi2),然後重啟(註:Raspbian可以用raspi-config打開)
然後重啟,重啟完成後,運行
modprobe i2c-dev
若想這個模塊自動裝載,請把它寫到 /etc/modules-load.d/raspberrypi.conf
安裝i2c-tools,Archlinux下為:
pacman –S i2c-tools
安裝後,運行i2cdetect –y 1結果如下:
嗯,發現了57,68兩個設備,哪個是DS3231,哪個又是24C32呢,我們把裡邊的數據dump出來看看:
可以看到0x57設備裡邊是空的,應該就是24C32了,0x68裡邊讀出來20個位元組,就是DS3231了。
我先解釋下這幾個命令:
i2cdetect顧名思義就是搜索i2c匯流排的設備,樹莓派有2條i2c匯流排,咱們接的SDA.1,SCL.1,當然就是搜索1這條匯流排了(另外一條是SDA.0 SCL.0)
-y參數沒啥意義,就是自己幫你按下y(yes).
i2cdump也很容易理解,就是dump出指定匯流排,指定設備的數據這裡是1匯流排0x57 0x68兩個設備。-y參數跟上個命令是一樣的。
這樣,我們的i2c設備就都通訊上了,下邊就是用wiringpi2庫讀寫之。
wringpi中操作i2c設備的函數主要有一下幾個:
wiringPiI2CSetup() #這個函數的作用是初始化i2c設備,並返回一個設備對象(句柄),接下來,就是使用
wiringPiI2CRead()
wiringPiI2CReadReg16()
wiringPiI2CReadReg8()
wiringPiI2CWrite()
wiringPiI2CWriteReg16()
wiringPiI2CWriteReg8()
等函數來操作I2C匯流排設備了。
經過查閱DS3231的手冊,DS3231的第一個寄存器值,讀出的是秒,我們就讀一下這個地址,代碼比較簡單,就直接在python shell裡邊寫下來執行就行了代碼如下“
可以看到,我們讀出來了秒,我們把程式寫進文件,一秒鐘讀一次:
import wiringpi2 as wpi ds=wpi.wiringPiI2CSetup(0x68) while True: sec=wpi.wiringPiI2CReadReg8(ds,0) print(sec,end=' ',flush=True) wpi.delay(1000)
結果……
原來,這個RTC時鐘讀出來的是BCD碼,比如9以後就是16,16的二進位為0001(1) 0000(0),4位一組,就是10,我編寫了個小函數,把BCD碼轉換成10進位輸出:
import wiringpi2 as wpi def b2s(bcd): return (bcd>>4)*10+(bcd&0xf) #高4位*10加上低四位 ds=wpi.wiringPiI2CSetup(0x68) while True: sec=wpi.wiringPiI2CReadReg8(ds,0) print(b2s(sec),end=' ',flush=True) wpi.delay(1000)
呼呼終於正常了。