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)
呼呼終於正常了。