國科安芯推出的AS32X601內置的I2C模塊提供了符合工業(yè)標準的兩線串行制接口,可用于MCU和外部IIC設備的通訊。IIC總線使用兩條串行線:串行數(shù)據(jù)線SDA和串行時鐘線SCL。 IIC接口模塊實現(xiàn)了IIC協(xié)議的標準模式和快速模式,支持多主機IIC總線架構。其中標準模式為100K,快速模式400K。
- 硬件設計
I2C 總線內部使用漏極開路輸出驅動器,因此 SDA和 SCL 可以被拉低為低電平,但是不能被驅動為高電平,所以每條線上都要使用一個4.7K上拉電阻,默認情況下將其保持在高電平。

- I2C時序
①Start開始信號、Stop停止信號:
這兩個信號由主機產(chǎn)生,不屬于數(shù)據(jù)域交互:
在SCL的高電平時,主機將SDA的電平由 高–>低是Start信號(下降沿);
在SCL的高電平時,主機將SDA的電平由 低–>高是Stop信號(上升沿);
②7位尋址
AS32X601的I2C只支持7位尋址模式,配置過程中從機地址需要左移1位才為實際地址。
③數(shù)據(jù)方向
0寫/1讀
④應答ACK、非應答NACK
在SCL的一個時鐘周期內,從機在SCL的高電平時,將SDA的電平由高拉低(或者繼續(xù)保持低電平狀態(tài)) 則是ACK信號;
從機在SCL的高電平時,如果SDA的電平一直是 高電平 則是NACK信號;

- 時鐘
I2C0、I2C1時鐘來自APB0,I2C2、I2C3時鐘來自ABP1。具體配置可見I2C_CTLR寄存器。

- 軟件編程
- 配置I2Cx需要的GPIO為復用功能。
- 通過配置I2C_INITSTRUCT初始化I2Cx,包括時鐘分頻,從機地址,ACK,高低電平時間等。

- 按需求配置中斷,并配置IRQ_HANDLER;
- 調用收發(fā)接口,并處理數(shù)據(jù)
- I2C掛死原因解析
由于I2C采用線與結構,只要總線上任何一個器件拉低了SDA或者SCL,其他器件都無法拉高它們,看到的都是低電平。如果有器件不釋放總線,則整個總線上的通訊都會被暫停 。
在實際操作中,I2C主是可編程器件,如果主機主動拉低了總線,可以通過調試代碼了解原因,也可以通過復位I2C外設或者復位芯片來退出。而I2C從機往往不帶RESET引腳,如果掛死了總線即使整個系統(tǒng)復位都無法解除,僅重新上下電才可以恢復,因此分析I2C從機掛死。
首先I2C從機在兩種情況下會拉低SDA線。
①主機向從機寫數(shù)據(jù)或地址時,從機如果發(fā)出ACK應答,則會第9個CLK的期間拉低SDA;
②主機讀數(shù)據(jù)的時候,從機會在bit為0時對應的CLK期間拉低SDA。
根據(jù)I2C協(xié)議,SCL為高的時候,SDA電平應保持,而等到SCL為低后(也就是下降沿后)才能發(fā)生改變。若SCL拉高后主機不再拉低,從機會持續(xù)拉低SDA,直到見到SDA的下降沿。
最常見的情況是主機在通訊的過程中產(chǎn)生了復位。由于復位動作通常會立刻執(zhí)行,外設狀態(tài)機都恢復到默認狀態(tài),也就發(fā)不出完整的CLK。那么等到主機復位完成回來后,SCL為高,SDA被從機拉低。主機無法發(fā)起START起始條件,不能開始下一次與從機的通訊,這稱為SDA掛死。
我們一般情況下用GPIO在SCL線上模擬一個下降沿,讓從機狀態(tài)機繼續(xù)走下去。只發(fā)一個下降沿并不一定能將SDA釋放,因為并不清楚當主機復位異常發(fā)生時刻從機到底處于哪一個狀態(tài),所以需要逐個CLOCK去抓波形,直到見到SDA被釋放了,我們才終止并且發(fā)送STOP條件告訴從機這次通訊結束。
審核編輯 黃宇
-
芯片
+關注
關注
462文章
53499瀏覽量
458572 -
mcu
+關注
關注
147文章
18588瀏覽量
385950 -
I2C
+關注
關注
28文章
1547瀏覽量
130422
發(fā)布評論請先 登錄
如何在CW32 MCU上優(yōu)化I2C通信
AS32系列MCU芯片中CRC計算模塊的應用介紹
FreeRTOS 在 AS32系列RISC-V 架構MCU電機驅動中的應用實踐與優(yōu)化
深入剖析I2C協(xié)議
AS32系列MCU調試教程 SPI調試的常見問題解析
是德DSOX4034A示波器I2C總線信號分析
I2C總線與Arduino的接口示例
I2C總線協(xié)議詳細解析
I2C總線與單片機的連接
I2C總線應用實例分析
AN-806: ADuC70xxBCPZxxI系列芯片I2C下載協(xié)議
TMS320C6000 DSP內部集成電路(I2C)模塊參考指南

AS32系列MCU芯片I2C模塊性能解析與調試
評論