小白筆記 IIC詳解

2021-10-25 20:17:36 字數 2294 閱讀 5800

iic為inter-integrated circuit,其實應該為iicbus的簡稱,所以中文名為積體電路匯流排,是一種序列通訊匯流排,使用的是多主從架構,一般用於低速通訊,是由飛利浦公司在2023年提出,i2c序列匯流排一般有兩根訊號線,一根是雙向的資料線sda,另一根是時鐘線scl。所有接到i2c匯流排裝置上的序列資料sda都接到匯流排的sda上,各裝置的時鐘線scl接到匯流排的scl上。iic可以在 cpu 與被控 ic 之間、ic 與 ic 之間進行雙向傳送,高速 iic 匯流排一般可達 400kbps 以上.

scl:serial clock 序列時鐘

sda:serial data 序列資料

一般情況下iic的scl和sda都會加乙個上拉電阻,電阻的值由許多因素決定的,這裡之後有空我再研究更新。那為什麼要加這麼乙個上拉電阻呢?

因為iic內部使用漏級開路進行輸出,漏級開路便如下圖所示,ic內部只能輸出低電壓,因此必須要乙個上拉電阻將電壓拉高,使輸出有高電壓。

眾所周知stm32的iic介面是有一些問題的,所以我們使用gpio模擬iic進行通訊,這次模擬通訊的從裝置是at24c02,乙個eeprom儲存器,有一點需要注意的是,主裝置與從裝置的時鐘都是以主裝置的時鐘線為準的,但不能超過從裝置的最大傳輸速率,從裝置的最大傳輸速率一般都會在晶元手冊上進行標註,同樣以at24c02為例,如圖:

晶元手冊上明確說明scl最大傳輸速率為400khz,換算成時間的話即表示乙個時鐘週期最小為2.5μs,並且晶元手冊規定了低電平時間和高電平時間最短分別為1.2與0.6μs。

首先就是iic的初始化:

void iic_init(void)

當需要模擬的時鐘線初始化後,就需要寫iic的開始,結束,應答,等待應答,非應答、傳送、接收等訊號了,這裡是用gpio模擬iic匯流排協議的,但從器件是用硬體控制訊號的,所以寫時序的時候要根據從器件所給出的iic時序進行編寫,這樣的話編寫**也就比較簡單了。at24c02的iic時序如下圖:

開始訊號:當時鐘線(scl)為高時,資料線(sda)由高到低進行跳變

void iic_start(void)

#define sda_out()

這裡就以sda_out為例,因為sda線使用的是pin7,所以將第八個位元組進行乙個與操作,全部清零,然後進行乙個或操作,寫入3,由下表可知,3表示的就是通用推挽輸出模式,最大速度50mhz。

停止訊號:當時鐘線(scl)為高時,資料線(sda)由低到高進行跳變

void iic_stop(void)

傳送資料:資料是在時鐘線(scl)為高時進行讀取的,先將資料線設定為輸出模式,再將時鐘線拉低進行傳送資料,傳送資料為一位一位進行傳送的,當要傳送的位為1時資料線變為高電平。然後時鐘線變高,使從裝置進行讀取,再次變低進入下乙個迴圈。

void iic_send_byte(u8 txd)

}

u8 iic_read_byte(unsigned char ack)

if (!ack)

iic_nack();

else

iic_ack();

return receive;

}

應答:接收資料的ic在接收完八位資料後會傳送乙個特定低電平脈衝的訊號,告訴傳送方我已經接收完了

應答包括等待應答與應答,首先來看等待應答:等待應答就是先把資料線設定為輸入,然後將資料線與時鐘線都拉高,等待其他裝置將匯流排的電平拉低,當超過250us時,判定為無應答。

u8 iic_wait_ack(void)

} iic_scl=0;

return 0;

}

產生應答訊號:時鐘線拉低,將資料線設定為輸出,等待後將時鐘線拉高,表示讀取資料線狀態,之後再將時鐘線拉低。

void iic_ack(void)

不產生應答訊號:與應答訊號類似,但資料線不會拉低。

void iic_nack(void)

小白的一點個人想法,若有不對還請指出。

js小白筆記

通過 jquery,您可以使用 hide 和 show 方法來隱藏和顯示 html 元素 通過 jquery,您可以使用 toggle 方法來切換 hide 和 show 方法。顯示被隱藏的元素,並隱藏已顯示的元素 通過 jquery,您可以實現元素的淡入淡出效果。jquery 擁有下面四種 fad...

Java小白筆記

1.常量,一般字母大寫,不能再賦值,final修飾符 final int value 10 2.與,短路與,或,短路或 短路主要乙個條件成立不必執行第二個,效率更高 3.三元運算子 k i 0?i i 如果i大於等於0,把i賦值給k,否則把負i賦值給k 4.final變數經常和static關鍵字一起...

dubbo 小白筆記

1.分布式就是指,很多伺服器一起做不一樣的是 每台伺服器做的事都不一樣 這些不一樣的事呢,組合起來就是一件大事,而集群呢就是很多伺服器做一樣的事.1.在這裡插入描述 provider 暴露服務的服務提供方 container 服務執行容器 consumer 呼叫遠端服務的服務消費方 registry...