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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式硬件通信接口協(xié)議-SPI(一)協(xié)議基礎(chǔ)

          嵌入式硬件通信接口協(xié)議-SPI(一)協(xié)議基礎(chǔ)

          作者: 時(shí)間:2019-03-08 來(lái)源:網(wǎng)絡(luò) 收藏

            本節(jié)繼續(xù)講硬件通信接口協(xié)議中的另外一個(gè)串行通信接口-。相比于UART串口協(xié)議,又有著其獨(dú)特之處。

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

            簡(jiǎn)介

            (全稱SerialPeripheral Interface),串行外設(shè)接口。

            SPI是串行外設(shè)接口(SerialPeripheral Interface)的縮寫。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,如今越來(lái)越多的芯片集成了這種通信協(xié)議,比如AT91RM9200。

            --from 百度百科

            該接口由摩托羅拉在20世紀(jì)80年代中期開發(fā),并已成為事實(shí)標(biāo)準(zhǔn)。

            --from Wiki

            從維基百科查閱的的“事實(shí)標(biāo)準(zhǔn)”,在這來(lái)科普一下知識(shí)盲點(diǎn):

            事實(shí)標(biāo)準(zhǔn)是指非由標(biāo)準(zhǔn)化組織制定的,而是由處于技術(shù)領(lǐng)先地位的企業(yè)、企業(yè)集團(tuán)制定(有的還需行業(yè)聯(lián)盟組織認(rèn)可,如DVD標(biāo)準(zhǔn)需經(jīng)DVD論壇認(rèn)可),由市場(chǎng)實(shí)際接納的技術(shù)標(biāo)準(zhǔn)。

            --from 百度百科

            SPI接口定義了一主多從這樣的一個(gè)通信架構(gòu),在同一SPI總線上只有一個(gè)主機(jī),可以有多個(gè)從機(jī)。這樣的架構(gòu)就限制了通信的主動(dòng)權(quán)只能在主機(jī)端,主機(jī)發(fā)起一次通信,從機(jī)做出想要。

            信號(hào)線

            SPI被稱為四線串行總線,其信號(hào)線分別有:

            SCLK:串行時(shí)鐘(主機(jī)輸出)

            MOSI:主輸出從機(jī)輸入或主機(jī)輸出從機(jī)輸入(主機(jī)輸出的數(shù)據(jù))

            MISO:主輸入從輸出或主輸入從輸出(從輸出的數(shù)據(jù)輸出)

            SS:從機(jī)選擇(通常為低電平有效,主機(jī)輸出)

            信號(hào)線命名也是五花八門,以下的命名也是會(huì)遇見的:

            串口時(shí)鐘:

            SCLK:SCK

            主輸出--->從輸入(MOSI):

            SIMO,MTSR - 對(duì)應(yīng)主設(shè)備和從設(shè)備上的MOSI,相互連接

            SDI,DI,DIN,SI - 在從設(shè)備上; 連接到主設(shè)備上的MOSI,或連接到下面的連接

            SDO,DO,DOUT,SO - 在主設(shè)備上; 連接到從站上的MOSI,或連接到上面的連接

            主輸入<---從輸出(MISO):

            SOMI,MRST - 對(duì)應(yīng)主設(shè)備和從設(shè)備上的MISO,相互連接

            SDO,DO,DOUT,SO - 在從設(shè)備上; 連接到主設(shè)備上的MISO,或連接到下面的連接

            SDI,DI,DIN,SI - 主設(shè)備; 連接到奴隸上的MISO或上面的連接

            從機(jī)選擇:

            SS:S?S?,SSEL,CS,C?S?,CE,nSS,/ SS,SS#

            以上容易讓人混淆的名字是SDO、SDI、DOUT、DIN等,這些都需要看具體印在主設(shè)備還是從設(shè)備上單獨(dú)討論。但是一般的還是盡量寫清寫規(guī)范,這樣不容易產(chǎn)生歧義。

            SPI作為同步串行接口,可以認(rèn)為有兩個(gè)同步信號(hào),第一個(gè)是從機(jī)選擇SS信號(hào),告知被選中的從機(jī),準(zhǔn)備開始進(jìn)行SPI通信,第二個(gè)是同步時(shí)鐘信號(hào)SCLK,收發(fā)雙方進(jìn)行數(shù)據(jù)的交互時(shí),都是基于SCLK的跳變進(jìn)行逐bit輸出和采樣的。

            四根信號(hào)線并非全部都需要,根據(jù)工作模式,可以配置成兩線、三線。

            在STM32CubeMX工具的配置頁(yè)面,可以很清楚看到,配置不同的工作模式時(shí),對(duì)應(yīng)被使能的芯片管腳有何不同:

            


            


            


            對(duì)比發(fā)現(xiàn),全雙工的四線和三線的區(qū)別是從機(jī)選擇信號(hào)NSS。這種情況一般是因?yàn)镾PI總線上只有一主一從的通信架構(gòu),從機(jī)的NSS信號(hào)一直接低電平,不需要做從機(jī)選擇。

            信號(hào)時(shí)序

            四線SPI接口的時(shí)序一般的總是先拉低從機(jī)選擇信號(hào)線SS,然后輸出SCLK,帶著數(shù)據(jù)MOSI,此時(shí)MISO為高阻態(tài)。大致如下如:

            


            一般有SPI接口的器件,在Spec上都會(huì)有對(duì)應(yīng)的時(shí)序圖,這里分別截取SPI接口FLASH型號(hào)為GD25Q32C、SPI接口OLED型號(hào)為QG-2832TLBFG04,這兩器件的Spec內(nèi)關(guān)于SPI時(shí)序部分的介紹,如下兩張截圖:

            


            


            對(duì)比不難發(fā)現(xiàn),時(shí)序圖的規(guī)范,定義了各個(gè)信號(hào)線輸出電平的順序和時(shí)延,還定義了時(shí)鐘信號(hào)跳變沿與數(shù)據(jù)信號(hào)的“對(duì)齊”,這里的“對(duì)齊”實(shí)際上就是數(shù)據(jù)的輸出和采樣。

            同樣的,這個(gè)時(shí)序規(guī)范了SPI器件所呈現(xiàn)的SPI接口信號(hào)線特性,包括:時(shí)鐘上升、下降沿時(shí)長(zhǎng);片選與時(shí)鐘跳變沿之間的時(shí)延;時(shí)鐘邊緣與數(shù)據(jù)線保持的時(shí)長(zhǎng)…

            這些時(shí)序特性,都在明確了SPI主機(jī)與其通信時(shí),要求不超出其定義的范圍,否則從機(jī)器件響應(yīng)不及時(shí)而導(dǎo)致通信異常。

            不同的器件,對(duì)SPI接口的信號(hào)時(shí)序要求也會(huì)不同。第一張簡(jiǎn)明的時(shí)序圖,而基于這樣的時(shí)序圖,SPI接口又可以配置不同的接口配置參數(shù)。

            接口配置項(xiàng)

            一般在開發(fā)時(shí),接口的可選配置有:接口模式(實(shí)際配置的是單、雙工模式選擇)、設(shè)備主從模式、數(shù)據(jù)寬度、時(shí)鐘極性(CPOL:)、時(shí)鐘相位(CPHA)、時(shí)鐘速率、數(shù)據(jù)bit位大小端選擇。

            接口模式

            標(biāo)準(zhǔn)的四線SPI接口,使用的場(chǎng)景是主從機(jī)進(jìn)行數(shù)據(jù)交互的通信,兩方都有數(shù)據(jù)的收發(fā)過(guò)程,而在LCD/OLED這樣的SPI接口作為從設(shè)備的器件中,就不需要數(shù)據(jù)返回給主機(jī),只需要接收來(lái)自主機(jī)的控制信息和顯示的數(shù)據(jù)。

            基于這樣的使用場(chǎng)景,就可以配置成三線的單工通信,即僅需要從機(jī)選擇SS、時(shí)鐘SCLK、數(shù)據(jù)輸出MOSI即可。

            設(shè)備主從模式

            這個(gè)配置一般需要看芯片是否支持,可將芯片配置成SPI主機(jī)或者從機(jī),能更好地集成在項(xiàng)目的系統(tǒng)中。

            數(shù)據(jù)寬度

            顧名思義,就是發(fā)送數(shù)據(jù)可以配置成8bit、16bit等,這也是根據(jù)芯片而定。

            時(shí)鐘極性、時(shí)鐘相位

            這兩者分別是CPOL(Clock Polarity)、CPHA(Clock Phase),極性就是指高低電平,這個(gè)定義了SPI總線在空閑狀態(tài)下,時(shí)鐘保持高電平還是低電平,因?yàn)檫@個(gè)關(guān)系到了SPI通信時(shí)第一個(gè)時(shí)鐘跳變沿是上升還是下降沿;相位指的是時(shí)鐘的跳變沿,指定了數(shù)據(jù)信號(hào)的輸出和采樣如何與時(shí)鐘對(duì)齊。

            這兩個(gè)配置,在Wiki和百度百科上都做了非常清晰的解釋,這里截圖引用如下:

            


            


            時(shí)鐘速率

            速率選擇定義了時(shí)鐘信號(hào)線在數(shù)據(jù)傳輸是的翻轉(zhuǎn)速率,這體現(xiàn)到每個(gè)芯片定義的接口時(shí)序圖中,即可承受的速率范圍,如果主機(jī)設(shè)的速率太快,而從機(jī)響應(yīng)過(guò)慢會(huì)導(dǎo)致通信失敗。

            數(shù)據(jù)bit位大小端選擇

            數(shù)據(jù)的發(fā)送優(yōu)先bit可配置,從上篇的UART協(xié)議可以知道,UART規(guī)定了數(shù)據(jù)優(yōu)先發(fā)bit0,而這個(gè)SPI是可配置優(yōu)先發(fā)送bit的,可設(shè)置最低位或者最高位。

            從FLASH型號(hào)為GD25Q32和OLED型號(hào)為QG-2832TLBFG04的時(shí)序截圖可看到,這兩個(gè)器件都是優(yōu)先發(fā)MSB,也就是最高位優(yōu)先。

            再對(duì)比一款字庫(kù)芯片型號(hào)為GT21L16S2W的讀取指令:

            


            可見SPI器件普遍采用MSB的發(fā)送優(yōu)先順序。

            總結(jié)SPI通信接口,一主多從的通信架構(gòu),標(biāo)準(zhǔn)模式有四根信號(hào)線、依靠選擇信號(hào)SS開始通信、時(shí)鐘信號(hào)SCLK進(jìn)行逐bit輸出和采樣、可配置的采樣時(shí)刻和可選擇的優(yōu)先發(fā)出bit。



          關(guān)鍵詞: 嵌入式 SPI

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