SPI總線協議

一、概述

        SPI(Serial Peripheral Interface,串行外圍設備接口),是Motorola公司提出的一種同步串行接口技術,是一種高速、全雙工、同步通信總線,在芯片中只佔用四根管腳用來控制及數據傳輸,節約了芯片pin的數目,同時爲PCB在佈局上節省了空間。正是由於這種簡單易用的特性,現在越來越多的芯片上都集成了SPI技術。
SPI主要用於EEPROM、Flash、RTC(實時時鐘)、ADC(數模轉換器)、DSP(數字信號處理器)以及數字信號解碼器上。目前應用中的數據速率可達幾Mbps。

二、特點

1、採用主從模式(Master-Slave)的控制方式,支持單Master多Slave
        SPI規定了兩個SPI設備之間通信必須由主設備Master來控制從設備Slave。一個Master可以通過提供clock以及對Slave進行片選(Slave Select)來控制多個Slave。SPI協議還規定Slave設備的clock由Master通過SCK管腳提供給Slave,Slave本身不能產生或控制clock,沒有clock則Slave不能正常工作。
2、採用同步方式(Synchronous)傳輸數據
        Master會根據將要交換的數據產生相應的時鐘脈衝,組成時鐘信號,時鐘信號通過時鐘極性(CPOL)和時鐘相位(CPHA)控制兩個SPI設備何時交換數據以及何時對接收數據進行採樣,保證數據在兩個設備之間是同步傳輸的。
3、數據交換
        SPI設備間的數據傳輸被稱爲數據交換,因爲SPI協議規定一個SPI設備不能在數據通信過程中僅僅充當一個發送者(Transmitter)或者接受者(Receiver)。在每個clock週期內,SPI設備都會發送並接收1 bit數據,相當於有1 bit數據被交換了。數據傳輸高位在前,低位在後(MSB first)。
在數據傳輸過程中,每次接收到的數據必須在下一次數據傳輸之前被採樣,如果之前接收到的數據沒有被讀取,那麼這些已經接收完成的數據將有可能被丟棄,導致SPI物理模塊最終失效。因此在程序中一般都會在SPI傳輸完數據後,讀取SPI設備裏的數據,即使這些數據在程序裏是無效的。

三、數據傳輸


        SPI是一個環形總線結構,由SS (CS)、SCK、SDI、SDO構成,時序很簡單,在SCK的控制下,兩個雙向移位寄存器進行數據交換。寄存器中的內容全部移出時,相當於完成了兩個寄存器內容的交換。SSPSR控制數據移入移出SSPBUF,controller確定SPI總線的通信模式。
SSPBUF:Synchronous Serial Port Buffer,泛指SPI設備裏面的內部緩衝區,一般在物理上是以FIFO的形式,保存傳輸過程中的臨時數據;
SSPSR:Synchronous Serial Port Shift Register,泛指SPI設備裏面的移位寄存器,根據設置好的數據位寬把數據移入或移出SSPBUF;
Controller:泛指SPI設備裏面的控制寄存器,通過配置寄存器來設置SPI總線的傳輸模式。
通常情況下,只需要對四個pin進行編程即可控制SPI設備之間的數據通信:
SCK(Serial Clock):主要作用是Master向Slave傳輸時鐘信號,控制數據交換的時機和速率;
SS/CS(Slave Select/Chip Select):用於Master片選Slave,使被選中的Slave能夠被Master訪問;
SDO/MOSI(Serial Data Output/Master Out Slave In):在Master上也被稱爲Tx-channel,作爲數據的出口,主要用於SPI設備發送數據;
SDI/MISO(Serial Data Input/Master In Slave Out):在Master上也被稱爲Rx-channel,作爲數據的入口,主要用於SPI設備接收數據。

四、傳輸時序

        SPI接口有四種不同的數據傳輸時序,取決於時鐘極性(CPOL)和時鐘相位(CPHA)的組合。時鐘相位設置讀取數據和發送數據的時鐘沿。主機和從機發送數據是同時完成的,接收數據也是同時完成的。
