引 言
在嵌入式系統(tǒng)設計中存在著大量的 IC 間通信,目前使用較多的為 I2C 通信。當前大部分單片機均可采用硬件方式的 I2C 模式進行通信,但也有少部分單片機為降低成本,并未設計硬件方式的 I2C 通信,因此只能采用軟件方式來實現芯片間通信。目前已有大量文獻討論了 I2C 通信時主控方的軟件編寫,但作為通信的另一方,從控方的程序編寫很少有相關資料涉及,特別是從控方的程序相較于主控方的程序更為復雜。因此從主機通信要求出發(fā),總結了一套從機的通信軟件編寫流程[1-3]。
通過主機發(fā)出的信號請求,要求從控機采取相應應答信號。為了實現從機的實時性,要求從機的 SCL 線輸入采用外部中斷方式進行,可將中斷方式設置為上升沿觸發(fā)方式。
1 起始信號
圖 1 所示為主控機發(fā)送I2C 起始信號的波形圖。I2C 總線通過上拉電阻連接電源的正極,當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平都將使總線的信號變低,即各器件的 SDA及 SCL均為線“與”關系。進行 I2C通信時,首先要確認總線是否空閑。圖 1中,主機先將數據線拉高,再將時鐘線拉高,但需注意在拉高時鐘線時從機的響應,其中時間 t1為從機響應時間。從機應立即釋放時鐘線,轉為輸入狀態(tài)。主機只有檢測到從機釋放時鐘線控制權時才能進行下一步操作。主機在拉高時鐘線后,檢測時鐘線的狀態(tài),只有從機為輸入,時鐘線變高后,主機才可以發(fā)出起始命令 [4]。
圖 1 主機發(fā)送起始信號波形
時鐘信號線為高電平時,主機將數據線拉低以發(fā)送起始命令,此時從機檢測到數據信號線產生由高到低的信號變化后,從機立即檢測時鐘信號線是否產生由高到低的變化, 如若產生,則說明通信起始信號已發(fā)出,主機準備與從機通信 [5]。從機控制流程如圖 2 所示。
圖 2 從機接收起始信號時的程序流程
2 停止信號
停止信號的產生比起始信號簡單,從機對停止信號的要求也比起始信號簡單。
圖 3所示為主機停止信號波形圖,對應從機在主機時鐘信號進入中斷服務程序后,通過檢測主機在數據線上發(fā)出的由低到高的電平變化來確認通信結束。
圖 3 停止信號波形
3 應答信號
主機發(fā)送 1 B 數據后,在第九個時鐘(CLOCK)脈沖時必須釋放數據線,由從機產生一個應答信號。從機回復低電平為有效應答(ACK),表示從機已成功接收到該字節(jié) ;從機回復高電平為非應答信號(NACK),表示從機未成功接收該字節(jié)。如果是有效的應答信號位,要求從機在第九個時鐘脈沖之前的低電平時間將數據線拉低,并確保在第九個時鐘的高電平期間為穩(wěn)定的低電平。如果主機從從機讀取信息, 則在讀完 1 B 數據后,主機向從機發(fā)送一個應答信號 ACK, 讀完最后一個數據后,主機向從機發(fā)送一個 NACK 信號,通知從機結束數據發(fā)送,并在最后發(fā)送一個停止信號給從機。應答信號波形如圖 4 所示。在每 8 位數據傳送完成后,第九個時鐘脈沖傳送一個應答信號。向從機中寫信息即由從機發(fā)出應答信號 ;從從機中讀信息,即由主機發(fā)出應答信號。應答信號為低即為成功,為高則為失敗。
圖 4 應答信號波形
從機必須配合主機工作,從機在第九個時鐘脈沖上升沿產生中斷時,將根據自己的接收情況產生應答信號。從機工作程序流程如圖 5 所示。
4 數據傳送
4.1 字節(jié)傳送與應答格式
數據傳送時先高位后低位,9 位為一幀。如果從機未應答主機信號,如從機正在進行其他工作而無法接收總線上的數據,則此時從機在應答時必須將數據線置于高電平,產生一個非應答信號,主機產生一個終止信號以結束總線的數據傳送。每傳送完一個 8 位數據,主機都要與從機通過應答與非應答信號進行溝通以確定是否繼續(xù)進行數據傳送。在主機從從機中讀取數據時,主機收到最后一個數據字節(jié)后,必須向從機發(fā)出一個非應答信號(此時的應答信號由主機發(fā)出)作為線束標志。從機釋放 SDA 線,允許主機產生終止信號。
4.2 數據幀格式
從機地址為 7 位,分別占據一個字節(jié)的 D7 ~ D1 位。D0 位為讀寫標志位,D0=0 為寫入從機操作 ;D0=1,為從從機讀取數據操作。從機地址格式與讀寫格式如圖 6 所示。
(1)主機向從機寫數據,以 8 位數據加一位應答為一幀, 從機負責應答。主機先寫入從機地址,再寫入從機存儲器地址,后面為要寫入的數據,以一個字節(jié)加一個應答位(非應答位)為一幀寫入。如果只寫一個字節(jié),寫完后主機可發(fā)停止信號,如果繼續(xù)寫入數據,則主機繼續(xù)寫入數據即可,不必再次輸入存儲器地址,從機會在上一地址上自動加 1 進行數據存儲。此時要特別注意的是 :從機一定要有應答信號(ACK),否則主機將終止數據的繼續(xù)傳送。從機無論是產生非應答信號還是在規(guī)定時間內未產生應答信號,主機都視為無應答,將終止數據傳送。寫數據格式如圖 7 所示。
從機接收數據時程序較簡單,只要在 CLOCK 時鐘線上升沿產生的中斷中依次接收數據,并在接收完 8 位數據后產生應答信號即可。然后對數據進行判斷,如果為從機地址數據,則判斷此數據是否與己方地址相同,相同則繼續(xù)接收,不同則放棄接收。然后接收存儲器地址,并接收數據,在接收數據時將所接收的數據依次存儲。從機程序流程如圖8所示。
圖 8 從機讀寫數據程序流程
(2)主機從從機讀數據
讀取數據與寫入數據時的格式存在一定區(qū)別,從機地址信息需寫 2 次,且需發(fā) 2 次起始信息。數據框圖如圖 9所示。
由于接收數據時從機程序比較簡單,在此不再討論。
5 結 語
I2C 通信是單片機與單片機之間,或單片機與存儲器之間的通信,對于經濟型單片機而言,能有效節(jié)省單片機的I/O 口,因此 I2C 通信也在通信領域得到廣泛應用。本文是長期編程過程中的經驗總結,希望能給讀者提供一定參考。
