從零實現 IIC 拓展IO口晶元PCF8574T

2021-10-01 22:59:48 字數 1711 閱讀 1302

st的iic因為專利問題十分不好用,所以我們需要用gpio來模擬iic,iic一共兩根線,sda、scl。那麼也能看出來,是半雙工通訊方式。

本次實驗主要是使用pcf8574t,它是乙個專門用於拓展io口的晶元,用iic控制。最多支援一條iic匯流排上掛8個pcf8574t晶元。每個晶元支援8個io口,也就是兩根iic線控制64個io口。其實還有一根int中斷線,專門通知mcu,拓展的io口中有改變電平狀態的。

介紹下晶元的管腳功能:

a0~a2為位址線,前面不是說了一根iic匯流排上最多只能支援8個晶元嗎,其實就是最大支援8個位址。這三根線就是設定晶元位址用的,板子上a0~a2都接gnd,那麼這個晶元的id就是0x00。若都接vcc,那麼id為0x07。

p0~p7為拓展的io口,可以被控制電平狀態,也可以獲取電平狀態。

int為中斷管腳,是乙個輸出管腳,接mcu輸入模式的io口。這個管腳是非常重要和有趣的!它的預設電平狀態為高,當pcf8574t上電時會記錄p0~p7的電平,若有外界改變時會拉低int(由mcu控制改變電平狀態的時候並不會觸發int)。在這個時候,若外界再次改變則int又會為高。也就是說,電平改變與否是跟上電狀態時的電平比較,而通過讀取一遍pcf8574t的資料,則可以重新整理這個記錄的初始值。此時,int從低變為高。所以,我們每當獲取到int為低時,一定要讀一遍值!int就會為高了(這是pcf8574t再被讀值的時候自動重新整理了int),這樣就可以接收到下一次的改變了。

舉個例子:

p4上電狀態為1,此時int為1。若我讓p4接0,那麼int會為0。再次讓p4為1,則int會變回1。若在p4為0時、int為0時,讀一下值,那麼p4仍未0,int為1了。下一次p4變為1,int會變為0。

p4上電狀態為0,此時int為1。若我讓p4接1,那麼int會為0。再次讓p4為0,則int會變回1。若在p4為0時、int為0時,不讀值,而去傳送改變p0的值,那麼p4仍未0,int為1了。下一次p4變為1,int仍舊為1不會再被觸發了,這個時候再去讀pcf8574t的值也沒有用了,int會始終為1。

關係圖我畫出圖來方便理解:

由此可以看出,int是十分重要的,

scl、sda是iic的時鐘線和資料線。

vss、vdd是電源地和電源正。

cubemx配置部分是將scl(ph4)、sda(ph5)配置為推挽輸出,int接的pb12配置為輸入模式。沒什麼好截圖的了

**部分,其實就是上乙個實驗stm32 iic實驗:cubemx eeprom的拓展,pcf8574t的驅動呼叫myiic.c。

實驗目的:通過key0改變pcf8574t的p0來開啟和關閉蜂鳴器(硬體相連),通過更改p4來觸發int(可以通過接地),然後在迴圈中獲取int為低時改變led1的狀態。

if(_u8keystatus[key1])

//若pcf8574_int的管腳為低電平則表示有中斷發生,需要讀乙個位元組

if(pcf8574_int() == gpio_pin_reset)

else

}

實驗效果:如實驗目的一樣,能夠成功。

實踐出真知,多質疑權威,多找邏輯漏洞,在探尋的時候就能學到很多東西。

從零實現 SD卡

cubemx軟體版本是v4.23.0,晶元型號是stm32f103zet6,sd卡是閃迪的64g tf卡,然後用了轉大卡的卡槽。我起初是按照原子的實驗去做,先驗證自己的sd卡是好使的。我買的閃迪64g tf卡,用tf卡轉sd卡槽,充當sd卡。stm32f103支援sdio,這個sdio就如同fmc支...

React從零實現 元件渲染和setState

在react中元件大體分為兩種,一種是乙個純函式,沒有生命週期的。另乙個通過繼承自react.component的類來實現。我們先來寫乙個component類。class component setstate partialstate this.state,partialstate updateco...

從零實現 CAN通訊 回環模式測試

can是controller area network的縮寫,是iso國際標準化的序列通訊協議。是德國博世公司開發面向汽車的can通訊協議。can控制器根據兩根線上的電位差來判斷匯流排電平。匯流排電平分為顯性電平和 電平,二者必居其一。can協議具有以下特點 1.多主控制,在匯流排空閒時多個單元都可...