<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于I2C的總結(jié)

          關(guān)于I2C的總結(jié)

          作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
          這兩天在看I2C,為了加深印象,把我遇到的一些問題寫出來吧。

          本文引用地址:http://www.ex-cimer.com/article/201611/322145.htm

          1——————

          最先遇到的問題是AT24C02的操作時序,AT24C02內(nèi)部有一個指針,指向儲存空間的某一個字節(jié),另外AT24C系列支持頁操作,對于AT24C02一個頁是8字節(jié),也就是說地址的高5位是頁地址,在同一次寫入中,頁地址不變,低3位地址一次增加,當增加到7之后再加1就變成0了,而由于頁地址不變,相當于指針回到了頁首,如果繼續(xù)寫那前面的內(nèi)容會被覆蓋。寫數(shù)據(jù)的時序,先是I2C的開始信號,發(fā)送設(shè)備地址,之后寫入希望寫入的數(shù)據(jù)地址,然后依次寫入數(shù)據(jù)。當然,可以只寫一個字節(jié)的數(shù)據(jù)。

          對于讀取,是不存在頁的概念的,時序是先發(fā)送啟動信號,然后發(fā)送設(shè)備地址(注意,是寫設(shè)備的時候的地址,也就是說最低位是1),接著發(fā)送數(shù)據(jù)地址,完了之后重新發(fā)送一次啟動信號,接著就可以讀取了,讀取完一個字節(jié)的數(shù)據(jù)后要發(fā)送一個ACK,對于最后一個字節(jié)的數(shù)據(jù)要發(fā)送一個NACK來告訴AT24C數(shù)據(jù)已經(jīng)接收完畢,之后發(fā)送結(jié)束信號斷開連接即可。也可以只接收一個數(shù)據(jù),這時候一個ACK都沒有,第一次接收好直接發(fā)送一個NACK。

          24C02的內(nèi)部有連續(xù)的子地址空間,對這些空間進行n個字節(jié)的連續(xù)讀/寫時,都具有地址自動加1功能。只要設(shè)定好要讀/寫的器件內(nèi)起始子地址及字節(jié)數(shù),就能完成整個操作。
          注意:對于24C02連續(xù)寫的字節(jié)數(shù)不應(yīng)超過頁容量8,一次連續(xù)寫所形成的總線傳送結(jié)束后(主機發(fā)出停止信號后),24C02執(zhí)行內(nèi)部擦寫過程,大約需要10ms左右,24C02不再應(yīng)答主器件的任何請求。
          24C02內(nèi)有一個8位的地址計數(shù)器,連續(xù)讀操作時,24C02每次輸出一個數(shù)據(jù)字節(jié)后,地址計數(shù)器自動加1,當?shù)刂酚嫈?shù)器加到255,并輸出一個字節(jié)數(shù)據(jù)后,地址計數(shù)器將翻轉(zhuǎn)到0,并繼續(xù)輸出數(shù)據(jù)字節(jié),這樣整個存儲區(qū)域可以在一個讀操作內(nèi)全部讀完。

          #define SLAW 0xA0
          uchar delay(uchar j)
          { uchar k,l;
          for(l=0;l<=j;l++)
          for(k=0;k<=250;k++);
          return 0;
          }
          void main()
          {
          uchar sbuf[5]={0x00,0x12,0x55,0x30,0x12};
          uchar rbuf[5];
          I2C_SendStr(SLAW,0x10,tbuf,0x5);

          delay(100);
          I2C_RcvStr(SLAW,0x10,rbuf,0x5);

          while(1);
          }
          }

          2——————

          在次我只發(fā)表對I2C確認信號的看法,至于它的一整套時序就不多羅嗦了。

          1)MASTER向SLAVE發(fā)送數(shù)據(jù):
          MASTER沒向SLAVE端發(fā)送8位數(shù)據(jù)后,就會將SDA置1,等待SLAVE端的確認;SLAVE端如果正確接受到數(shù)據(jù),就會自動將SDA置0。我們程序員所能做的只能是檢測確認信號,即每發(fā)送完8位數(shù)據(jù)后就檢測一次SDA的狀態(tài),如果是0,則讓程序繼續(xù)往下執(zhí)行,如果是1則強迫MASTER將剛才的8位數(shù)據(jù)再發(fā)送一遍;當然,如果SDA一直是1,也就是SLAVE一直未能正確接受到數(shù)據(jù),我們也不能一直讓MASTER反復發(fā)送,要做TIMEOUT處理,以防系統(tǒng)死機!

          2) MASTER從SLAVE讀取數(shù)據(jù):
          MASTER從SLAVE端讀取數(shù)據(jù),情況與發(fā)送數(shù)據(jù)有所區(qū)別,在讀到最后8位數(shù)據(jù)時,要將SDA置1,也就是做UNACK動作,讓系統(tǒng)知道讀取數(shù)據(jù)到此結(jié)束;這個置1動作由程序員來做,而不是MASTER本身,因為數(shù)據(jù)讀到哪里結(jié)束,只有我們程序員知道!

          3) 說明:MASTER 指主控制端,在一般系統(tǒng)中就是我們常說的單片機了;SLAVE是指具備I2C協(xié)議的專用IC,比如ATMEL的24系列(24C16、14C32等)和PHILPS的SAA711X系列(VIDEO DECODER)。



          關(guān)鍵詞: I2C總線信號時序總

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();