<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > I2C串行總線(xiàn)組成及其工作原理

I2C串行總線(xiàn)組成及其工作原理

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

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

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

  常用的串行擴展總線(xiàn)有:總線(xiàn),單總線(xiàn),總線(xiàn),以及microwire、Plus等等

  總線(xiàn)只有兩根雙向信號線(xiàn),一根是數據線(xiàn)SDA,另一根是時(shí)鐘線(xiàn)SCL

    

 

  總線(xiàn)通過(guò)上拉電阻接正電源。因此I2C總線(xiàn)的設備都要接上拉電阻

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

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

  在多主機系統中,可能同時(shí)由幾個(gè)主機企圖啟動(dòng)總線(xiàn)傳送數據,為了避免混亂,I2C總線(xiàn)要通過(guò)總線(xiàn)仲裁,已決定由哪臺主機控制總線(xiàn)

  數據位的有效性

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

    

 

  起始信號和終止信號

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

    

 

  數據傳送的格式

  (1)字節傳送與應答

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

    

 

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

  在總線(xiàn)的一個(gè)數據傳上過(guò)程中,可以有一下幾種傳送方式的組合方式

  a,主機向從機發(fā)送數據,數據傳送的方向在整個(gè)傳送過(guò)程中不變

    

 

  A表示應答,A非表示非應答,s表示其實(shí)信號,p表示終止信號

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

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

    

 

  由操作時(shí)序可知要進(jìn)行必要的延時(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總線(xiàn)擴展  

 

  串行E2PROM的擴展

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

  單片機進(jìn)行寫(xiě)操作的時(shí)候,首先

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

  ,單片機接收到信號就可以傳送數據了

  傳送數據時(shí),單片機首先發(fā)送一個(gè)字節的被寫(xiě)入器件的存儲區的首地址,收到存儲器器件的應答后,單片機就逐個(gè)發(fā)送各個(gè)數據的字節,但是每次發(fā)送一個(gè)字節后都要等待應答

  收到每個(gè)字節的地址后,芯片上的地址會(huì )自動(dòng)加一

  寫(xiě)入n個(gè)字節的數據格式

    

 

  讀出過(guò)程

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

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

    

 

  示例代碼:

  #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()//開(kāi)始信號

  {

  sda = 1;

  delay();

  scl = 1;

  delay();

  sda = 0;

  delay();

  }

  void stop()//停止信號

  {

  sda = 0;

  delay();

  scl = 1;

  delay();

  sda = 1;

  delay();

  }

  void respons()//應答信號

  {

  uchar i;

  scl = 1;

  delay();

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

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

  {

  i++;

  }

  scl = 0;

  }

  void init()

  {

  sda = 1;

  scl = 1;//把線(xiàn)全部釋放

  }

  void write_byte(uchar date)

  {

  uchar i,temp;

  temp = date;

  scl = 0;

  delay();

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

  {

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

  //然后將最高位賦值給sda,送走數據

  scl = 1;//數據穩定了

  delay();

  sda = CY;

  delay();

  scl = 0;//讀走數據

  delay();

  }

  sda = 1;//注意養成釋放總線(xiàn)的習慣

  delay();

  }

  uchar read_byte()

  {

  uchar i,j,k;

  scl = 0;

  delay();

  sda = 1;//釋放數據總線(xiàn)

  delay();

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

  {

  scl = 1;

  delay();

  j = sda ;//讀取數據

  k =(k<<1)"j;

  scl = 0;

  delay();

  }

  return k;

  }

  uchar read_add(uchar address)

  {

  uchar date;

  start();

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

  respons();

  write_byte(address);

  respons();

  start();

  write_byte(0xa1);

  respons();

  date=read_byte();

  stop();

  return date;

  }

  void write_add(uchar address,uchar date)

  {

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

  start();//啟動(dòng)信號

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

  respons();

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

  respons();

  write_byte(date);//表示器件內部的數據

  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ù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>