【ARM】Exynos 4412 IIC(I2C)匯流排詳解
概述
Exynos 4412支援四路多主機I2C序列匯流排,為了使連線總線上主機和外設之間實現資料傳輸,使用了一條SDA(Serial Data Line)線和一條SCL(Serial Clock Line)線,這兩條都支援雙向傳輸。
當I2C匯流排處於多主機模式時,多個Exynos 4412處理器都可以與從裝置收發資料。I2C總線上的主裝置負責啟動和結束一次資料傳輸。Exynos 4412的I2C匯流排使用標準的匯流排仲裁規程來實現多主機、多從機的資料傳輸。
要實現對I2C匯流排的控制,你需要修改下面這些暫存器的值:
- 控制暫存器 —— I2CCON
- 控制/狀態暫存器 —— I2CSTAT
- 傳送/接收移位暫存器 —— I2CDS
- 地址暫存器 —— I2CADDR
當I2C匯流排處於空閒狀態時,SCL和SDA都是高電平。當SCL為高電平時,SDA從高電平變為低電平表示一個開始訊號;當SCL為高電平時,SDA從低電平變為高電平表示一個結束訊號。
開始訊號和結束訊號由主裝置負責生成。當發出起始訊號後,I2CDS的前七位將作為從裝置的地址被髮送到SDA線上。這個地址決定了主裝置選擇了總線上的哪一個從裝置。I2CDS的第八位標識主裝置是要讀取資料還是寫入資料。
每一次資料傳輸放到SDA總線上的資料必須是一個位元組,即8位。至於傳送多少個位元組則沒有限制。資料傳送時,總是從資料的最高位MSB(Most Significant Bit)開始傳送。在每一個位元組的最後,也就是第九個時鐘週期,將緊跟一個ACK位,由接收方發出,表示資料已收到。
特徵
- 9通道、多主機、多從機的匯流排介面。(8個通用的通道,一個專用於HDMI的通道)
- 7位地址
- 序列、面向位元組的雙向資料傳輸
- 標準模式最高支援100kbit/s的速率
- 快速模式最高支援400kbit/s的速率
- 支援主傳送、主接收、從傳送、從接收四種模式
- 支援基於中斷或者輪詢的事件
I2C匯流排框圖
I2C匯流排介面操作
Exynos 4412支援的四中操作模式如下:
- 主傳送模式
- 主接收模式
- 從傳送模式
- 從接收模式
開始/停止訊號
當I2C匯流排介面處於空閒狀態時,它通常處於從裝置模式,或者說在檢測到開始訊號之前,介面處於從裝置模式。當控制器將介面修改為主裝置模式,就可以在SDA線上傳輸資料,以及在SCL線上生成時鐘訊號。
一個開始訊號將會通過SDA線傳輸1byte的資料,一個停止訊號將結束資料傳輸。
當一個主裝置傳送了一個開始訊號,它同時需要傳送一個從裝置的地址來通知這個從裝置。1byte的資料包含7位地址和1位讀寫標誌位,0表示寫,1表示讀。
主裝置通過傳送停止訊號來結束資料傳輸。如果主裝置想繼續傳輸資料,它需要重新發送一個開始訊號和從裝置地址。
下圖展示開始訊號和停止訊號的電平變化:
資料傳輸格式
每一個放到SDA線上的位元組資料必須是8位長度,每次傳輸的位元組數量不限。緊跟在開始訊號後面的第一個位元組資料需要包含從裝置的地址資料。一個ACK應答位緊跟在每個位元組的後面,由接收方發出。I2C控制器先發送位元組的高位資料,再發送低位資料。
下圖展示了I2C匯流排介面的資料格式:
下圖描述的是I2C總線上的資料傳輸電點陣圖:
ACK應答訊號的傳輸
要完成1個位元組的資料傳輸操作,接收方需要向傳送方傳送一個ACK應答位。ACK脈衝訊號出現在SCL線的第9個時鐘週期,由從裝置負責將SDA線拉低來表示ACK。
當傳送方接收到ACK應答訊號,會將SDA置為高電平從而釋放匯流排。通過軟體(I2CSTAT)可以使能或者禁用ACK傳送功能。
下圖展示了I2C總線上的應答訊號:
讀寫操作
當I2C匯流排控制器處於傳送模式,在新的資料被寫入I2CDS暫存器之前,匯流排介面將一直等待,同時SCL將一直處於低電平。當寫入資料後,控制器將釋放SCL。Exynos 4412通過中斷來判斷資料是否傳送完成,當CPU接收到中斷,會自動把新的資料寫入到I2CDS中。
當I2C匯流排控制器處於接收模式,在暫存器被讀取之前,匯流排介面將一直等待,同時SCL線保持低電平。當讀取資料之後,控制器將釋放SCL。Exynos 4412通過中斷來判斷資料是否接收完成,當CPU接收到中斷,會自動讀取I2CDS中的資料。
每種模式下的操作流程圖
在你進行傳送/接收操作之前:
- 如果有必要,把自己的從裝置地址寫入到I2CADD中。
- 設定I2CCON暫存器:
- 開啟中斷
- 設定SCL的時鐘頻率
- 設定I2CSTAT使能Serial Output。
下圖描述了主傳送模式下的操作流程:
下圖描述了主接收模式下的操作流程:
下圖描述了從傳送模式下的操作流程:
下圖描述了從接收模式下的操作流程: