娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月21日(星期六)

2021年12月21日 | Exynos4412 裸機開發 —— IIC總線

發布者:淡雅時光 來源: eefocus關鍵字:Exynos4412  裸機開發  IIC總線 手機看文章 掃描二維碼
隨時隨地手機看文章

前言:

I2C(Inter-Integrated Circuit)總線(也稱 IIC 或 I2C) 是有PHILIPS公司開發的兩線式串行總線,用于連接微控制器及外圍設備,是微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有接口線少、控制方式簡單、器件封裝形式小、通信速率較高等優點。

 

  一、綜述
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 -- 主機發送模式

2 -- 主機接收模式

3 -- 從機發送模式

4 -- 從機接收模式


下面將描述這些操作模式之間的功能關系:

0、數據有效性

 

SDA線上的數據必須在時鐘的高電平周期保持穩定。數據線的高或低電平狀態IIC位傳輸數據的有效性在SCL線的時鐘信號是低電平才能改變。

 

1.  開始和停止條件

當4412的I2C接口空閑時,它往往工作在從機模式。或者說,4412的的i2c接口在SDA線上察覺到一個起始信號之前它應該工作在從機模式。當控制器改變4412的i2c接口的工作模式為主機模式后,SDA線上發起數據傳輸并且控制器會產生SCL時鐘信號。

開始條件通過SDA線進行串行的字節傳輸,一個停止信號終止數據傳輸,停止信號是指SCL在高電平器件SDA線有從低到高電平的跳變,主機端產生起始和停止條件。當主、從設備產生一個起始信號后,I2C總線將進入忙狀態。這里需要說明的是上述主從設備都有可能作為主機端。

當一個主機發送了一個起始信號后,它也應該發送一個從機地址以通知總線上的從設備。這個地址字節的低7位表示從設備地址,最高位表示傳輸數據的方向,即主機將要進行讀還是寫。當最高位是0時,它將發起一個寫操作(發送操作);當最高位是1時,它將發起一個讀數據的請求(接收操作)。

主機端發起一個結束信號以完成傳輸操作,如果主機端想在總線上繼續進行數據的傳輸,它將發出另外一個起始信號和從設備地址。用這樣的方式,它們可以用各種各樣的格式進行讀寫操作。


下圖為起始和停止信號:


 

下面先提前講一下具體應用中如何啟動和恢復IIC的傳輸

啟動或恢復4412的I2C傳輸有以下兩種方法。

1) 當IICCON[4]即中斷狀態位為0時,通過寫IICSTAT寄存器啟動I2C操作。有以下兩種情況。

1--在主機模式,令IICSTAT[5:4]等于0b11,將發出S信號和IICDS寄存器的數據(尋址),令IICSTAT[5:4]等于0b01,將發出P信號。
2--在從機模式,令IICSTAT[4]等于1將等待其他主機發出S信號及地址信息。

 

2)當IICCON[4]即中斷狀態為1時,表示I2C操作被暫停。在這期間設置好其他寄存器之后,向IICCON[4]寫入0即可恢復I2C操作。所謂“設置其他寄存器”,有以下三種情況:

1--對于主機模式,可以按照上面1的方法寫IICSTAT寄存器,恢復I2C操作后即可發出S信號和IICDS寄存器的值(尋址),或發出P信號。
2--對于發送器,可以將下一個要發送的數據寫入IICDS寄存器中,恢復I2C操作后即可發出這個數據。
3--對于接收器,可以從IICDS寄存器讀出接收到的數據。最后向IICCON[4]寫入0的同時,設置IICCON[7]以決定是否在接收到下一個數據后是否發出ACK信號。


2.  數據傳輸格式
放到SDA線上的所有字節數據的長度應該為8位,在每次傳輸數據時,對傳輸數據量沒有限制。在起始信號后的第一個數據字節應該包含地址字段,當4412的I2C接口被設置為主模式時,地址字節應該有控制器端發出。在每個字節后,應該有一個應答位。


