在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 手機與無線通信 > 設(shè)計應(yīng)用 > I2C串行總線組成及其工作原理

            I2C串行總線組成及其工作原理

            作者: 時間:2017-01-10 來源:網(wǎng)絡(luò) 收藏

              采用串行總線技術(shù)可以使系統(tǒng)的硬件設(shè)計大大簡化,系統(tǒng)的體積減小,可靠性提高,同時系統(tǒng)更容易更改和擴充

            本文引用地址:http://www.biyoush.com/article/201701/342706.htm

              常用的串行擴展總線有:總線,單總線,總線,以及microwire、Plus等等

              總線只有兩根雙向信號線,一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL

                

             

              總線通過上拉電阻接正電源。因此I2C總線的設(shè)備都要接上拉電阻

              當總線閑置的時候,兩根線均為高電平,連接到總線上的任何一個器件輸出的低電平,都將使得總線得到信號變低,及各個器件的SDA和SCL都是線與的關(guān)系

              每個接入到I2C總線都有唯一的地址,主機與其他器件間的數(shù)據(jù)傳送可以是由主機發(fā)送數(shù)據(jù)到其他器件,這時主機即是發(fā)送器,由總線上接收數(shù)據(jù)的器件稱為是接收器。

              在多主機系統(tǒng)中,可能同時由幾個主機企圖啟動總線傳送數(shù)據(jù),為了避免混亂,I2C總線要通過總線仲裁,已決定由哪臺主機控制總線

              數(shù)據(jù)位的有效性

              I2C總線進行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平和低電平狀態(tài)才允許變化

                

             

              起始信號和終止信號

              SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號,SCL線為高電平期間,SDA線由低電平向高電平變化表示終止信號

                

             

              數(shù)據(jù)傳送的格式

              (1)字節(jié)傳送與應(yīng)答

              每一個字節(jié)必須保證是8位長度,數(shù)據(jù)傳送時,先傳送的是最高位(MSB),每一個被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位,即(一幀共有9位),應(yīng)答信號由從機發(fā)送給主機

                

             

              每次數(shù)據(jù)傳送總是由主機產(chǎn)生的終止信號結(jié)束,但是若主機希望繼續(xù)占用總線進行新的數(shù)據(jù)傳送,則可以不產(chǎn)生終止信號,馬上再次發(fā)出起始信號對另一個從機進行尋址

              在總線的一個數(shù)據(jù)傳上過程中,可以有一下幾種傳送方式的組合方式

              a,主機向從機發(fā)送數(shù)據(jù),數(shù)據(jù)傳送的方向在整個傳送過程中不變

                

             

              A表示應(yīng)答,A非表示非應(yīng)答,s表示其實信號,p表示終止信號

              主機發(fā)送地址時,總線上的每一個從機都將這7位地址碼與自己的地址進行比較,如果相同,則認為自己正在被主機尋址,根據(jù)R/T位將自己確定為發(fā)送器或接收器

              從機地址由固定部分和可編程部分組成,可編程的部分決定了可接入總線該器件的最大數(shù)目。

                

             

              由操作時序可知要進行必要的延時

              起始操作示例代碼:

              void T2CStart(void)

              {

              SDA = 1;

              SomeNop();//大于微秒級別

              SCL = 1;

              SomeNop();

              SDA = 0;

              SomeNop();

              }

              終止指令:

              void I2CStop(void)

              {

              SDA = 0;//data由0變到1為終止指令

              SomeNop();

              SCL = 1;

              SomeNop();

              SDA = 1;

              SomeNop();

              }

              I2C總線擴展  

             

              串行E2PROM的擴展

              (2)寫入過程:AT24CEEPROM的固定地址為1010,A2,A1A0引腳接入高低電平可以得到確定的3位編碼,形成的7位編碼即為該器件的地址碼

              單片機進行寫操作的時候,首先

              發(fā)送該器件的7位地址嗎和寫方向的方向碼0,發(fā)送完以后釋放SDA線并在SCL線上產(chǎn)生第九個時鐘信號,被選中的存儲器再確認自己的地址后,在SDA上產(chǎn)生一個應(yīng)答信號作為響應(yīng)

              ,單片機接收到信號就可以傳送數(shù)據(jù)了

              傳送數(shù)據(jù)時,單片機首先發(fā)送一個字節(jié)的被寫入器件的存儲區(qū)的首地址,收到存儲器器件的應(yīng)答后,單片機就逐個發(fā)送各個數(shù)據(jù)的字節(jié),但是每次發(fā)送一個字節(jié)后都要等待應(yīng)答

              收到每個字節(jié)的地址后,芯片上的地址會自動加一

              寫入n個字節(jié)的數(shù)據(jù)格式

                

             

              讀出過程

              單片機首先發(fā)送該器件的7位地址碼和寫方向位0(偽寫),發(fā)送完后釋放SDA線并在SCL線上產(chǎn)生9個時鐘信號,被選中的存儲器器件在確認自己的地址之后,在SDA上產(chǎn)生一個應(yīng)答信號作為回應(yīng)

              然后在發(fā)送一個字節(jié)的要讀出存儲去的首地址,收到應(yīng)答,單片機要重復(fù)一次起始信號并發(fā)出器件地址的讀方向位(1),收到器件應(yīng)答就可以讀出字節(jié),每次讀出一個字節(jié),單片機都要回復(fù)一個應(yīng)答信號,但最后讀出一個字節(jié),單片機應(yīng)返回非應(yīng)答信號(高電平)并發(fā)出終止信號以結(jié)束讀出操作

                

             

              示例代碼:

              #include

              #define uchar unsigned char

              #define uint unsigned int

              sbit sda = P2^3;

              sbit scl = P2^2;

              sbit wp = P2^1;

              void delay()//微妙級別的延時函數(shù)

              {;;}

              void start()//開始信號

              {

              sda = 1;

              delay();

              scl = 1;

              delay();

              sda = 0;

              delay();

              }

              void stop()//停止信號

              {

              sda = 0;

              delay();

              scl = 1;

              delay();

              sda = 1;

              delay();

              }

              void respons()//應(yīng)答信號

              {

              uchar i;

              scl = 1;

              delay();

              while((sda ==1)&&(i<250))//等到第九個時鐘周期的時候,還沒有變?yōu)?,

              //那么scl將自動的變?yōu)?,表示收到信號

              {

              i++;

              }

              scl = 0;

              }

              void init()

              {

              sda = 1;

              scl = 1;//把線全部釋放

              }

              void write_byte(uchar date)

              {

              uchar i,temp;

              temp = date;

              scl = 0;

              delay();

              for(i = 0;i<8;i++)//寫8次

              {

              temp = temp<<1;//表示將temp左移1位,將最高位移入psw寄存器中的cy位,

              //然后將最高位賦值給sda,送走數(shù)據(jù)

              scl = 1;//數(shù)據(jù)穩(wěn)定了

              delay();

              sda = CY;

              delay();

              scl = 0;//讀走數(shù)據(jù)

              delay();

              }

              sda = 1;//注意養(yǎng)成釋放總線的習慣

              delay();

              }

              uchar read_byte()

              {

              uchar i,j,k;

              scl = 0;

              delay();

              sda = 1;//釋放數(shù)據(jù)總線

              delay();

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

              {

              scl = 1;

              delay();

              j = sda ;//讀取數(shù)據(jù)

              k =(k<<1)"j;

              scl = 0;

              delay();

              }

              return k;

              }

              uchar read_add(uchar address)

              {

              uchar date;

              start();

              write_byte(0xa0);//表示寫入器件的地址

              respons();

              write_byte(address);

              respons();

              start();

              write_byte(0xa1);

              respons();

              date=read_byte();

              stop();

              return date;

              }

              void write_add(uchar address,uchar date)

              {

              init();//初始化信號總線和地址總線

              start();//啟動信號

              write_byte(0xa0);//表示寫入器件的地址

              respons();

              write_byte(address);//表示往這個器件內(nèi)部的第三個地址處寫入地址

              respons();

              write_byte(date);//表示器件內(nèi)部的數(shù)據(jù)

              respons();

              stop();

              }

              void delay1(uint z)

              {

              uint x,y;

              for(x= z;x>0;x--)

              for(y=110;y>0;y--);

              }

              void main()

              {

              init();

              write_add(23,125);

              delay1(100);

              P1=read_add(23);

              while(1);

              }



            關(guān)鍵詞: I2c SPI

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