模擬IIC匯流排協議

2021-08-29 17:56:10 字數 2586 閱讀 1121

模擬iic

簡單講iic匯流排通訊就像你在和你物件打**,講道理,步驟幾乎完全一致。回憶一下自己打**的過程。

你:撥號

你物件:喂?

你:巴拉巴拉–

你物件:哦

你:巴拉巴拉–

你物件:哦

你:掛啦,麼麼噠

你物件:哦

你:掛**

通話結束

iic匯流排時序

那現在來看一下iic匯流排通訊過程

對於你來說,你是打**的,屬於主動方,首先該你寫入資料(以寫入eeprom為例)

1,起始訊號(撥號動作 讀寫方向為 寫 因為你要填號碼)

2,傳送要寫入的資料位址(填入你物件手機號)

3,傳送要儲存資料(就是你巴拉巴拉–一堆的話)

4,每寫入乙個位元組eeprom會回應乙個應答位0說明寫入成功(就是你物件回了個「哦」),未回應則未成功寫入(就像你物件沒聽明白,就不會回答「哦」)

5,停止訊號(掛**)

讀資料流程,以eeprom為例(就像打**的過程中你聽你物件說話)

1,起始訊號(依舊是撥號動作 讀寫方向為寫 因為你要填號碼)

2,寫入位址(你物件手機號)

3,重新進行起始訊號(此時讀寫方向為 讀)傳送資料位址(比如你說了一句:明天去哪吃飯)

4,讀取器件返回的位址(你物件說:去你家吧)

5,繼續讀資料則寫應答,不讀則寫入非應答(你接著問:吃點啥,你物件回答:隨便。你不想問了,說 掛了啊(非應答))

6,停止訊號(掛**)

(讀寫操作可以連續進行)

以上是讀寫過程,怎麼使用微控制器模擬出該過程,分別介紹各個步驟的函式實現

iic匯流排有兩條線,一條資料線sda(記憶:data資料),一條時鐘線scl(記憶:clock時鐘)

(1),起始訊號

由時序圖可見scl高電平期間,sda出現乙個下降沿表示起始訊號。

**實現

void iic_start()

(2)資料傳輸

當scl為低電平的時候sda允許變化,即傳送方必須先保證scl為低電平再進行資料的讀寫操作,當scl為高電平時,寫資料一方不可以變化,此時讀資料方讀取該位資料的0/1,8位資料後跟應答位,來決定是否繼續讀寫

寫乙個位元組資料**實現

void iic_send_byte(uint8_t txd)

讀乙個位元組資料**實現

//返回值為收到的資料

//引數為是否應答1應答0不應答

uint8_t iic_read_byte(uint8_t ack)

//延時一小會 保證乙個可靠的電平

iic_delay()

//時鐘線拉低,允許下一位資料改變

scl = 0;

}if(!ack)

else

}(3)停止訊號

scl高電平期間,sda產生乙個上公升沿 表示停止

**實現

void iic_stop()

(4)應答與非應答,等待應答

根據時序圖可以看出,第九位資料持續為低電平的時候即為應答,這部分比較簡單

**實現

//應答函式

void iic_ack()

//非應答

void iic_nack()

//等待應答

uint8_t iic_wait_ack()

}scl = 0;

return 0 ;

}(4)讀寫資料過程

寫資料過程

起始訊號-》傳送器件位址-》等待應答-》傳送寫資料位址-》等待應答-》傳送寫入資料-》等待應答-》停止訊號

(給你女票打**-》等她接-》你說話-》等她哦-》你告訴他什麼事-》等她哦-》你掛了)

讀資料過程

起始訊號 -》傳送器件位址-》等待應答-》 傳送讀資料位址-》等待應答-》重新起始訊號-》傳送器件位址+1(設定為讀模式)-》等待應答-》讀資料-》-》繼續讀 給應答-》不繼續給停止應答-》停止訊號

(給你女票打**-》等他接-》你說夫人有何指示-》她說你閉嘴聽我說-》你們重新來了一遍撥號(可能女票脾氣比較大加強迫症)-》等你接-》她說事-》你聽著-》她說掛-》你掛)

**實現

寫資料void  device_writedata(uint8_t deciveaddr,uint8_t dataaddr,uint8_t data)

//讀資料

//引數一 器件位址

//引數二 資料位址

//引數三 接收資料儲存

//引數四 接收長度

//void decive_readdata(uint8_t deciveaddr,uint8_t dataaddr,uint8_t *recivedata,uint8_t num)

//最後一位資料不需要給應答 因為不用讀了

*recivedata = iic_read_byte(0);

//停止訊號

iic_stop();

}iic匯流排流程基本結束,有些地方仍有不清晰之處,望提示待修繕。

對於stm32而言,io的輸入輸出模式是需要人工切換的,這就使得原本速率就比較低的iic匯流排通訊變得更慢,現在主流的做法是在sda使用前切換io模式,但是對於stm32本身而言。它的開漏模式是可以同時兼任輸入輸出的,應當可以稍微的提高速率。

模擬IIC匯流排協議

簡單講iic匯流排通訊就像你在和你物件打 講道理,步驟幾乎完全一致。回憶一下自己打 的過程。你 撥號 你物件 喂?你 巴拉巴拉 你物件 哦 你 巴拉巴拉 你物件 哦 你 掛啦,麼麼噠 你物件 哦 你 掛 通話結束 那現在來看一下iic匯流排通訊過程 對於你來說,你是打 的,屬於主動方,首先該你寫入資...

IIC匯流排協議

i2c匯流排進行資料傳送時,時鐘訊號為高電平期間,資料線上的資料必須保持穩定,只有在時鐘線上的訊號為低電平期間,資料線上的高電平或低電平狀態才允許變化。起始和終止訊號 scl線為高電平期間,sda線由高電平向低電平的變化表示起始訊號 scl線為高電平期間,sda線由低電平向高電平的變化表示終止訊號。...

IIC匯流排協議

iic匯流排狀態 讀寫時序時的匯流排狀態 iic 即inter integrated circuit 積體電路匯流排 這種匯流排型別是由飛利浦半導體公司在八十年代初設計出來的一種簡單 雙向 二線制 同步序列匯流排 兩根訊號線 sda,scl 其中sda為雙向的資料訊號線,scl為時鐘訊號線 主從裝置...