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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > I2C之知(五)--I2C總線的10bit地址以及通用廣播地址

          I2C之知(五)--I2C總線的10bit地址以及通用廣播地址

          作者: 時間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
          其實,10bit地址我沒用過,通用廣播地址更沒用過.通用廣播地址應(yīng)該是在多個mcu之間用i2c進(jìn)行通信時使用的.雖說沒用到,但還是做了翻譯,說不定以后有機(jī)會用到:

          10bit地址
          10bit的尋址擴(kuò)展可能尋址的數(shù)目.有7bit地址和10bit地址的設(shè)備可以連接到相同的I2C總線上,而且7bit尋址和10bit尋址都可以用在所有的總線速度模式下.不過,10bit尋址用的不多.
          10bit的從機(jī)地址由開始條件(S)或重復(fù)開始條件(Sr)后的兩個字節(jié)組成.第一個字節(jié)的前7位是1111 0XX,XX是10bit地址的最高有效位的前兩位.第一個字節(jié)的第8bit是讀寫位,決定傳輸方向.
          盡管1111 XXX有8種可能的組合,然后只有1111 0XX這四種可以用于10bit尋址.剩下的1111 1XX這四種是為將來I2C擴(kuò)展用的.
          前面描述的用于7bit尋址的讀寫格式都適用于10bit尋址.詳情如下:
          1.主-發(fā)送器傳輸?shù)綇?接收器(10bit從機(jī)地址)

          從圖中看出傳輸方向不變.當(dāng)接收到開始條件后的10bit地址,從機(jī)就和它自己的地址比較從機(jī)地址的第一個字節(jié)(1111 0XX),并檢查第八個bit(讀寫位)是否為0.有可能多個設(shè)備都匹配并產(chǎn)生應(yīng)答(A1).接下來所有從機(jī)開始匹配自己地址與第二個字節(jié)的8個bit(XXXX XXXX),這時就只有一個從機(jī)匹配并產(chǎn)生應(yīng)答(A2).被主機(jī)尋址匹配的從機(jī)會保持被尋址的狀態(tài)直到接收到終止條件或者是重復(fù)開始條件后跟著一個不同的從機(jī)地址.
          2.主-接收器從從-發(fā)送器接收數(shù)據(jù)(10bit從地址)
          在第二個讀寫位之后傳輸方向就會改變.

          在第二個應(yīng)答A2之前,處理過程與上面的主-發(fā)送器尋址從-接收器一致.在重復(fù)開始條件(Sr)之后,匹配的從機(jī)會保持被尋址上的狀態(tài).這個從機(jī)會檢查Sr之后的第一個字節(jié)的前7bit是否正確,然后測試第8bit是否為1(讀).如果這也匹配的話,從機(jī)就認(rèn)定它被作為一個發(fā)送器被尋址到了并產(chǎn)生應(yīng)答A3.從-發(fā)送器會保持被尋址的狀態(tài)知道接收到終止條件(P)或者重復(fù)開始條件(Sr)跟著一個不同的從機(jī)地址.然后這個時候的重復(fù)開始條件下,所有的從機(jī)會比較它們的地址與11110XX比較并測試第八位(讀寫位).然而它們不會尋址到,因為對于10bit設(shè)備,讀寫位是1,或者對于7bit的設(shè)備,1111 0XX的從機(jī)地址不匹配.

          保留地址
          下表是保留的兩組地址的描述:

          [1]通用廣播地址是用來包括軟件復(fù)位的幾個功能
          [2]沒有設(shè)備可以應(yīng)答開始字節(jié)
          [3]CBUS地址是保留的,使得同一個系統(tǒng)可CBUS總線兼容的設(shè)備和I2C總線兼容的設(shè)備.I2C兼容的設(shè)備不允許響應(yīng)這個地址
          [4]為不同總線格式保留的

          通用廣播地址
          通用廣播地址是用來同時尋址所有連接到I2C總線上的設(shè)備.如果一個設(shè)備在廣播地址時不需要數(shù)據(jù),它可以不產(chǎn)生應(yīng)答來忽略.如果一個設(shè)備從通用廣播地址請求數(shù)據(jù),它可以應(yīng)答并當(dāng)作一個從-接收器.當(dāng)一個或多個設(shè)備響應(yīng)時主機(jī)并不知道有多少個設(shè)備應(yīng)答了.每一個可以處理這個數(shù)據(jù)的從-接收器可以響應(yīng)第二個字節(jié).從機(jī)不處理這些字節(jié)的話,可以響應(yīng)NA.如果一個或多個從機(jī)響應(yīng),主機(jī)就無法看到NA.通用廣播地址的含義一般在第二個字節(jié)中指明.

          有兩種情況需要考慮:
          1.最低有效位B是0
          2.最低有效位B是1
          當(dāng)B是0,第二個字節(jié)有如下的定義:
          1.0000 0110(06h):復(fù)位并通過硬件寫從機(jī)地址的可編程部分.在接收到這樣的2個字節(jié)時,所有可以響應(yīng)這個廣播地址的設(shè)備將復(fù)位并進(jìn)入地址的可編程部分.要采取預(yù)防措施來確保設(shè)備不會在加上電源電壓后將SDA或SCL拉低,因為這些低電平會阻塞總線.
          2.0000 0100(04h):通過硬件寫從機(jī)地址的可編程部分.行為同上,但設(shè)備不復(fù)位
          3.0000 0000(00h):這個不應(yīng)該作為第二個字節(jié)使用
          編程過程的順序參考相應(yīng)設(shè)備的datasheet




          軟件復(fù)位
          在通用廣播(0000 0000)之后發(fā)送0000 0010(06h)作為第二個字節(jié)會引起軟件復(fù)位.這個特性是可選的,不是所有的設(shè)備都會響應(yīng)這個命令.在接收到這樣的2個字節(jié)時,所有可以響應(yīng)這個廣播地址的設(shè)備將復(fù)位并進(jìn)入地址的可編程部分.要采取預(yù)防措施來確保設(shè)備不會在加上電源電壓后將SDA或SCL拉低,因為這些低電平會阻塞總線.

          開始字節(jié)
          微控制器有兩種方式連接到I2C總線上.有片上的硬件I2C總線接口的微控制器可以變成為只接收總線的中斷請求.當(dāng)設(shè)備沒有這樣的接口,它必須要通過軟件手段來檢測總線.很明顯,微控制器檢測的時間或者輪詢總線的時間越多,實現(xiàn)自己功能的時間就越少.
          因此快速硬件設(shè)備和依賴軟件輪詢的相對慢速微控制器是有速度差別的.
          在這種情況下,數(shù)據(jù)傳輸前有一個比正常時間長很多的起始過程.起始過程組成如下:
          一個開始條件(S)
          一個開始字節(jié)(0000 0001)
          應(yīng)答位(ACK)
          重復(fù)的開始條件(Sr)


          主機(jī)發(fā)送完開始條件后,發(fā)送開始字節(jié)(0000 0001).另外的微控制器可以以低采樣率來采樣SDA線知道開始字節(jié)的7個0中的一個被偵測到.在偵測到SDA線的低電平后,微控制器可以切換到更高的采樣率來探測用于同步的重復(fù)開始條件.
          在開始字節(jié)后一個應(yīng)答相關(guān)的時鐘脈沖產(chǎn)生.設(shè)備不允許應(yīng)答開始字節(jié).

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


          關(guān)鍵詞: I2CI2C總線通用廣播地

          評論


          技術(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); })();