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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于多通道緩沖串口的虛擬I2C總線

          基于多通道緩沖串口的虛擬I2C總線

          作者:■ 重慶大學(xué)通信工程學(xué)院 張玲 唐仁圣 何偉 時間:2004-10-22 來源:電子設(shè)計應(yīng)用2004年第9期 收藏

          電子設(shè)計應(yīng)用2004年第9期

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

          摘    要:本文提出一種用多通道緩沖串口()完成總線的虛擬方法,該方法簡單可行、硬件成本低,并給出了該方法在智能交通控制系統(tǒng)()中的應(yīng)用。
          關(guān)鍵詞:;

          引言
          很多器件都具有總線,如串行EPROM、ADC等。另外,也已有很多外圍器件支持與I2C總線的接口,但不直接支持I2C總線,如多數(shù)MCU、DSP等,因而采用I/O口線虛擬I2C的方式成為一種通用解決方案。但大多數(shù)DSP器件直接支持的I/O口線較少,不能進(jìn)行直接的位操作,所以如何用DSP進(jìn)行I2C總線的虛擬是本文所要討論的問題。通過使用高端DSP器件中都具有的成功地進(jìn)行了虛擬I2C總線的實現(xiàn),并在一個系統(tǒng)的控制模塊中得到應(yīng)用。

          I2C總線的數(shù)據(jù)傳送規(guī)范
          I2C總線由串行數(shù)據(jù)線(SDA)和串行時鐘線(SCL)組成。通信時,所有具備I2C總線接口的器件都連接到這兩根線上,而且既可以發(fā)送數(shù)據(jù)也可以接收數(shù)據(jù),但任意時刻只能有一個主控器件進(jìn)行I2C總線的控制,其他器件都為被控器件,它們分時占用總線。
          I2C總線的數(shù)據(jù)傳送由主器件控制。首先由主器件發(fā)出開始信號S,表示開始啟動數(shù)據(jù)傳輸。當(dāng)SCL為高電平時,如果出現(xiàn)SDA的電平由高變低則視為S信號,然后主器件發(fā)送從器件的7位地址和讀寫位R/W,接著主器件將接收從器件的應(yīng)答信號,如果收到正確的ACK,則進(jìn)行數(shù)據(jù)的傳送。數(shù)據(jù)傳送的方向由讀寫位R/W的值確定 ,而且數(shù)據(jù)傳送為8位,高位在前,低位在后。不管是發(fā)送數(shù)據(jù)還是接收數(shù)據(jù),在傳送完8位數(shù)據(jù)后,必須由接收數(shù)據(jù)的器件在SDA上發(fā)一個應(yīng)答信號。最后當(dāng)全部數(shù)據(jù)傳送完后,由主器件產(chǎn)生停止信號P,表示總線傳送結(jié)束。SCL線為高,SDA線由低電平變高電平時,視為停止信號P。由上可知,I2C總線數(shù)據(jù)傳輸采用了應(yīng)答式的工作方式:即發(fā)送方發(fā)送數(shù)據(jù)后由接收方發(fā)送是否正確接收的應(yīng)答信號,發(fā)送方以此作為是否繼續(xù)進(jìn)行數(shù)據(jù)傳送的判斷依據(jù)。

          圖1 主器件數(shù)據(jù)發(fā)送流程

          用McBSP虛擬I2C總線的實現(xiàn)
          從前面的分析可以看出,I2C總線的數(shù)據(jù)傳輸主要是由主控器件控制,在SCL的控制下,按位傳送數(shù)據(jù),也就是說,要想完成對I2C總線的虛擬主要是完成主控器件I2C的實現(xiàn)。下面討論將TMS320C5410(以下簡稱5410)器件的McBSP配置為通用I/O口來虛擬I2C總線的實現(xiàn)方法。
          McBSP配置為通用I/O口
          作為主器件的I2C總線的兩條信號線中,SCL總是作為輸出,SDA根據(jù)需要配置成雙向的I/O口,考慮到虛擬總線的數(shù)據(jù)線方向,本文用McBSP的FSX和CLKX兩個信號線分別來虛擬I2C的SCL和SDA,其中FSX由于要作為SCL輸出引腳,配置為GPO,CLKX模擬SDA信號線,由于SDA信號線為雙向數(shù)據(jù)線,所以將CLKX配置為GPIO。McBSP配置為通用I/O口,主要涉及到McBSP的控制寄存器SPCR1、SPCR2和引腳控制寄存器PCR的設(shè)置。 PCR控制寄存器主要涉及到通用I/O口的方向控制,輸入/輸出的讀寫等,其中所涉及到的控制位如下:CLKXM、FSXM控制CLKX和FSX的通用I/O口的方向。由于FSX總是作為輸出,所以FSXM=1;CLKX的方向設(shè)置,當(dāng)作為虛擬SDA的輸出時,CLKXM=1,反之CLKXM=0;CLKXP、FSXP控制通用I/O的輸入/輸出電平值,當(dāng)要往輸出I/O口送值時,它們作為輸出位寄存器,直接將要輸出的電平值寫入對應(yīng)的位中。當(dāng)作為輸入I/O時,CLXP和FSXP里的值就反映了輸入引腳當(dāng)前的電平狀態(tài)。

          圖2 啟動信號S的時序要求

          圖3  虛擬I2C總線應(yīng)用實例圖


          McBSP虛擬I2C總線的軟件模塊實現(xiàn)
          首先將McBSP配置為通用I/O口使用,必須禁用其緩沖串口的功能、開啟通用I/O使能,所以將SPCR2控制寄存器中的XRST置0,將PCR控制寄存器中的XIOEN置1。
          要實現(xiàn)I2C總線的數(shù)據(jù)傳輸,以主器件向從器件發(fā)送N字節(jié)數(shù)據(jù)為例,其通信流程如圖1所示, 一般需要包括以下幾個子程序模塊:
          a. 啟動位S和停止位P的發(fā)送
          b. 從器件應(yīng)答位ACK的判斷
          c. 字節(jié)數(shù)據(jù)(或地址)的發(fā)送
          下面給出啟動位S發(fā)送子模塊的部分程序源碼,其它子程序模塊可以參照此程序修改。
          啟動位S發(fā)送子程序:
          STM MCBSP_PCR_SUB_ ADDR,MCBSP0_SPSA
          ; 選擇PCR寄存器
                   LD #2a00h,A
          STLM A,MCBSP0_SPSD
          ; 設(shè)置CLKX為輸出口
                   CALL XDELAY
                   LD #2a00h,A
                   ST #0002H,*AR3
                   OR *AR3,A            
                   STLM A,MCBSP0_SPSD  
          ; 置PCR中的CLKP位為1,引腳CLKX-SDA為高電平
                   ST #0008H,*AR3
                   LD #2a00h,A
                   OR *AR3,A             
                   STLM A,MCBSP0_SPSD    
          ; 置PCR中的FSXP位為1,引腳FSX-SCLK為高電平
                   call delay_prg1       
          ;延時子程序delay_prg1
                   ST #0FFFDH,*AR3
                   AND *AR3,A
                   STLM A,MCBSP0_SPSD
          ; 置PCR中的CLKP位為0,引腳CLKX-SDA為低電平
                   call delay_prg2       
          ;延時子程序delay_prg2
                   ST #0FFF7H,*AR3
                   AND *AR3,A           
                   STLM A,MCBSP0_SPSD    
          ; 置PCR中的FSXP位為1,引腳FSX-SCLK為高電平
                   RET
          需要注意的是,I2C總線協(xié)議對信號的時序要求有嚴(yán)格的規(guī)定,如對啟動信號S的時序要求如圖2所示。即要求SDA信號在由高電平向低電平跳變時保持高電平時間至少為4.7ms,SCL信號在SDA信號由高電平向低電平跳變后必須保持高電平時間至少為4.0ms。啟動位S發(fā)送子模塊的源代碼中的延時子程序delay_prg1、delay_prg2就是為了滿足對啟動位S的時序要求。假設(shè)DSP器件的內(nèi)部時鐘頻率為100MHz,則其單指令周期為0.01ms,就可以根據(jù)延時時序參數(shù)的要求計算出所需要的指令周期數(shù)。顯然子程序delay_prg1至少需要470個指令周期,delay_prg2則至少需要400個指令周期。

          應(yīng)用實例
          在智能交通控制系統(tǒng)中用5410的0號緩沖串口實現(xiàn)了虛擬I2C總線,系統(tǒng)的硬件原理如圖3所示。系統(tǒng)由設(shè)置在某交通路口的攝像機(jī)提供交通視頻信號,由PHILIPS專用視頻采集芯片SAA7111完成圖像的實時采集,然后將8bit的圖像數(shù)據(jù)送至SRAM中緩存,并由DSP器件完成圖像處理算法,提取出相應(yīng)的交通參數(shù)。SAA7111完成圖像采集首先必需通過I2C總線接口進(jìn)行器件內(nèi)部一些控制寄存器的初始化設(shè)置,由于5410器件沒有專用的I2C總線接口,所以采用5410的McBSP0的FSX和CLKX引腳分別來虛擬I2C的SCL和SDA,實現(xiàn)了對SAA7111的初始化配置。
          SAA7111控制寄存器初始化配置的過程就是DSP主器件向SAA7111從器件中的控制寄存器寫配置數(shù)據(jù)的過程。SAA7111中涉及到的控制寄存器由00h~1Fh的寄存器基地址尋址,主器件發(fā)送配置數(shù)據(jù)的過程如表1所示。
          采用這種方式對00h~1Fh的寄存器尋址時,必須向SAA7111分別傳送這些地址字節(jié),這個過程是非常繁瑣的。I2C總線接口的外圍器件中,如出現(xiàn)這種器件內(nèi)部需要尋址多個地址空間時,總線數(shù)據(jù)的讀寫操作具有地址自動加一的功能,這樣就簡化了I2C總線的外部尋址,這種尋址方式下的主器件控制數(shù)據(jù)寫流程如表2所示。
            
          結(jié)語
          本文采用DSP的McBSP來虛擬I2C總線接口,先將McBSP配置為通用I/O口,再對這些通用I/O口進(jìn)行I2C總線數(shù)據(jù)傳輸?shù)奈徊僮?,解決了DSP器件無法方便地進(jìn)行位操作的問題,硬件接口簡單,調(diào)試方便,并且可以節(jié)省硬件的花費,此方法已經(jīng)應(yīng)用于ITS系統(tǒng)中,方法可行,并運行可靠,為相關(guān)問題的解決作出了成功的嘗試。■

          參考文獻(xiàn)
          1 The I2C-Bus Specification, Philips Semiconductors, Version 2.1 January 2000
          2 何立民, 周立功. I2C總線的串行擴(kuò)充技術(shù). 周立功單片機(jī),2000,9
          3 戴明楨,周建江. TMS32C54X DSP結(jié)構(gòu)原理及應(yīng)用. 北京航空航天出版社,2001,11
          4 TMS320C54X DSP Reference Set Volume5: Enhanced Peripherals, Texas Instruments, SPRU302:June 1999



          關(guān)鍵詞: I2C ITS McBSP

          評論


          相關(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); })();