國科安芯推出的AS32X601內置的I2C模塊提供了符合工業標準的兩線串行制接口,可用于MCU和外部IIC設備的通訊。IIC總線使用兩條串行線:串行數據線SDA和串行時鐘線SCL。 IIC接口模塊實現了IIC協議的標準模式和快速模式,支持多主機IIC總線架構。其中標準模式為100K,快速模式400K。
- 硬件設計
I2C 總線內部使用漏極開路輸出驅動器,因此 SDA和 SCL 可以被拉低為低電平,但是不能被驅動為高電平,所以每條線上都要使用一個4.7K上拉電阻,默認情況下將其保持在高電平。
- I2C時序
①Start開始信號、Stop停止信號:
這兩個信號由主機產生,不屬于數據域交互:
在SCL的高電平時,主機將SDA的電平由 高–>低是Start信號(下降沿);
在SCL的高電平時,主機將SDA的電平由 低–>高是Stop信號(上升沿);
②7位尋址
AS32X601的I2C只支持7位尋址模式,配置過程中從機地址需要左移1位才為實際地址。
③數據方向
0寫/1讀
④應答ACK、非應答NACK
在SCL的一個時鐘周期內,從機在SCL的高電平時,將SDA的電平由高拉低(或者繼續保持低電平狀態) 則是ACK信號;
從機在SCL的高電平時,如果SDA的電平一直是 高電平 則是NACK信號;
- 時鐘
I2C0、I2C1時鐘來自APB0,I2C2、I2C3時鐘來自ABP1。具體配置可見I2C_CTLR寄存器。
- 軟件編程
- 配置I2Cx需要的GPIO為復用功能。
- 通過配置I2C_INITSTRUCT初始化I2Cx,包括時鐘分頻,從機地址,ACK,高低電平時間等。
- 按需求配置中斷,并配置IRQ_HANDLER;
- 調用收發接口,并處理數據
- I2C掛死原因解析
由于I2C采用線與結構,只要總線上任何一個器件拉低了SDA或者SCL,其他器件都無法拉高它們,看到的都是低電平。如果有器件不釋放總線,則整個總線上的通訊都會被暫停 。
在實際操作中,I2C主是可編程器件,如果主機主動拉低了總線,可以通過調試代碼了解原因,也可以通過復位I2C外設或者復位芯片來退出。而I2C從機往往不帶RESET引腳,如果掛死了總線即使整個系統復位都無法解除,僅重新上下電才可以恢復,因此分析I2C從機掛死。
首先I2C從機在兩種情況下會拉低SDA線。
①主機向從機寫數據或地址時,從機如果發出ACK應答,則會第9個CLK的期間拉低SDA;
②主機讀數據的時候,從機會在bit為0時對應的CLK期間拉低SDA。
根據I2C協議,SCL為高的時候,SDA電平應保持,而等到SCL為低后(也就是下降沿后)才能發生改變。若SCL拉高后主機不再拉低,從機會持續拉低SDA,直到見到SDA的下降沿。
最常見的情況是主機在通訊的過程中產生了復位。由于復位動作通常會立刻執行,外設狀態機都恢復到默認狀態,也就發不出完整的CLK。那么等到主機復位完成回來后,SCL為高,SDA被從機拉低。主機無法發起START起始條件,不能開始下一次與從機的通訊,這稱為SDA掛死。
我們一般情況下用GPIO在SCL線上模擬一個下降沿,讓從機狀態機繼續走下去。只發一個下降沿并不一定能將SDA釋放,因為并不清楚當主機復位異常發生時刻從機到底處于哪一個狀態,所以需要逐個CLOCK去抓波形,直到見到SDA被釋放了,我們才終止并且發送STOP條件告訴從機這次通訊結束。
審核編輯 黃宇
-
芯片
+關注
關注
459文章
52306瀏覽量
437733 -
mcu
+關注
關注
146文章
17893瀏覽量
361805 -
I2C
+關注
關注
28文章
1538瀏覽量
127238
發布評論請先 登錄
是德DSOX4034A示波器I2C總線信號分析

I2C總線協議詳細解析
I2C總線應用實例分析
AN-806: ADuC70xxBCPZxxI系列芯片I2C下載協議

TMS320C6000 DSP內部集成電路(I2C)模塊參考指南

使用MSP430 MCU通過I2C實現低功耗Windows 8 HID應用

使用MSP430 MCU簡化溫度、濕度和光學I2C傳感器

使用低內存MSP430?MCU的UART到I2C橋應用說明

評論