基礎概念?
IC(Inter-Integrated Circuit)又稱I2C,是是IICBus簡稱,所以中文應該叫集成電路總線。
????????IIC的總線的使用場景,所有掛載在IIC總線上的設備都有兩根信號線,一根是數據線SDA,另一 根是時鐘線SCL。這兩個信號線都是雙向的。 ?作為一種通信方式,IIC總線在某一時刻,總線只允許有一個設備處于發送狀態,所發生的數據被總線上所 有的設備所接收。IIC通信協議包含有設備地址,只有發送方攜帶的地址與某個接收方的地址相同時,接收 方才真正執行相關的指令。
????????IIC總線規定,設備在空閑時,兩根總線都處于高電平狀態。為保證這種狀態,數據線SDA和時鐘線SCL都要 外接上拉電阻?。
I2C通信的流程?
- ?IIC總線上連接的若干設備中,每次通信前,發送方首先發送一個“起始”信號,其實信號就是在SCL為高電平時, SDA發送一個低電平。當其它設備接收到這個其實信號后,將進行一次“總線仲裁”。意思就是設備(除發送其實信 號的那個設備以外的)都將處于聆聽狀態。
? 2.IC總線進行數據傳送時,時鐘線(SCL)上的信號為高電平期間,數據線(SDA)上的數據必須保持穩定。只有在時鐘線 (SCL)上的信號為低電平期間,數據線(SCL)上的高電平或低電平狀態才允許變化。同時,SCL信號由數據啟動發送 的設備提供。輸出到數據線(SDA)上的每個字節必須是8位。數據傳送時,先傳送最高位(MSB),后傳送最低位(LSB)。
?3.發送器每發送一個字節(8個bit),就在時鐘脈沖 9 期間釋放數據線,由接收器反饋一個應答信號。 主機 SCL拉高,讀取從機SDA的電平。對于反饋有效應答位ACK的要求是:接收器在第9個時鐘脈沖之前的低電平 期間將數據線SDA拉低,并且確保在該時鐘的高電平期間為穩定的低電平。
?數據線(SDA)為低電平時,規定為有效應答位(ACK,簡稱應答位),表示接收器已經成功地接收了該字節。
?數據線(SDA)為高電平時,規定為非應答位(NACK),表示接收器沒有成功接收該字節。?
當發送方發送完最后一個bit后,需要發送一個結束標志來終止整個通信過程。當時鐘線SCL 為高電平時,數 據線SDA 由低電平向高電平跳變。
完整的IIC通信時序圖。?
IIC控制寄存器?
IICCON:IIC控制寄存器中的每個域都需要設置
Bit7:處于發送數據時,如果設置為允許,那么當接收設備回應ACK后,會產生IIC中斷。當處于接收數據時, 允許這一位會發送ACK,否則發送NACK。
Bit6:IIC產生波特率的第一次分頻
Bit5:由于我們要使用中斷方式,所以這一位允許
Bit4:這一位看起來似乎是一個查詢用的掛起標志,但是這一位是允許寫0的。而且無論我們要發送什么數 據,都必須清除這一位才能真正將數據發送出去。
Bit0~3:IIC產生波特率的第二次分頻?
代碼示例?
IIC初始化函數
?第16~17行:配置GPE14和GPE15為IIC方式
?第19行:允許ACK,中斷使能,IIC時鐘分頻為512=50M/512=97656.25
?第20行:發送時鐘分頻因子 0+1=10 因此,波特率為97656.25約等于97.6K
?第22~23行:允許IIC中斷,注冊中斷服務函數
????????IIC中斷服務函數,由于IIC控制器會在收到和發送完ACK之后產生中斷,我們將來在數據發送后等待這個標 記即可。?
????????由于無論發送還是接收數據,手冊里要求我們必須清除IICCON的第四位之后才能繼續,也就是說我們把數據放入IICDS之后,數據并沒有發送出去,而是需要我們把這一位清零后數據才開始發送。從發送第一個比特到接收到ACK之間肯定需要時間,當收到ACK之后就會產生中斷。需要注意的 是at24c02在收到數據之后需要一點時間把數據寫入到EEPROM中,所以可以在循環中等待一段時間。這個 時間大約為100us。?
寫操作
讀操作?
結合以下流程圖更容易理解
?主機發送器操作
主機接收器操作?
以下是邏輯分析儀采取的波形圖,直觀地查看數據?