如果從機要完成一些其他功能后(例如一個內部中斷服務程序)才能繼續接收或發送下一個字節,從機可以拉低SCL迫使主機進入等待狀態。當從機準備好接收下一個數據并釋放SCL后,數據傳輸繼續。如果主機在傳輸數據期間也需要完成一些其他功能(例如一個內部中斷服務程序)也可以拉低SCL以占住總線。


下面的圖中將說明數據傳輸格式:



上圖中說明,在傳輸完每個字節數據后,都會有一個應帶信號,這個應答信號在第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信號(即不發出ACK信號),以通知被控發送器結束數據發送,并釋放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寄存器以使能串行輸出


下圖為主設備發送模式



下圖為主設備接收模式



下圖為從設備發送模式



下圖為從設備接收

模式


1-- I2C總線控制寄存器

IICCON寄存器用于控制是否發出ACK信號、設置發送器的時鐘、開啟I2C中斷,并標識中斷是否發生


使用IICCON寄存器時,有如下注意事項
1)、發送模式的時鐘頻率由位[6]、位[3:0]聯合決定。另外,當IICCON[6]=0時,IICCON[3:0]不能取0或1。

2)、位[4]用來標識是否有I2C中斷發生,讀出為0時標識沒有中斷發生,讀出為1時標識有中斷發生。當此位為1時,SCL線被拉低,此時所以I2C傳輸停止;如果要繼續傳輸,需寫入0清除它。


中斷在以下3中情況下發生:
1 -- 當發送地址信息或接收到一個從機地址并且吻合時;
2 -- 當總線仲裁失敗時;
3 -- 當發送/接收完一個字節的數據(包括響應位)時;

3)、基于SDA、SCL線上時間特性的考慮,要發送數據時,先將數據寫入IICDS寄存器,然后再清除中斷。

4)、如果IICCON[5]=0,IICCON[4]將不能正常工作,所以,即使不使用I2C中斷,也要將IICCON[5]設為1.

 

2 -- I2C狀態寄存器

IICSTAT寄存器用于選擇I2C接口的工作模式,發出S信號、P信號,使能接收/發送功能,并標識各種狀態,比如總線仲裁是否成功、作為從機時是否被尋址、是否接收到0地址、是否接收到ACK信號等。



 3 -- I2C數據發送/接收移位寄存器

下面是個IIC總線實例:


用IIC總線實現CPU與MPU-6050的數據查詢


具體代碼如下:


#include "exynos_4412.h"    

    

//****************************************    

//  MPU6050內部地址    

//****************************************    

#define SMPLRT_DIV      0x19    //陀螺儀采樣率,典型值:0x07(125Hz)    

#define CONFIG          0x1A    //低通濾波頻率,典型值:0x06(5Hz)    

#define GYRO_CONFIG     0x1B    //陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s)    

#define ACCEL_CONFIG    0x1C    //加速計自檢、測量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz)    

#define ACCEL_XOUT_H    0x3B    

#define ACCEL_XOUT_L    0x3C    

#define ACCEL_YOUT_H    0x3D    

#define ACCEL_YOUT_L    0x3E    

#define ACCEL_ZOUT_H    0x3F    

#define ACCEL_ZOUT_L    0x40    

#define TEMP_OUT_H      0x41    

#define TEMP_OUT_L      0x42    

#define GYRO_XOUT_H     0x43    

#define GYRO_XOUT_L     0x44    

#define GYRO_YOUT_H     0x45    

#define GYRO_YOUT_L     0x46    

#define GYRO_ZOUT_H     0x47    

#define GYRO_ZOUT_L     0x48    

#define PWR_MGMT_1      0x6B    //電源管理,典型值:0x00(正常啟用)    

#define WHO_AM_I        0x75    //IIC地址寄存器(默認數值0x68,只讀)    

#define SlaveAddress    0xD0    //IIC寫入時的地址字節數據,+1為讀取    


void mydelay_ms(int time)    

{    

    int i, j;    

    while(time--)    

    {    

        for (i = 0; i < 5; i++)    

            for (j = 0; j < 514; j++);    

    }    

}    

