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

          新聞中心

          EEPW首頁 > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 基于CPLD的I2C總線接口設(shè)計(jì)

          基于CPLD的I2C總線接口設(shè)計(jì)

          作者: 時(shí)間:2011-03-21 來源:網(wǎng)絡(luò) 收藏

          是兩線式串行,用于連接微控制器及其外圍設(shè)備。該具有如下特點(diǎn):1)只要求兩條總線線路,一條串行數(shù)據(jù)線(SDA),一條串行時(shí)鐘線(SDL);2)每個(gè)連接到總線的器件都可以通過唯一的地址尋址,總線中主機(jī)可以作為主機(jī)發(fā)送器或主機(jī)接收器;3)它是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或更多主機(jī)同時(shí)初始化數(shù)據(jù)傳輸可以通過沖突檢測(cè)和仲裁防止數(shù)據(jù)被破壞;4)雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100 kbit/s快速模式下可達(dá)400kbit/s高速模式下可達(dá)3.4 Mbit/s;5)片上的濾波器可以濾去總線數(shù)據(jù)線上的毛刺以保證數(shù)據(jù)完整;6)連接到相同總線的IC數(shù)量只受到總線的最大電容400 pF限制。總線最主要的優(yōu)點(diǎn)是其簡單性和有效性。由于總線為兩線式總線,它占用的空間非常小,減少了電路板的空間和芯片管腳的數(shù)量,降低了互聯(lián)成本。它支持多主控制(multimastering),總線中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主機(jī)。任何主機(jī)都能夠控制總線信號(hào)的傳輸和時(shí)鐘頻率。在任何時(shí)間點(diǎn)上只能有一個(gè)器件作為主機(jī),其他器件作為從機(jī)。正是由于I2C總線具有上述諸多優(yōu)點(diǎn),具備I2C接口的器件在儀器設(shè)計(jì)中已被廣泛采用,比較常見的如:日歷芯片、存儲(chǔ)芯片、模數(shù)轉(zhuǎn)換器以及數(shù)模轉(zhuǎn)換器等。
          不幸的是大多數(shù)CPU都擅長操作并口,而并不具備直接操作I2C總線接口的能力。在系統(tǒng)設(shè)計(jì)時(shí),為了與具有I2C總線接口的芯片連接,經(jīng)常采用的方法是:利用CPU的2條通用輸入輸出(GPIO)線作為I2C總線使用,用軟件模擬的方法,產(chǎn)生I2C總線需要的控制時(shí)序。該方法雖然可以達(dá)到同I2C器件連接的目的,卻不可避免地帶來軟件編制復(fù)雜、占用CPU處理時(shí)間多的弊端。為了在不增加編程難度、不大量占用CPU處理時(shí)間的前提下使不具備I2C總線的CPU也能夠充分享受I2C總線的優(yōu)點(diǎn),本文設(shè)計(jì)了一種基于的8位并行接口轉(zhuǎn)I2C總線接口的控制模塊,通過該模塊,具有并口的CPU可以通過對(duì)并口的讀寫完成對(duì)I2C總線的控制。

          1 I2C總線的基本時(shí)序
          I2C總線是由數(shù)據(jù)線SDA和時(shí)鐘線SCL構(gòu)成,靠它們?cè)谶B接于I2C總線的各個(gè)設(shè)備之間傳送信息。I2C總線在傳送數(shù)據(jù)過程中共有4種類型的信號(hào),分別是:開始信號(hào)、結(jié)束信號(hào)、應(yīng)答信號(hào)和數(shù)據(jù)傳輸信號(hào)。
          開始信號(hào):主機(jī)控制SDA信號(hào)線在SCL線的高電平期間發(fā)生由高電平到低電平的跳變,通知從機(jī)開始數(shù)據(jù)傳輸。
          結(jié)束信號(hào):主機(jī)控制SDA信號(hào)線在SCL線的高電平期間發(fā)生由低電平到高電平的跳變,通知從機(jī)本次數(shù)據(jù)傳輸結(jié)束。
          應(yīng)答信號(hào):接收數(shù)據(jù)的芯片(主機(jī)或者從機(jī))在完整接收到8位數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的芯片發(fā)出低電平信號(hào),通知發(fā)送的數(shù)據(jù)已被接收。發(fā)送數(shù)據(jù)的芯片應(yīng)根據(jù)應(yīng)答信號(hào)的電平高低判斷數(shù)據(jù)是否被接收芯片接收。
          數(shù)據(jù)傳輸信號(hào):發(fā)送數(shù)據(jù)的芯片在SCL脈沖控制下在SDA上串行輸出數(shù)據(jù)信號(hào),SDA只能在SCL為低電平期間改變狀態(tài),在SCL為高電平期間應(yīng)保持穩(wěn)定。
          I2C總線上的數(shù)據(jù)傳輸主要有4種模式,分別是:字節(jié)寫、頁面寫、當(dāng)前地址讀、隨機(jī)地址讀和順序讀。
          字節(jié)寫:對(duì)給定的芯片的確定地址單元寫入一個(gè)字節(jié)的數(shù)據(jù)。
          頁面寫:對(duì)給定的芯片的確定地址單元所在頁面連續(xù)寫入全部的數(shù)據(jù)。
          當(dāng)前地址讀:讀出當(dāng)前地址單元中的一個(gè)字節(jié)數(shù)據(jù)。
          隨機(jī)地址讀:從給定的芯片的確定地址單元中讀出一個(gè)字節(jié)數(shù)據(jù)。
          順序讀:從給定的地址后連續(xù)讀出n個(gè)字節(jié)的數(shù)據(jù)。
          I2C總線各種信號(hào)及數(shù)據(jù)傳輸模式示意圖如圖1所示。

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


          利用設(shè)計(jì)一種模塊,如果能夠?qū)PU發(fā)出的并行數(shù)據(jù)按上述I2C總線數(shù)據(jù)傳輸模式自動(dòng)轉(zhuǎn)換成串行數(shù)據(jù)輸出,同時(shí)將接收到的I2C總線串行數(shù)據(jù)自動(dòng)轉(zhuǎn)換成并行數(shù)據(jù)供CPU讀取,則不具備I2C總線接口的CPU也能通過對(duì)并口的操作輕松實(shí)現(xiàn)與I2C總線連接并同其他具備I2C總線接口的芯片交換數(shù)據(jù)。為此本文設(shè)計(jì)了一種基于的工作于I2C總線主機(jī)模式的并口轉(zhuǎn)I2C總線模塊。利用該模塊CPU可以很容易地實(shí)現(xiàn)與I2C總線的接口。

          2 I2C總線接口模塊的CPLD實(shí)現(xiàn)
          上面簡要介紹了I2C總線的信號(hào)以及I2C總線的數(shù)據(jù)傳輸模式,如果要使接口模塊正常工作,CPU必須首先要通知模塊執(zhí)行什么操作,而后再把需要的數(shù)據(jù)依次送入模塊中,考慮到I2C總線的速率可以在0~3.4 Mbit/s之間,為了適應(yīng)不同外設(shè)的需要,模塊還應(yīng)在CPU的控制下自由調(diào)整數(shù)據(jù)傳送速率。因此,CPU應(yīng)能夠向模塊發(fā)送數(shù)據(jù)傳送速率控制數(shù)據(jù)、I2C總線工作模式控制數(shù)據(jù)、信息交換數(shù)據(jù),同時(shí)還能從模塊
          中讀取工作狀態(tài)數(shù)據(jù)、模塊接收數(shù)據(jù)。據(jù)此設(shè)計(jì)出基于CPLD的I2C總線接口模塊如圖2所示。


          上一頁 1 2 3 4 下一頁

          關(guān)鍵詞: CPLD I2C 總線 接口設(shè)計(jì)

          評(píng)論


          相關(guān)推薦

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