資料來源: http://blog.yam.com/ddy1280/article/494113
也許您有聽過 I2C數位感應器 or I2C介面等等, 那I2C到底是什麼呢?
簡單來說, I2C是一種傳輸協定 (protocol). 在這個協定下的設備都可以透過相通的語法來控制。
CAVE幫大家找了一篇實用的資料, 是對岸寫的。
NXC 完整支援了 I2C的語法, 換言之, 只要是透過I2C介面的設備, NXC都可以控制。
事實上, 超音波感應器就是透過I2C介面來和NXT溝通, Hitechnic, Mindsensor的感應器也是一樣。
只是NXC直接寫成一個現成的語法, ex: x = SensorHTCompass(S1); 這就是讀取 1 號 指南針感應器的值. 就這麼簡單囉~
—————————————————————————
I2C匯流排原理及應用實例
I2C(Inter-Integrated Circuit)匯流排是一種由PHILIPS公司開發的兩線式串列匯流排,用於連接微控制器及其週邊設備。I2C 匯流排產生於在80年代,最初為音訊和視頻設備開發,如今主要在伺服器管理中使用,其中包括單個元件狀態的通信。例如管理員可對各個元件進行查詢,以管理系 統的配置或掌握元件的功能狀態,如電源和系統風扇。可隨時監控記憶體、硬碟、網路、系統溫度等多個參數,增加了系統的安全性,方便了管理。
1 I2C匯流排特點
I2C匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此I2C匯流排佔用的空間非常小,減少了電路板的空間和晶片管腳的數量,降低了互聯成本。匯流排的長度可高達25英尺,並且能夠以10Kbps的最大傳輸速率支援40個組件。I2C匯流排的另一個優點是,它支持多主控(multimastering), 其中任何能夠進行發送和接收的設備都可以成為主匯流排。一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。
2 I2C匯流排工作原理
2.1 匯流排的構成及信號類型
I2C 匯流排是由資料線SDA和時鐘SCL構成的串列匯流排,可發送和接收資料。在CPU與被控IC之間、IC與IC之間進行雙向傳送,最高傳送速率 100kbps。各種被控制電路均並聯在這條匯流排上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模組都有唯一的位址,在資訊的傳輸過程 中,I2C匯流排上並接的每一模組電路既是主控器(或被控器),又是發送器(或接收器),這取決於它所要完成的功能。CPU發出的控 制信號分為位址碼和控制量兩部分,位址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。 這樣,各控制電路雖然掛在同一條匯流排上,卻彼此獨立,互不相關。
I2C匯流排在傳送資料過程中共有三種類型信號, 它們分別是:開始信號、結束信號和應答信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送資料。
結束信號:SCL為低電平時,SDA由低電平向高電平跳變,結束傳送資料。
應答信號:接收資料的IC在接收到8bit資料後,向發送資料的IC發出特定的低電平脈衝,表示已收到資料。CPU向受控單元發出一個信號後,等待受控單 元發出一個應答信號,CPU接收到應答信號後,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。
目前有很多半導體積體電路上都集成了I2C介面。帶有I2C介面的單片機有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多週邊器件如記憶體、監控晶片等也提供I2C介面。
3 匯流排基本操作
I2C規程運用主/從雙向通訊。器件發送資料到匯流排上,則定義為發送器,器件接收資料則定義為接收器。主器件和從器件都可以工作於接收和發送狀態。 匯流排必須由主器件(通常為微控制器)控制,主器件產生串列時鐘(SCL)控制匯流排的傳輸方向,並產生起始和停止條件。SDA線上的資料狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態的改變被用來表示起始和停止條件。參見圖1。
圖1 串列匯流排上的資料傳送順序
3.1 控制位元組
在起始條件之後,必須是器件的控制位元組,其中高四位元為器件類型識別符(不同的晶片類型有不同的定義,EEPROM一般應為1010),接著三位為片選,最後一位為讀寫位,當為1時為讀操作,為0時為寫操作。如圖2所示。
圖2 控制位元組配置
3.2 寫操作
寫操作分為位元組寫和頁面寫兩種操作,對於頁面寫根據晶片的一次裝載的位元組不同有所不同。關於頁面寫的位址、應答和資料傳送的時序參見圖3。
圖3 頁面寫
3.3 讀操作
讀操作有三種基本操作:當前位址讀、隨機讀和順序讀。圖4給出的是順序讀的時序圖。應當注意的是:最後一個讀操作的第9個時鐘週期不是“不關心”。為了結 束讀操作,主機必須在第9個周期間發出停止條件或者在第9個時鐘週期內保持SDA為高電平、然後發出停止條件。
圖4 順序讀
4 實例:X24C04與MCS-51單片機軟硬體的實現
X24C04是XICOR公司的CMOS 4096位元串列EEPROM,內部組織成512×8位元。16位元組頁面寫。與MCS-51單片機介面如圖5所示。由於SDA是漏極開路輸出,且可以與任何數目的漏極開路或集電極 開路輸出“線或”(wire-Ored)連接。上拉電阻的選擇可參考X24C04的資料手冊。下面是通過I2C介面對X24C04進行單字節寫操作的常式。流程圖及來源程式如下:
圖5 X24C04與51單片機介面
;名稱:BSENT
;描述:寫位元組
;功能:寫一個位元組
;調用程式:無
;輸入參數:A
;輸出參數:無
BSEND: MOV R2,#08H ;1位元組8位元
SENDA: CLR P3.2 ;
RLC A ;左移一位
MOV P3.3,C ;寫一位
SETB P3.2
DJNZ R2,SENDA ;寫完8個位元組?
CLR P3.2 ;應答信號
SETB P3.3
SETB P3.2
RET
圖6 流程圖
5
結束語
在I2C匯流排的應用中應注意的事項總結為以下幾點 :
1) 嚴格按照時序圖的要求進行操作,
2) 若與口線上帶內部上拉電阻的單片機介面連接,可以不外加上拉電阻。
3) 程式中為配合相應的傳輸速率,在對口線操作的指令後可用NOP指令加一定的延時。
4) 為了減少意外的干擾信號將EEPROM內的資料改寫可用外部防寫引腳(如果有),或者在EEPROM內部沒有用的空間寫入標誌字,每次上電時或復位時做一次檢測,判斷EEPROM是否被意外改寫。
感謝分享
收益良多阿
[版主回覆06/05/2009 23:56:07]傑克兄: 您客氣了, 歡迎多來看看, 也多留言給我們加油打氣. CAVE