樹莓派高級GPIO庫,wiringpi2 for python使用筆記(五)i2c讀取測試


wiringpi2顯然也把i2c驅動帶給了Python,手頭上正巧有一個DS3231的模塊,上邊帶了一個DS3231 RTC(實時時鍾),與一片24C32,兩個芯片均為iic總線設備,與樹莓派接線如下:

QQ圖片20160106013753

image

也就是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打開)

image

然后重啟,重啟完成后,運行

modprobe i2c-dev

若想這個模塊自動裝載,請把它寫到   /etc/modules-load.d/raspberrypi.conf

安裝i2c-tools,Archlinux下為:

pacman –S i2c-tools

安裝后,運行i2cdetect –y 1結果如下:

image

嗯,發現了57,68兩個設備,哪個是DS3231,哪個又是24C32呢,我們把里邊的數據dump出來看看:

image

image

可以看到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里邊寫下來執行就行了代碼如下“
image

可以看到,我們讀出來了秒,我們把程序寫進文件,一秒鍾讀一次:

import wiringpi2 as wpi

ds=wpi.wiringPiI2CSetup(0x68)
while True:
    sec=wpi.wiringPiI2CReadReg8(ds,0)
    print(sec,end=' ',flush=True)
    wpi.delay(1000)

結果……

image

原來,這個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)

image

呼呼終於正常了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM