1、概述:
在使用單片機或芯片級通信時,I2C是一種必不可少的通信協議。 I2C只有兩線接口:一條數據線 (SDA) ,另一條時鐘線 (SCL),通信方式比較簡單可靠。但由于SDA、SCL為漏極開路結構(OD),因此硬件設計時必須接有上拉電阻,阻值的大小常為 1k8,2K2,4k7和 10k;當I2C線空閑時,兩根線均為高電平。
本文中以自己項目中所用到的具有I2C通信協議的EEPROM芯片24LC64為例,EEPROM芯片硬件電路如圖1所示,數據線和時鐘線處于空閑狀態時,采用LOTO的OSC802示波器測量空閑時的波形如圖2所示。
圖1 I2C芯片電路
圖2 示波器測量I2C空閑時狀態
2、I2C協議
快速搭建單片機和芯片之間通信,首先要熟悉I2C通信協議,I2C協議主要是怎樣判斷數據的起始、停止、ACK;下面將一一介紹:
起始信號:當SCL為高電平期間,SDA由高到低的跳變;啟動信號是一種電平跳變時序信號,而不是一個電平信號。
停止信號:當SCL為高電平期間,SDA由低到高的跳變;停止信號也是一種電平跳變時序信號,而不是一個電平信號。
I2C起始和停止信號示意如圖3所示;
圖3 I2C起止信號
ACK:單片機每發送一個字節,就在時鐘脈沖第9個周期期間釋放數據線,由EEPROM芯片發送一個應答信號。 應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示EEPROM已經成功地接收了該字節。
對于反饋有效應答位ACK的要求是,EEPROM在第9個時鐘脈沖之前的低電平期間將SDA線拉低或一直保持低電平;并且確保在該時鐘的高電平期間為穩定的低電平。(通過示波器捕捉功能,采集到的波形如圖4所示)
圖4 示波器測量I2C總線起始信號
同樣應答信號在第9個時鐘脈沖為高電平時,規定為非應答位(NACK),表示EEPROM接收該字節沒有成功。對于反饋非應答位為NACK時,單片機將會繼續發送相同的字節。(測量波形如圖5所示) 圖5 非應答時信號狀態3、數據的有效性
I2C總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。
雖然只要求在高電平期間保持穩定,但是數據在SCL的上升沿到來之前就需準備好,數據是在SCL的上升沿打入到(EEPROM)中的。
4、數據傳輸
在I2C總線上傳送的每一位數據都有一個時鐘脈沖相對應(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位數據。數據位的傳輸是邊沿觸發。但一般數據是以時鐘脈沖高電平時SDA狀態確定的。
單片機收到來自EEPROM發出的應答后就可以發送數據。傳送數據時,單片機就逐個發送數據字節,但每發送一個字節后都要等待應答。
等待應答時,時鐘脈沖將有一定時間處于低電平的延時,為傳輸下一個字節的數據做準備。采用LOTO示波器捕捉的信號波形如圖8所示
圖7 單片機傳輸連續數據時序
圖8 示波器捕捉數據發送時序
◆ 發送停止位.
· EEPROM收到停止信號后,進入到一個內部的寫入周期,需要一定時間(芯片不同時間不同),SCL和SDA被釋放。此時任何操作都不會被EEPROM響應;(因此以這種方式的兩次寫入之間要插入一個延時,否則會導致失敗)捕捉信號如同9所示
|