/**********************************************************************    

 * @brief       iic read a byte program body    

 * @param[in]   slave_addr, addr, &data    

 * @return      None    

 **********************************************************************/    

void iic_read(unsigned char slave_addr, unsigned char addr, unsigned char *data)    

{    

    I2C5.I2CDS = slave_addr; //將從機地址寫入I2CDS寄存器中    

    I2C5.I2CCON = (1 << 7)|(1 << 6)|(1 << 5); //設置時鐘并使能中斷    

    I2C5.I2CSTAT = 0xf0; //[7:6]設置為0b11,主機發送模式;    

                         //往[5:4]位寫0b11,即產生啟動信號,發出IICDS寄存器中的地址    

    while(!(I2C5.I2CCON & (1 << 4))); // 等待傳輸結束,傳輸結束后,I2CCON [4]位為1,標識有中斷發生;    

                                      // 此位為1時,SCL線被拉低,此時I2C傳輸停止;    

    I2C5.I2CDS = addr; //寫命令值    

    I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4)); // I2CCON [4]位清0,繼續傳輸    

    while(!(I2C5.I2CCON & (1 << 4))); // 等待傳輸結束    

    I2C5.I2CSTAT = 0xD0; // I2CSTAT[5:4]位寫0b01,發出停止信號    

    

    I2C5.I2CDS = slave_addr | 1; //表示要讀出數據    

    I2C5.I2CCON = (1 << 7)|(1 << 6) |(1 << 5) ; //設置時鐘并使能中斷    

    I2C5.I2CSTAT = 0xb0; //[7:6]位0b10,主機接收模式;    

                         //往[5:4]位寫0b11,即產生啟動信號,發出IICDS寄存器中的地址    

    //I2C5.I2CCON = I2C5.I2CCON & (~(1 << 4));    

    while(!(I2C5.I2CCON & (1 << 4))); //等待傳輸結束,接收數據    

[1] [2]
關鍵字:Exynos4412  裸機開發  IIC總線 引用地址:Exynos4412 裸機開發 —— IIC總線

上一篇:Tiny4412裸機程序之操作ICache
下一篇:Tiny4412之C語言實現流水燈,Tiny4412裸機程序[3]

推薦閱讀

以stm32F103為例解釋:如果初始化配置的是自動重裝初值(寄存器TIMx->CR1中第三位默認為發生更新事件時計數器不停止,可軟件置1更改為手動開啟計數器),那么定時器溢出后(即進入中斷后)就會立刻進行下一輪計數,不過如果中斷標志沒有清除,那么溢出后不會產生中斷,直到清除上次中斷標志產生本次中斷。總結:找到相應的寄存器配置查看或時序圖。
新浪科技訊 北京時間12月21日早間消息,據外媒報道,摩托羅拉推遲了可折疊Razr智能手機在北美的上市時間,稱對這款售價1500美元的手機的需求已經超過了它的供貨預期。  這款手機于11月發布,本應在12月開始預購,并于1月開始向客戶發貨。“摩托羅拉已決定調整Razr的預售和上市時間,以更好地滿足消費者的需求,”聯想集團在周五的一份聲明中說,...
博世推出首款用于電動車的CVT變速箱。市場上的絕大多數電動車都是單速變速箱。當然保時捷Taycan的兩擋變速箱除外。近日,博世剛剛為電動車推出了首款CVT變速箱。該變速器與逆變器和電動機集成在一體。旨在滿足低功耗同時提供電動機的最佳性能。電氣的最大問題是平衡效率和性能。這個CVT 4EV變速箱具有負責控制電動機轉速和電動機轉矩的操作邏輯。博世消息...
一、總體設計1.設計要求:兩片單片機之間進行串行通信,發送端將0~f循環發送到接收端,并在接收端顯示。2.設計方案:本次設計,對于兩片89C51,采用RS232進行雙機通信。發送方的數據由串行口TXD段輸出,經過電平轉換芯片MAX232將TTL電平轉換為RS232電平輸出,經過傳輸線將信號傳送到接收端。接收方也使用MAX232芯片進行電平轉換后,信號到達接收方串行口的...

