為什么I2C總線(xiàn)會(huì )難住這么多人?
I2C總線(xiàn)在嵌入式系統中很常見(jiàn),但最近在一個(gè)群(可能是初學(xué)者群)交流的信息,讓我比較吃驚,很多人連I2C總線(xiàn)基本的知識都不清楚。今天就來(lái)給大家講講I2C總線(xiàn)的時(shí)序。
本文引用地址:http://dyxdggzs.com/article/202505/470076.htm很多電子工程師都應該從 EEPROM 通信了解到的I2C總線(xiàn),其實(shí),I2C總線(xiàn)遠不止于 EEPROM 存儲器,它也有類(lèi)似485、SPI等應用場(chǎng)景。
EEPROM存儲器系統架構圖
位傳輸
I2C總線(xiàn)是由飛利浦(Philips)公司開(kāi)發(fā)的一種雙向二線(xiàn)制同步串行總線(xiàn),實(shí)現有效的IC間的控制,它只需要兩根線(xiàn)(SDA和SCL)即可在連接于總線(xiàn)上的器件之間傳送信息。
I2C總線(xiàn)在傳輸數據都是按照bit來(lái)傳送。SCL為時(shí)鐘線(xiàn),SDA為數據線(xiàn);在SCL時(shí)鐘線(xiàn)為高電平時(shí),SDA數據線(xiàn)上的電平不允許被修改,SCL時(shí)鐘線(xiàn)為低電平時(shí),SDA數據線(xiàn)上的電平可為高/低。
I2C總線(xiàn)的位傳輸
起始條件:SCL為高電平時(shí),SDA由高電平向低電平切換;表示開(kāi)始傳送數據。
停止條件:SCL為高電平時(shí),SDA由低電平向高電平跳變;表示結束傳送數據。
空閑條件:I2C總線(xiàn)的SDA和SCL兩條信號線(xiàn)同時(shí)處于高電平時(shí);表示空閑狀態(tài)。
起始和停止條件
數據傳輸
字節傳輸
發(fā)送數據時(shí),由主機先發(fā)送一個(gè)起始信號,再將SDA信號切換為輸出模式,然后將8位數據依次由高到低發(fā)送出去;
發(fā)送完成后,主機將SDA信號切換為輸入模式,等待叢機回應ACK或NAK;再發(fā)下一筆數據
I2C總線(xiàn)數據傳輸
叢機地址
在I2C總線(xiàn)系統中,每個(gè)設備都有它的固定地址,一般由芯片的A0,A1和A2決定。叢機地址字節由七位地址位(D7-D1位)和一位方向位(為D0位)組成。
器件地址的D7-D4一般都是被廠(chǎng)家固定了為1111,余下的D3,D2和D1連接到芯片的A2,A1和A0決定;D0為0x00表示寫(xiě),D0為0x01表示讀。大家看例程都是些0xA0和0xA1就是這個(gè)原因。
EEPROM的器件地址
讀寫(xiě)過(guò)程
1.寫(xiě)數據過(guò)程
1.主機發(fā)送I2C總線(xiàn)停止信號,防止總線(xiàn)忙寫(xiě)數據失敗
2.主機發(fā)送I2C總線(xiàn)復位信號,確保寫(xiě)數據之前總線(xiàn)處于空閑狀態(tài)
3.主機發(fā)送I2C總線(xiàn)開(kāi)始信號,啟動(dòng)一次數據的寫(xiě)入
4.主機發(fā)送I2C叢機地址和寫(xiě)模式(W/R=0)信號,并且等待一個(gè)叢機的應答信號
5.主機接收到ACK的應答信號后,開(kāi)始多個(gè)字節的寫(xiě)入,每寫(xiě)完一個(gè)字節需要等待一個(gè)叢機的應答信號
6.主機接收到ACK的應答信號后,發(fā)送2IC總線(xiàn)停止信號,確??偩€(xiàn)處于空閑狀態(tài)
2.讀數據過(guò)程
1.主機發(fā)送I2C總線(xiàn)停止信號,防止總線(xiàn)忙寫(xiě)數據失敗
2.主機發(fā)送I2C總線(xiàn)復位信號,確保讀數據之前總線(xiàn)處于空閑狀態(tài)
3.主機發(fā)送I2C總線(xiàn)開(kāi)始信號,啟動(dòng)一次數據讀取
4.主機發(fā)送I2C叢機地址和讀模式(W/R=1)信號,并且等待一個(gè)叢機的應答信號
5.主機接收到ACK的應答信號后,開(kāi)始多個(gè)字節的讀取,每讀完一個(gè)字節需要給叢機發(fā)送一個(gè)ACK應答信號
6.主機接收到ACK的應答信號后,發(fā)送I2C總線(xiàn)停止信號,確??偩€(xiàn)處于空閑狀態(tài)
主機讀/寫(xiě)數據過(guò)程
結語(yǔ)
I2C總線(xiàn)在嵌入式應用中非常廣泛,基本上所有的電力電子設備都會(huì )用到這個(gè)總線(xiàn);
筆者根據自身多年的工作經(jīng)驗,記錄下了我對它的理解,如果有寫(xiě)的不對,希望大家能多多指出,今天的I2C總線(xiàn)就先寫(xiě)到這里,希望對大家有幫助。
評論