Exynos 4412处理器IIC总线控制器(包括协议)
一、綜述
????? ? Exynos4412精簡指令集微處理器支持4個IIC總線控制器。為了能使連接在總線上的主和從設備之間傳輸數據,專用的數據線SDA和時鐘信號線SCL被使用,他們都是雙向的。
????? ? 如果工作在多主機的IIC總線模式,多個4412處理器將從從機那接收數據或發送數據給從機。在IIC總線上的主機端4412會啟動或終止一個數據傳輸.4412的IIC總線控制器會用一個標準的IIC總線仲裁機制去實現多主機和多從機傳輸數據。
???? ? ?通過控制如下寄存器以實現IIC總線上的多主機操作:
控制寄存器: ? ? ? ? ? ? ? ?? I2CCON
狀態寄存器: ? ? ? ? ? ? ? ? ? I2CSTAT
Tx/Rx數據偏移寄存器: I2CDS
地址寄存器: ? ? ? ? ? ? ? ? ? I2CADD
? ??? ? 如果I2C總線空閑,那么SCL和SDA信號線將都為高電平。在SCL為高電平期間,如果SDA有由高到低電平的跳變,那么將啟動一個起始信號,如果SDA有由低到高電平的跳變,將啟動一個結束信號。
??? ? 主機端的設備總是提供起始和停止信號的一端。在起始信號被發出后,一個數據字節的前7位被當作地址通過SDA線被傳輸。這個地制值決定了總線上的主設備將要選擇那個從設備作為傳輸對象,bit8決定傳輸數據的方向(是 讀還是寫)。
???? ? I2C總線上的數據(即在SDA上傳輸的數據)都是以8位字節傳輸的,在總線上傳輸操作的過程中,對發送或接收的數據字節數是沒有限制的。I2C總線上的主/從設備發送數據總是以一個數據的最高位開始傳輸(即MSB方式),傳輸完一個字節后,應答信號緊接其后。
二、I2C總線接口特性
????? 9個通道多主、從I2C總線接口。其中8個通道作為普通接口(即I2C0、I2C1....),1個通道作為HDMI的專用接口。
????? 7位地址模式。
????? 串行,8位單向或雙向的數據傳輸。
????? 在標準模式中,每秒最多可以傳輸100k位,即12.5kB的數據量。
????? 在快速模式中,每秒最多可以傳輸400k位,即50kB的數據量。
????? 支持主機端發送、接收,從機端發送、接收操作。
????? 支持中斷和查詢方式。
三、框圖
????? 從上圖可以看出,4412提供4個寄存器來完成所有的IIC操作。SDA線上的數據從IICDS寄存器經過移位寄存器發出,或通過移位寄存器傳入IICDS寄器;IICADD寄存器中保存4412當做從機時的地址;IICCON、IICSTAT兩個寄存器用來控制或標識各種狀態,比如選擇工作工作模式,發出S信號、P信號,決定是否發出ACK信號,檢測是否接收到ACK信號。
四、I2C總線接口操作??????
??????? 針對4412處理器的I2C總線接口,具備4種操作模式: ?主機發送模式、主機接收模式、從機發送模式、從機接收模式。下面將描述這些操作模式之間的功能關系:
1.? 開始和停止條件
? ? ?? 當4412的I2C接口空閑時,它往往工作在從機模式。或者說,4412的的i2c接口在SDA線上察覺到一個起始信號之前它應該工作在從機模式。當控制器改變4412的i2c接口的工作模式為主機模式后,SDA線上發起數據傳輸并且控制器會產生SCL時鐘信號。
????? 開始條件通過SDA線進行串行的字節傳輸,一個停止信號終止數據傳輸,停止信號是指SCL在高電平器件SDA線有從低到高電平的跳變,主機端產生起始和停止條件。當主、從設備產生一個起始信號后,I2C總線將進入忙狀態。這里需要說明的是上述主從設備都有可能作為主機端。
???? ?當一個主機發送了一個起始信號后,它也應該發送一個從機地址以通知總線上的從設備。這個地址字節的低7位表示從設備地址,最高位表示傳輸數據的方向,即主機將要進行讀還是寫。當最高位是0時,它將發起一個寫操作(發送操作);當最高位是1時,它將發起一個讀數據的請求(接收操作)。
????? 主機端發起一個結束信號以完成傳輸操作,如果主機端想在總線上繼續進行數據的傳輸,它將發出另外一個起始信號和從設備地址。用這樣的方式,它們可以用各種各樣的格式進行讀寫操作。下圖為起始和停止信號:
2.? 數據傳輸格式
?????? 放到SDA線上的所有字節數據的長度應該為8位,在每次傳輸數據時,對傳輸數據量沒有限制。在起始信號后的第一個數據字節應該包含地址字段,當4412的I2C接口被設置為主模式時,地址字節應該有控制器端發出。在每個字節后,應該有一個應答位。下面的圖中將說明數據傳輸格式:
???????? 上圖中說明,在傳輸完每個字節數據后,都會有一個應帶信號,這個應答信號在第9個時鐘周期。具體過程如下(注意下面描述的讀寫過程都是針對Tiny4412處理器而言,當有具體的I2C設備與4412相連時,數據表示什么需要看具體的I2C設備,4412是不知道數據的含義的):
寫過程:主機發送一個起始信號S→發送從機7位地址和1位方向,方向位表示寫→主機釋放SDA線方便從機給回應→有從機匹配到地址,拉低SDA線作為ACK→主機重新獲得SDA傳輸8位數據→主機釋放SDA線方便從機給回應→從機收到數據拉低SDA線作為ACK告訴主機數據接收成功→主機發出停止信號。
讀過程:主機發送一個起始信號S→發送從機7位地址和1位方向,方向位表示讀→主機釋放SDA線方便從機給回應→有從機匹配到地址,拉低SDA線作為ACK→從機繼續占用SDA線,用SDA傳輸8位數據給主機→從機釋放SDA線(拉高)方便主機給回應→主機接收到數據→主機獲得SDA線控制并拉低SDA線作為ACK告訴從機數據接收成功→主機發出停止信號。
注意:在具體的I2C通信時,要看I2C設備才能確定讀寫時序,比如下面即將描述的第七大點中的示例,讀寫EEPROM中就會說道具體的數據含義,讀寫過程。
3. 應答信號的傳輸
??????? 為了完成一個字節數據的傳輸,接收方將發送一個應答位給發送方。應答信號出現在SCL線上的時鐘周期中的第九個時鐘周期,為了發送或接收1個字節的數據,主機端會產生8個時鐘周期,為了傳輸一個ACK位,主機端需要產生一個時鐘脈沖。
??????? ACK時鐘脈沖到來之際,發送方會在SDA線上設置高電平以釋放SDA線。在ACK時鐘脈沖之間,接收方會驅動和保持SDA線為低電平,這發生在第9個時鐘脈沖為高電平期間。 應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。 對于反饋有效應答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩定的低電平。 如果接收器是主控器,則在它收到最后一個字節后,發送一個NACK信號,以通知被控發送器結束數據發送,并釋放SDA線,以便主控接收器發送一個停止信號P。
4. 讀寫操作
?????? 當I2C控制器在發送模式下發送數據后,I2C總線接口將等待直到移位寄存器(I2CDS)接收到一個數據。在往此寄存器寫入一個新數據前,SCL線應該保持為低電平,寫完數據后,I2C控制器將釋放SCL線。當前正在傳輸的數據傳輸完成后,4412會捕捉到一個中斷,然后cpu將開始往I2CDS寄存器中寫入一個新的數據。
?????? 當I2C控制器在接收模式下接收到數據后,I2C總線接口將等待知道I2CDS寄存器被讀。在讀到新數據之前,SCL線會被保持為低電平,讀到數據后I2C控制器將釋放掉SCL線。一個新數據接收完成后,4412將收到一個中斷,cpu收到這個中斷請求后,它將從I2CDS寄存器中讀取數據。
5. 總線仲裁機制
??? 總線上可能掛接有多個器件,有時會發生兩個或多個主器件同時想占用總線的情況,這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發生在SDA線上的總線競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想占用總線時,如果某個主器件發送高電平,而另一個主器件發送低電平,則發送電平與此時SDA總線電平不符的那個器件將自動關閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數據位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進行仲裁,因此不會造成信息的丟失。
6. 終止條件
?????? 當一個從接收者不能識別從地址時,它將保持SDA線為高電平。在這樣的情況下,主機會產生一個停止信號并且取消數據的傳輸。當終止傳輸產生后,主機端接收器會通過取消ACK的產生以告訴從機端發送器結束發送操作。這將在主機端接收器接收到從機端發送器發送的最后一個字節之后發生,為了讓主機端產生一個停止條件,從機端發送者將釋放SDA線。
7. 配置I2C總線
????? 如果要設置I2C總線中SCL時鐘信號的頻率,可以在I2CCON寄存器中設置4位分頻器的值。I2C總線接口地址值存放在I2C總線地址寄存器(I2CADD)中,默認值未知。
8. 每種模式下的操作流程圖
????? 在I2C總線上執行任何的收發Tx/Rx操作前,應該做如下配置:
(1)在I2CADD寄存器中寫入從設備地址
(2)設置I2CCON控制寄存器
???????? a. 使能中斷
???????? b. 定義SCL頻率
(3)設置I2CSTAT寄存器以使能串行輸出
???????? 下圖為主設備發送模式
?????? 下圖為主設備接收模式:
?????? 下圖為從設備發送模式:
?????? 下圖為從設備接收模式:
五、I/O描述
六、寄存器描述
1.? I2CCONn(n=0-7)寄存器
注意:
(1)當EEPROM連接到I2C總線上時,為了在接收模式中產生停止信號,在讀最后一個數據之前ACK將被禁止產生。
(2)一個I2C中斷發生在以下三種情況:
?????? 當發出地址信息或接收到一個從機地址并吻合時,當總線總裁失敗時,當發送/接收完一個字節的數據(包括ACK響應位)時。當發出地址信息或接收到一個從機地址并吻合時產生中斷,在中斷處理函數中要準備發送或者接收數據,即讀取或設備IICDS寄存器,或者發出P信號。當總線總裁失敗時產生中斷,在中斷處理函數中決定時候延時后再次競爭總線等。當發送/接收完一個字節的數據(包括ACK響應位)時產生中斷,在中斷處理函數中要準備下次要發送或者接收數據,即讀取或設備IICDS寄存器,或者發出P信號。
(3)基于SDA、SCL線上事件特性的考慮,要發送數據時,先將數據寫入I2CDS寄存器,然后再清除中斷。清除中斷,即向I2CCON[4]寫入0,也就是將SCL線拉高,此時產生一個上升沿,將移位寄存器中的數據發送到SDA線。至于先將數據寫入I2CDS寄存器,然后再清除中斷,可能是數據穩定需要一個時間。
(4)I2CCON[6] determines I2CCLK. Tx clock can vary by SCL transition time.When I2CCON[6] = 0, I2CCON[3:0] = 0x0 or 0x1 is not available.
(5)如果IICCON[5]==0,IICCON[4]將不能正常工作。所以,即使不使用IIC中斷,也要將IICCON[5]設為1。
2.? I2CSTATn(n=0-7)寄存器
3.? I2CADDn(n=0-7)寄存器
?????? 用到IICADD寄存器的位[7:1],表示從機地址。IICADD寄存器在串行輸出使能位IICSTAT[4]為0時,才可以寫入;在任何時候都可以讀出。IICSTAT[4]為0時,禁止接收/發送功能,即此時SCL線被拉低。
4.? I2CDSn(n=0-7)寄存器
????? 用到IICDS寄存器的位[7:0],其中保存的是要發送或已經接收到的數據。IICDS寄存器在串行輸出使能位IICSTAT[4]為1時才可以寫入;在任何時候都可以讀出。IICSTAT[4]為1時,使能接收/發送功能,也就是釋放了SCL線。
5.? I2CLCn(n=0-7)寄存器
七、實例(EEPROM)
1、I2C原理:
(1)IIC只有2條線,SDA(數據線)/SCL(時鐘線),分為主機(IIC控制器)和從機(EEPROM),即主從結構,所有的數據傳輸都是由主機發起,從機只能接收,2條線上可以掛很多 ? ? ? ? ? ? 從機設備。
(2)主機通過向從機發地址(每個I2C設備都有一個嵌入到芯片里的設備地址,并且每種I2C設備地址格式還不一樣,比如EEPROM的設備地址就由前面地址和后面格式構成, ? ? ? ? ? ? 后面格式由根據硬件上的連線決定,Tiny4412上接的EEPROM的A0-2都被拉低,即地址為1010000的七位地址),哪個從機響應了,就與哪個從機通信,具體是讀還是寫根據 ? ? ? ? ? 第8位去區別。
(3)當SCL/SDA都為高電平時,拉低SDA作為起始信號,? SCL為高,拉高SDA做為結束信號,從機在收到8位數據后,在第9個時鐘周期拉底SDA作為ACK應答信號。
(4)scl為低時可以傳送數據,傳送完后SCL會被拉高,在scl上升沿開始傳數據。scl為高時要保持sda數據穩定。
(5)發送完數據,讀完數據,發送完stop信號,都要delay一會,等設備反應。
(6)傳送數據按芯片手冊的timing走,先傳地址,先傳數據,每傳一個8位數據,從機要發送一個ACK應答。
(7)我們編程是以主機的角色,從機自己會拉高拉底scl/sda,主機也不用管怎么拉高拉低SCL/SDA,只需設置IIC控制器的寄存器就可以按timing傳數據,如果沒有I2C控制器,需 ? ? ? ? ? ? 要用GPIO模擬時才需要自行控制scl/sda線。
(8)Tiny4412有一個直接連接CPU IIC0 信號引腳的EEPROM芯片AT24C08,主要是為了測試IIC總線用,我們看下往這個設備讀寫數據應該怎么操作。
2、寫時序
????????? 在第四大點中描述了基于4412處理器I2C操作中讀寫時序,但是具體數據含義還得看具體I2C設備,比如這里的EEPROM。
?????? 當4412要往EEPROM里寫一個字節數據時,首先發start信號,然后寫從機的8位設備地址(可以從AT24C08的手冊找到),最后1位用來標識接下來是要寫還是讀從機設備,然后拉高SDA。從機收到地址后如果跟自己地址匹配,就發一個ACK應答給主機,即會拉低SDA線。
????? 從機里的數據是按addr(EEPROM芯片內部的內存地址)來index的,要往哪塊地址寫數據,4412先發addr給從機,從機準備好后發ACK,然后主機就發8位data給從機,從機應答,然后主機發stop信號結束,主機在發送8位數據的8個clk里,SDA由主機驅動,第9個clk里,SDA由從機驅動。
3、讀時序
???????? 當4412要在EEPROM中讀一個字節時,先發start信號,發從機地址,最后1位標識write(寫的這個地址即告訴從機后面將要在EEPROM里哪個地方讀取數據),拉高SDA方便從機回應,有從機匹配到從機地址后拉低SDA線回應主機;主機發要讀哪塊地址數據的addr數據,從機收到主機發來的數據后給出回應;主機重新發start信號,發從機地址,最后1位標識read,然后4412讀數據,讀完數據主機(4412)一般不會應答(no ack),主機發stop信號結束。
?????? 在主機讀數據的那8個clk里,SDA由從機驅動,第9個CLK,SDA由主機驅動。總的來說,誰收數據,誰就要給出應答信號(拉低SDA),因為要告訴發送方,數據已經收到。
總結
以上是生活随笔為你收集整理的Exynos 4412处理器IIC总线控制器(包括协议)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现了私聊和群聊功能的聊天工具
- 下一篇: axios 的responseType