史海拾趣

問答坊 | AI 解惑

Q2406B型GPRS模塊在三害預防系統中的應用

在環境問題日益迫切的今天,以信息化促進環境保護、建設美麗家園已成為最有效有力的舉措之一。 北京xx科技有限公司的Q2406B型 GPRS無線數據傳輸產品,在環境監測、氣象、汛情測報中得到良好應用,成為了: 環境監測的"特種信號兵"; ...…

查看全部問答∨

java是否和c一樣 以后會廣泛用于ARM?

如題,偶是很想問一下,學嵌入式軟件(搞ARM的),有沒有必要學java呢? 各位大蝦給個指點吧!~ 期待中。。。…

查看全部問答∨

跟我一起制作大尺寸數碼管電子鐘

六位電子鐘我想是每個初學電子或者初學單片機程序的朋友必做的項目吧,大家基本都在學習板上利用小尺寸數碼管做過,但是如果讓大家用1.8寸以上數碼管甚至20寸數碼管制作,大家覺得會什么問題呢?下面開始就大尺寸數碼管電子鐘制作談談個人的設計思 ...…

查看全部問答∨

ethereal 的時候識別不到網卡

請問用 ethereal 的時候識別不到網卡,是怎么回事? 在選擇網卡的interface處只有下面一行,發現并不是我機器上的網卡。 Generic dialup adapter: \\Device\\NPF_GenericDialupAdapter 這個現象 是由于我用優化工具優化電腦,之后抓包工具就找不 ...…

查看全部問答∨

evc DirectDraw 中DirectDrawCreate創建失敗

LPDIRECTDRAW         pDD = NULL; hRet = ::DirectDrawCreate(NULL, &pDD, NULL); 返回-2005532450 不知道什么原因? 高手指點啊。…

查看全部問答∨

2440用TCP/IP往上位機發送文件 有些問題 新手求助

PC采用TCP&UDP測試工具接收2440發送的數據 新手求助 大家幫忙看看 問題:1.若發送內容只是一行字符的文件 只收到文件內容的第一個字符 TCP&UDP測試工具 計數顯示的數 是文件字符數2倍       2.若發送分辨率640X480 600K的b ...…

查看全部問答∨

請教使用過AT89C5131A-M的兄弟,關于程序最后燒寫的問題

我基于AT89C5131A-M寫了代碼,現在已經調試通過了,我想問問最后如何將代碼固化到芯片里,在使用外部電源供電的情況下正常使用。 按照datasheet寫的用flip勾掉BLJB之后就應該可以上電后進入用戶自己的應用運行了啊,我這樣做了就是上電后不工作啊 ...…

查看全部問答∨

有人在村田買過器件嗎?

本信息來自合作QQ群:電子工程師技術交流(12425841) 群主在壇子ID:Kata   有人在村田買過器件嗎…

查看全部問答∨

STM32F103執行的程序代碼是放在哪里呢?

STM32F103執行的程序代碼是放在哪里呢?   下載后,程序代碼是放在0x0800 0000 —— 0x0807 FFFF 這個區間之內嗎?   另外,程序里面需要保存一些固定的參數!可以放到這個空間里面嗎?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 青浦区| 建平县| 县级市| 宁安市| 绥德县| 溧水县| 屯昌县| 启东市| 武城县| 黄大仙区| 醴陵市| 白水县| 福海县| 灵石县| 金昌市| 水富县| 昆明市| 中卫市| 屏东县| 申扎县| 合作市| 化隆| 阿鲁科尔沁旗| 琼海市| 仙桃市| 邓州市| 普陀区| 新河县| 萨嘎县| 隆安县| 松溪县| 鄂尔多斯市| 会泽县| 宁安市| 金阳县| 长泰县| 兴隆县| 福泉市| 瑞安市| 建阳市| 滁州市|