Exynos4412 裸机开发 —— IIC总线
前言:
??????? I2C(Inter-Integrated Circuit)總線(也稱 IIC 或 I2C) 是有PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及外圍設(shè)備,是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn)。它是同步通信的一種特殊形式,具有接口線少、控制方式簡單、器件封裝形式小、通信速率較高等優(yōu)點。
?
??一、綜述
? ? ? ? Exynos4412精簡指令集微處理器支持4個IIC總線控制器。為了能使連接在總線上的主和從設(shè)備之間傳輸數(shù)據(jù),專用的數(shù)據(jù)線SDA和時鐘信號線SCL被使用,他們都是雙向的。
? ? ? ? 如果工作在多主機(jī)的IIC總線模式,多個4412處理器將從從機(jī)那接收數(shù)據(jù)或發(fā)送數(shù)據(jù)給從機(jī)。在IIC總線上的主機(jī)端4412會啟動或終止一個數(shù)據(jù)傳輸。4412的IIC總線控制器會用一個標(biāo)準(zhǔn)的IIC總線仲裁機(jī)制去實現(xiàn)多主機(jī)和多從機(jī)傳輸數(shù)據(jù)。
? ? ? ? 通過控制如下寄存器以實現(xiàn)IIC總線上的多主機(jī)操作:
控制寄存器: ? ? ? ? ? ? ? ? ?I2CCON
狀態(tài)寄存器: ? ? ? ? ? ? ? ? ? I2CSTAT
Tx/Rx數(shù)據(jù)偏移寄存器: ? I2CDS
地址寄存器: ? ? ? ? ? ? ? ? ? I2CADD
? ? ? ? 如果I2C總線空閑,那么SCL和SDA信號線將都為高電平。在SCL為高電平期間,如果SDA有由高到低電平的跳變,那么將啟動一個起始信號,如果SDA有由低到高電平的跳變,將啟動一個結(jié)束信號。
? ? ? 主機(jī)端的設(shè)備總是提供起始和停止信號的一端。在起始信號被發(fā)出后,一個數(shù)據(jù)字節(jié)的前7位被當(dāng)作地址通過SDA線被傳輸。這個地制值決定了總線上的主設(shè)備將要選擇那個從設(shè)備作為傳輸對象,bit8決定傳輸數(shù)據(jù)的方向(是讀還是寫)。
? ? ? ?I2C總線上的數(shù)據(jù)(即在SDA上傳輸?shù)臄?shù)據(jù))都是以8位字節(jié)傳輸?shù)?#xff0c;在總線上傳輸操作的過程中,對發(fā)送或接收的數(shù)據(jù)字節(jié)數(shù)是沒有限制的。I2C總線上的主/從設(shè)備發(fā)送數(shù)據(jù)總是以一個數(shù)據(jù)的最高位開始傳輸(即MSB方式),傳輸完一個字節(jié)后,應(yīng)答信號緊接其后。
二、I2C總線接口特性
? ? ? 9個通道多主、從I2C總線接口。其中8個通道作為普通接口(即I2C0、I2C1....),1個通道作為HDMI的專用接口。
? ? ? 7位地址模式。
? ? ? 串行,8位單向或雙向的數(shù)據(jù)傳輸。
? ? ? 在標(biāo)準(zhǔn)模式中,每秒最多可以傳輸100k位,即12.5kB的數(shù)據(jù)量。
? ? ? 在快速模式中,每秒最多可以傳輸400k位,即50kB的數(shù)據(jù)量。
? ? ? 支持主機(jī)端發(fā)送、接收,從機(jī)端發(fā)送、接收操作。
? ? ? 支持中斷和查詢方式。
三、框圖
? ??
? ? 從上圖可以看出,4412提供4個寄存器來完成所有的IIC操作。SDA線上的數(shù)據(jù)從IICDS寄存器經(jīng)過移位寄存器發(fā)出,或通過移位寄存器傳入IICDS寄器;IICADD寄存器中保存4412當(dāng)做從機(jī)時的地址;IICCON、IICSTAT兩個寄存器用來控制或標(biāo)識各種狀態(tài),比如選擇工作工作模式,發(fā)出S信號、P信號,決定是否發(fā)出ACK信號,檢測是否接收到ACK信號。
四、I2C總線接口操作 ?? ?
??????? 針對4412處理器的I2C總線接口,具備4種操作模式: ?
1 -- 主機(jī)發(fā)送模式
2 -- 主機(jī)接收模式
3 -- 從機(jī)發(fā)送模式
4 -- 從機(jī)接收模式
下面將描述這些操作模式之間的功能關(guān)系:
0、數(shù)據(jù)有效性
?
???????SDA線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定。數(shù)據(jù)線的高或低電平狀態(tài)IIC位傳輸數(shù)據(jù)的有效性在SCL線的時鐘信號是低電平才能改變。
?
1.? 開始和停止條件
? ? ? ?當(dāng)4412的I2C接口空閑時,它往往工作在從機(jī)模式。或者說,4412的的i2c接口在SDA線上察覺到一個起始信號之前它應(yīng)該工作在從機(jī)模式。當(dāng)控制器改變4412的i2c接口的工作模式為主機(jī)模式后,SDA線上發(fā)起數(shù)據(jù)傳輸并且控制器會產(chǎn)生SCL時鐘信號。
? ? ? 開始條件通過SDA線進(jìn)行串行的字節(jié)傳輸,一個停止信號終止數(shù)據(jù)傳輸,停止信號是指SCL在高電平器件SDA線有從低到高電平的跳變,主機(jī)端產(chǎn)生起始和停止條件。當(dāng)主、從設(shè)備產(chǎn)生一個起始信號后,I2C總線將進(jìn)入忙狀態(tài)。這里需要說明的是上述主從設(shè)備都有可能作為主機(jī)端。
? ??? 當(dāng)一個主機(jī)發(fā)送了一個起始信號后,它也應(yīng)該發(fā)送一個從機(jī)地址以通知總線上的從設(shè)備。這個地址字節(jié)的低7位表示從設(shè)備地址,最高位表示傳輸數(shù)據(jù)的方向,即主機(jī)將要進(jìn)行讀還是寫。當(dāng)最高位是0時,它將發(fā)起一個寫操作(發(fā)送操作);當(dāng)最高位是1時,它將發(fā)起一個讀數(shù)據(jù)的請求(接收操作)。
? ? ? 主機(jī)端發(fā)起一個結(jié)束信號以完成傳輸操作,如果主機(jī)端想在總線上繼續(xù)進(jìn)行數(shù)據(jù)的傳輸,它將發(fā)出另外一個起始信號和從設(shè)備地址。用這樣的方式,它們可以用各種各樣的格式進(jìn)行讀寫操作。
下圖為起始和停止信號:
?
下面先提前講一下具體應(yīng)用中如何啟動和恢復(fù)IIC的傳輸
啟動或恢復(fù)4412的I2C傳輸有以下兩種方法。
1)?當(dāng)IICCON[4]即中斷狀態(tài)位為0時,通過寫IICSTAT寄存器啟動I2C操作。有以下兩種情況。
1--在主機(jī)模式,令I(lǐng)ICSTAT[5:4]等于0b11,將發(fā)出S信號和IICDS寄存器的數(shù)據(jù)(尋址),令I(lǐng)ICSTAT[5:4]等于0b01,將發(fā)出P信號。
2--在從機(jī)模式,令I(lǐng)ICSTAT[4]等于1將等待其他主機(jī)發(fā)出S信號及地址信息。
?
2)當(dāng)IICCON[4]即中斷狀態(tài)為1時,表示I2C操作被暫停。在這期間設(shè)置好其他寄存器之后,向IICCON[4]寫入0即可恢復(fù)I2C操作。所謂“設(shè)置其他寄存器”,有以下三種情況:
1--對于主機(jī)模式,可以按照上面1的方法寫IICSTAT寄存器,恢復(fù)I2C操作后即可發(fā)出S信號和IICDS寄存器的值(尋址),或發(fā)出P信號。
2--對于發(fā)送器,可以將下一個要發(fā)送的數(shù)據(jù)寫入IICDS寄存器中,恢復(fù)I2C操作后即可發(fā)出這個數(shù)據(jù)。
3--對于接收器,可以從IICDS寄存器讀出接收到的數(shù)據(jù)。最后向IICCON[4]寫入0的同時,設(shè)置IICCON[7]以決定是否在接收到下一個數(shù)據(jù)后是否發(fā)出ACK信號。
2. ?數(shù)據(jù)傳輸格式
? ? ? ?放到SDA線上的所有字節(jié)數(shù)據(jù)的長度應(yīng)該為8位,在每次傳輸數(shù)據(jù)時,對傳輸數(shù)據(jù)量沒有限制。在起始信號后的第一個數(shù)據(jù)字節(jié)應(yīng)該包含地址字段,當(dāng)4412的I2C接口被設(shè)置為主模式時,地址字節(jié)應(yīng)該有控制器端發(fā)出。在每個字節(jié)后,應(yīng)該有一個應(yīng)答位。
?????如果從機(jī)要完成一些其他功能后(例如一個內(nèi)部中斷服務(wù)程序)才能繼續(xù)接收或發(fā)送下一個字節(jié),從機(jī)可以拉低SCL迫使主機(jī)進(jìn)入等待狀態(tài)。當(dāng)從機(jī)準(zhǔn)備好接收下一個數(shù)據(jù)并釋放SCL后,數(shù)據(jù)傳輸繼續(xù)。如果主機(jī)在傳輸數(shù)據(jù)期間也需要完成一些其他功能(例如一個內(nèi)部中斷服務(wù)程序)也可以拉低SCL以占住總線。
下面的圖中將說明數(shù)據(jù)傳輸格式:
上圖中說明,在傳輸完每個字節(jié)數(shù)據(jù)后,都會有一個應(yīng)帶信號,這個應(yīng)答信號在第9個時鐘周期。具體過程如下(注意下面描述的讀寫過程都是針對Tiny4412處理器而言,當(dāng)有具體的I2C設(shè)備與4412相連時,數(shù)據(jù)表示什么需要看具體的I2C設(shè)備,4412是不知道數(shù)據(jù)的含義的):
寫過程:主機(jī)發(fā)送一個起始信號S→發(fā)送從機(jī)7位地址和1位方向,方向位表示寫→主機(jī)釋放SDA線方便從機(jī)給回應(yīng)→有從機(jī)匹配到地址,拉低SDA線作為ACK→主機(jī)重新獲得SDA傳輸8位數(shù)據(jù)→主機(jī)釋放SDA線方便從機(jī)給回應(yīng)→從機(jī)收到數(shù)據(jù)拉低SDA線作為ACK告訴主機(jī)數(shù)據(jù)接收成功→主機(jī)發(fā)出停止信號。
讀過程:主機(jī)發(fā)送一個起始信號S→發(fā)送從機(jī)7位地址和1位方向,方向位表示讀→主機(jī)釋放SDA線方便從機(jī)給回應(yīng)→有從機(jī)匹配到地址,拉低SDA線作為ACK→從機(jī)繼續(xù)占用SDA線,用SDA傳輸8位數(shù)據(jù)給主機(jī)→從機(jī)釋放SDA線(拉高)方便主機(jī)給回應(yīng)→主機(jī)接收到數(shù)據(jù)→主機(jī)獲得SDA線控制并拉低SDA線作為ACK告訴從機(jī)數(shù)據(jù)接收成功→主機(jī)發(fā)出停止信號。
注意:在具體的I2C通信時,要看I2C設(shè)備才能確定讀寫時序,比如下面即將描述的第七大點中的示例,讀寫EEPROM中就會說道具體的數(shù)據(jù)含義,讀寫過程。
3. 應(yīng)答信號的傳輸
? ? ? ? 為了完成一個字節(jié)數(shù)據(jù)的傳輸,接收方將發(fā)送一個應(yīng)答位給發(fā)送方。應(yīng)答信號出現(xiàn)在SCL線上的時鐘周期中的第九個時鐘周期,為了發(fā)送或接收1個字節(jié)的數(shù)據(jù),主機(jī)端會產(chǎn)生8個時鐘周期,為了傳輸一個ACK位,主機(jī)端需要產(chǎn)生一個時鐘脈沖。
? ? ? ? ACK時鐘脈沖到來之際,發(fā)送方會在SDA線上設(shè)置高電平以釋放SDA線。在ACK時鐘脈沖之間,接收方會驅(qū)動和保持SDA線為低電平,這發(fā)生在第9個時鐘脈沖為高電平期間。 應(yīng)答信號為低電平時,規(guī)定為有效應(yīng)答位(ACK簡稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號為高電平時,規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。 對于反饋有效應(yīng)答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。如果接收器是主控器,則在它收到最后一個字節(jié)后,發(fā)送一個NACK信號(即不發(fā)出ACK信號),以通知被控發(fā)送器結(jié)束數(shù)據(jù)發(fā)送,并釋放SDA線,以便主控接收器發(fā)送一個停止信號P。
4. 讀寫操作
? ? ? ?當(dāng)I2C控制器在發(fā)送模式下發(fā)送數(shù)據(jù)后,I2C總線接口將等待直到移位寄存器(I2CDS)接收到一個數(shù)據(jù)。在往此寄存器寫入一個新數(shù)據(jù)前,SCL線應(yīng)該保持為低電平,寫完數(shù)據(jù)后,I2C控制器將釋放SCL線。當(dāng)前正在傳輸?shù)臄?shù)據(jù)傳輸完成后,4412會捕捉到一個中斷,然后cpu將開始往I2CDS寄存器中寫入一個新的數(shù)據(jù)。
? ? ? ?當(dāng)I2C控制器在接收模式下接收到數(shù)據(jù)后,I2C總線接口將等待直到I2CDS寄存器被讀。在讀到新數(shù)據(jù)之前,SCL線會被保持為低電平,讀到數(shù)據(jù)后I2C控制器將釋放掉SCL線。一個新數(shù)據(jù)接收完成后,4412將收到一個中斷,cpu收到這個中斷請求后,它將從I2CDS寄存器中讀取數(shù)據(jù)。
5. 總線仲裁機(jī)制
? ? 總線上可能掛接有多個器件,有時會發(fā)生兩個或多個主器件同時想占用總線的情況,這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發(fā)生在SDA線上的總線競爭進(jìn)行仲裁,其仲裁原則是這樣的:當(dāng)多個主器件同時想占用總線時,如果某個主器件發(fā)送高電平,而另一個主器件發(fā)送低電平,則發(fā)送電平與此時SDA總線電平不符的那個器件將自動關(guān)閉其輸出級。總線競爭的仲裁是在兩個層次上進(jìn)行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進(jìn)入數(shù)據(jù)位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進(jìn)行仲裁,因此不會造成信息的丟失。
6. 終止條件
? ? ? ?當(dāng)一個從接收者不能識別從地址時,它將保持SDA線為高電平。在這樣的情況下,主機(jī)會產(chǎn)生一個停止信號并且取消數(shù)據(jù)的傳輸。當(dāng)終止傳輸產(chǎn)生后,主機(jī)端接收器會通過取消ACK的產(chǎn)生以告訴從機(jī)端發(fā)送器結(jié)束發(fā)送操作。這將在主機(jī)端接收器接收到從機(jī)端發(fā)送器發(fā)送的最后一個字節(jié)之后發(fā)生,為了讓主機(jī)端產(chǎn)生一個停止條件,從機(jī)端發(fā)送者將釋放SDA線。
7. 配置I2C總線
? ? ? 如果要設(shè)置I2C總線中SCL時鐘信號的頻率,可以在I2CCON寄存器中設(shè)置4位分頻器的值。I2C總線接口地址值存放在I2C總線地址寄存器(I2CADD)中,默認(rèn)值未知。
8. 每種模式下的操作流程圖
? ? ? 在I2C總線上執(zhí)行任何的收發(fā)Tx/Rx操作前,應(yīng)該做如下配置:
(1)在I2CADD寄存器中寫入從設(shè)備地址
(2)設(shè)置I2CCON控制寄存器
? ? ? ? ?a. 使能中斷
? ? ? ? ?b. 定義SCL頻率
(3)設(shè)置I2CSTAT寄存器以使能串行輸出
下圖為主設(shè)備發(fā)送模式
下圖為主設(shè)備接收模式
下圖為從設(shè)備發(fā)送模式
下圖為從設(shè)備接收
模式
1-- I2C總線控制寄存器
??????IICCON寄存器用于控制是否發(fā)出ACK信號、設(shè)置發(fā)送器的時鐘、開啟I2C中斷,并標(biāo)識中斷是否發(fā)生
使用IICCON寄存器時,有如下注意事項
1)、發(fā)送模式的時鐘頻率由位[6]、位[3:0]聯(lián)合決定。另外,當(dāng)IICCON[6]=0時,IICCON[3:0]不能取0或1。
2)、位[4]用來標(biāo)識是否有I2C中斷發(fā)生,讀出為0時標(biāo)識沒有中斷發(fā)生,讀出為1時標(biāo)識有中斷發(fā)生。當(dāng)此位為1時,SCL線被拉低,此時所以I2C傳輸停止;如果要繼續(xù)傳輸,需寫入0清除它。
中斷在以下3中情況下發(fā)生:
1 -- 當(dāng)發(fā)送地址信息或接收到一個從機(jī)地址并且吻合時;
2 -- 當(dāng)總線仲裁失敗時;
3 -- 當(dāng)發(fā)送/接收完一個字節(jié)的數(shù)據(jù)(包括響應(yīng)位)時;
3)、基于SDA、SCL線上時間特性的考慮,要發(fā)送數(shù)據(jù)時,先將數(shù)據(jù)寫入IICDS寄存器,然后再清除中斷。
4)、如果IICCON[5]=0,IICCON[4]將不能正常工作,所以,即使不使用I2C中斷,也要將IICCON[5]設(shè)為1.
?
2 -- I2C狀態(tài)寄存器
???? IICSTAT寄存器用于選擇I2C接口的工作模式,發(fā)出S信號、P信號,使能接收/發(fā)送功能,并標(biāo)識各種狀態(tài),比如總線仲裁是否成功、作為從機(jī)時是否被尋址、是否接收到0地址、是否接收到ACK信號等。
?3 -- I2C數(shù)據(jù)發(fā)送/接收移位寄存器
?
?
下面是個IIC總線實例:
?用IIC總線實現(xiàn)CPU與MPU-6050的數(shù)據(jù)查詢
具體代碼如下:
[cpp]?view plaincopy
實驗結(jié)果如下:
[cpp]?view plaincopy總結(jié)
以上是生活随笔為你收集整理的Exynos4412 裸机开发 —— IIC总线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获得手机的ip
- 下一篇: 粒子群算法优化BP和Elman神经网络-