時鐘極性CPOL:SPI在空閒時,時鐘信號是高電平還是低電平,即SCLK發送8 bit數據之前和之後的狀態。CPOL=0,空閒電平爲低電平,CPOL=1,空閒電平爲高電平。
時鐘相位CPHA:數據採樣在時鐘的第幾個邊沿。CPHA=0,在每個週期的第一個時鐘沿採樣,CPHA=1,在每個週期的第二個時鐘沿採樣。


        Bit1爲MSB,Bit8爲LSB。假設CPOL=0,CPHA=0。在SCK的第一個時鐘週期,在時鐘的前沿採樣數據(上升沿),在時鐘的後沿輸出數據。先看主器件,主器件的輸出口(MOSI)輸出數據bit1,在時鐘的前沿被從器件採樣,那主器件是何時輸出bit1的呢?bit1的輸出時刻實際上在SCK信號有效以前,比SCK的上升沿還要早半個時鐘週期,bit1的輸出時刻與SSEL信號沒有關係。再來看從器件,主器件的輸入口MISO同樣是在時鐘的前沿採樣從器件輸出的bit1的,那從器件又是在何時輸出bit1的呢?從器件實在SSEL信號有效後,立即輸出bit1,儘管此時SCK信號還沒有生效。

SSPSR

        是SPI設備內部的移位寄存器,根據SPI時鐘信號狀態,往SSPBUF裏移入或移出數據,每次移動的數據大小由Bus-width和Channel-width決定。
        Bus-width的作用是指地址總線到Master之間數據傳輸的單位。例如要往Master的SSPBUF寫入16 byte大小的數據。首先,給Master的配置寄存器設置Bus-width爲Byte,然後往Master的Tx-Data移位寄存器在地址總線的入口寫入數據,每次寫入1 byte大小的數據,寫完1 byte數據後,Master裏面的Tx-data移位寄存器會自動把地址總線傳來的1 byte數據移入SSPBUF裏,上述動作一共重複執行16次。
        Channel-width的作用是指定Master與Slave之間數據傳輸的單位,與Bus-width類似,Master內部的移位寄存器會根據channel-width自動把數據從Master-SSPBUF裏通過Master-SDO管腳搬運到Slave-SDI管腳,Slave-SSPSR再每次把接收的數據移入Slave-SSPBUF裏。
        通常情況下,Bus-width總是大於或等於channel-width,這樣保證不會出現因Master與Slave之間數據交換的頻率比地址總線和Master數據交換頻率快,導致SSPBUF裏面存放數據爲無效數據的情況發生。

SSPBUF

        在每個時鐘週期內,Master與Slave之間交換的數據其實都是SPI內部移位寄存器從SSPBUF裏面拷貝的,可以通過往SSPBUF對應的寄存器(Tx-Data/Rx-Data register)裏讀寫數據,間接操控SPI內部的SSPBUF。
        在發送數據之前,先往Master的Tx-Data寄存器寫入要發送出去的數據,這些數據會被Master-SSPSR移位寄存器根據Bus-width自動移入Master-SSPBUF裏,然後這些數據又被Master-SSPSR根據Channel-width從Master-SSPBUF中移出,通過Master-SDO管腳傳給Slave-SDI管腳,Slave-SSPSR則把從Slave-SDI接收到的數據移入Slave-SSPBUF裏。與此同時Slave-SSPBUF裏面的數據根據每次接收數據的大小(Channel-width)通過Slave-SDO發往Master-SDI,Master-SSPSR再把從Master-SDI接收的數據移入Master-SSPBUF。在單次數據傳輸完成後,用戶程序可以通過從Master的Rx-Data寄存器讀取Master數據交換得到的數據。

Controller

        Master裏面的Controller主要通過時鐘信號以及片選信號來控制Slave。Slave會一直等待,直到接收到Master發過來的片選信號,然後根據時鐘信號來工作。
Master的片選操作必須由程序實現。例如,程序把SS/CS的信號拉低電平,完成SPI設備數據通信的前期工作;當程序想讓SPI設備結束數據通信時,再把SS/CS管腳上的時鐘信號拉高電平。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章