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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Linux系統(tǒng)的多種串行總線統(tǒng)一接口的實(shí)現(xiàn)

          基于Linux系統(tǒng)的多種串行總線統(tǒng)一接口的實(shí)現(xiàn)

          作者: 時(shí)間:2012-08-10 來源:網(wǎng)絡(luò) 收藏

          摘要:字符設(shè)備操作和各類的共性,按照分層的思想,抽象出各種。的應(yīng)用層API與底層的具體操作形式無關(guān),而且便于應(yīng)用的升級和移植。文中給出了一種總線接口的方法,并以ARM9為平臺,以I2C、1-Wire、SPI為例,驗(yàn)證了新方法的可行性。
          關(guān)鍵詞:統(tǒng)一接口;嵌入式;設(shè)備驅(qū)動;總線

          0 引言
          內(nèi)核中單獨(dú)TTY、I2C、SPI、ISA、USB等總線驅(qū)動時(shí),每一種總線的都有各自的特點(diǎn),如參數(shù)設(shè)置不同,實(shí)現(xiàn)的結(jié)構(gòu)不同等。以TTY、I2C為例,TTY采用的是線路規(guī)程的三層結(jié)構(gòu),而I2C則是用戶句柄和適配器的三層結(jié)構(gòu)。當(dāng)然,這些驅(qū)動都是功能齊全而強(qiáng)大的,但對于并不復(fù)雜的應(yīng)用而言,這樣的控制是比較繁瑣的,而且,對于移植也是不利的。例如,某個(gè)應(yīng)用原先使用一款I(lǐng)2C接口的時(shí)鐘芯片,但后來系統(tǒng)升級換成了一款SPI接口的時(shí)鐘芯片,這時(shí)就不得不對程序做較大的改動了。本文給出了一種串行總線統(tǒng)一接口的實(shí)現(xiàn)方法,并以ARM9為平臺,以I2C、1-Wire、SPI為例驗(yàn)證了方法的可行性。

          1 總線協(xié)議及其工作過程
          多數(shù)的串行總線都基于主從結(jié)構(gòu),如果總線中包含了時(shí)鐘信號線,那么,該時(shí)鐘信號就由主機(jī)提供,而如果還包含了片選信號,通常也由主機(jī)來控制。也就是說,主機(jī)發(fā)起通信,從機(jī)處于被動狀態(tài),所以,對于總線時(shí)序的分析,只需討論主控制器端的時(shí)序,而從設(shè)備的時(shí)序就是它的逆向過程。
          1.1 SPI協(xié)議及其工作過程
          SPI總線是摩托羅拉公司提出的一種串行總線協(xié)議,該總線由4根基本的信號線組成,分別是CS、SI、SO、SCK。其中SCK是串行總線時(shí)鐘,由主設(shè)備提供;而SI、SO分別對應(yīng)于數(shù)據(jù)輸入和數(shù)據(jù)輸出信號。在一主多從的系統(tǒng)中,片選信號決定當(dāng)前有效的從設(shè)備。
          SPI總線的工作過程是:首先,主機(jī)發(fā)起通信,通過片選信號激活從設(shè)備;然后,主機(jī)在串行時(shí)鐘SCK信號的同步下,將地址、命令、數(shù)據(jù)信息從串行數(shù)據(jù)輸出信號(相對主機(jī)而言)SI送出;而從設(shè)備則在SCK信號的同步下接收主機(jī)發(fā)送來的數(shù)據(jù),并作出相應(yīng)反應(yīng),最后將結(jié)果從數(shù)據(jù)輸入信號(相對主機(jī)而言)SO送出。
          S3C2440中對SPI總線的控制,就是集中于對rSPCONn、rSPSTAn、rSPPINn、rSPPREn、rSPTDATn和rSPRDATn的控制。其中rSPCONn用于DMA設(shè)置、工作模式選擇、時(shí)鐘相位選擇,rSPSTAn用于控制器狀態(tài)查詢,rSPPINn用于多主機(jī)下出錯(cuò)檢測和片選釋放,rSPPREn用于控制預(yù)分頻狀態(tài)寄存器,rSPTDATn是數(shù)據(jù)發(fā)送寄存器,rSPRDATn是數(shù)據(jù)接收寄存器。
          1.2 I2C協(xié)議及其工作過程
          I2C總線是由飛利浦公司提出的一種接口標(biāo)準(zhǔn),該總線由SDA、SCL兩根信號線組成。其中SCL為時(shí)鐘信號,由主機(jī)提供,最大傳輸速率為400kb/s;而SDA為數(shù)據(jù)信號。連接到總線上的每一個(gè)設(shè)備都有一個(gè)唯一的地址,通過這個(gè)地址使得主機(jī)能夠找到目標(biāo)從機(jī)并與之進(jìn)行通信。
          以主機(jī)發(fā)送為例,I2C總線的工作過程是:首先,主機(jī)控制時(shí)鐘信號SCL為高電平時(shí),數(shù)據(jù)信號SDA產(chǎn)生一個(gè)下降沿,作為起始條件。然后,主機(jī)發(fā)出7位的從設(shè)備地址和1位R/W標(biāo)志,并激活將要與之通信的從設(shè)備,而從設(shè)備則會產(chǎn)生一個(gè)應(yīng)答信號。對于寫數(shù)據(jù),主機(jī)緊接著就將一個(gè)字符或一串?dāng)?shù)據(jù)寫入到從設(shè)備;而對于讀數(shù)據(jù),則緊接著讀取從設(shè)備輸出的數(shù)據(jù)。
          I2C總線中的S3C2440對I2C的控制主要集中于對rIICCON、rIICSTAT、rIICADD和rIICDS的控制。其中rIICCON用于時(shí)鐘源選擇、中斷控制和I2C控制器使能,rIICSTAT用于工作模式選擇、控制器狀態(tài)查詢,rIICADD是從設(shè)備地址(當(dāng)S3C2440設(shè)置為從設(shè)備模式時(shí)使用),rIICDS是發(fā)送接收移位寄存器。
          1.3 1-Wire協(xié)議及其工作過程
          1-Wire總線是Maxim全資子公司Dallas提出的一種總線接口。1-Wire總線與其他的串行總線有比較大的區(qū)別:普通的串行總線通常由兩根或兩根以上的信號線組成;而1-Wire總線僅有一根信號線,同時(shí)用于時(shí)鐘、數(shù)據(jù)、命令的傳輸,具有資源利用率高、結(jié)構(gòu)簡單、成本低廉、易于總線擴(kuò)展等優(yōu)點(diǎn)。
          1-Wire總線工作過程:1-Wire總線包含復(fù)位、讀、寫三種基本時(shí)序。在復(fù)位狀態(tài)下,主機(jī)將總線拉低480~960 μs后釋放總線,由于上拉電阻的作用,此時(shí)的電平為高,等待15~60 μs之后,從設(shè)備將總線拉低表示復(fù)位成功。寫操作時(shí),若寫入數(shù)據(jù)位為0,則主機(jī)將總線拉低60μs后釋放;若寫入數(shù)據(jù)位為1,則主機(jī)將總線拉低1~15 μs后釋放。由于很少有控制器集成了1-Wire總線控制器,所以,一般使用GPIO模擬的方式,這時(shí),對于時(shí)序的控制就要求得比較精確。

          2 Linux下的統(tǒng)一驅(qū)動
          這些總線有一些共性,也就是驅(qū)動要實(shí)現(xiàn)的內(nèi)容,主要包括單字節(jié)數(shù)據(jù)收發(fā)、數(shù)據(jù)流收發(fā)以及工作模式控制等。在這些共性的基礎(chǔ)上,一般都需要向上層提供一個(gè)統(tǒng)一的接口,以使得對使用這些API的應(yīng)用程序而言(下層總線無論是RS-232、SPI、I2C,還是1-Wire)都不需要做任何改變。同時(shí),還要對下層也提供一個(gè)通用接口,使得不同的總線都能與上層統(tǒng)一接口協(xié)調(diào)通信。該驅(qū)動的結(jié)構(gòu)框架如圖1所示。

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

          d.JPG


          本文主要討論的是總線驅(qū)動部分,而應(yīng)用層和物理層在測試的時(shí)候,也可用兩個(gè)簡單的例子來驗(yàn)證設(shè)計(jì)結(jié)果。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 4 下一頁

          評論


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