天天看點

SPI簡介SPI通信原理SPI通信模式資料傳輸

目錄

簡介

SPI通信原理

SPI通信模式

資料傳輸

簡介

SPI(Serial Peripheral interface),串行外圍裝置接口。是Motorola首先在其MC68HCXX系列處理器上定義的。

SPI,是一種高速的,全雙工,同步的通信總線。在晶片的管腳上隻占用四根線。SPI接口主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信号處理器和數字信号解碼器之間。

SPI通信原理

SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個主裝置和一個或多個從裝置,需要至少4根線,也是所有基于SPI的裝置共有的,它們是SDI(資料輸入)、SDO(資料輸出)、SCLK(時鐘)、CS(片選)。

(1)SDO/MOSI – 主裝置資料輸出,從裝置資料輸入;

(2)SDI/MISO – 主裝置資料輸入,從裝置資料輸出;

(3)SCLK – 時鐘信号,由主裝置産生;

(4)CS/SS – 從裝置使能信号,由主裝置控制。當有多個從裝置的時候,因為每個從裝置上都有一個片選引腳接入到主裝置機中,當我們的主裝置和某個從裝置通信時将需要将從裝置對應的片選引腳電平拉低或者是拉高。

SPI通信模式

SPI采用同步方式傳輸資料,Master 裝置會根據将要交換的資料來産生相應的時鐘脈沖(Clock Pulse), 時鐘脈沖組成了時鐘信号(Clock Signal) , 時鐘信号通過時鐘極性 (CPOL) 和 時鐘相位 (CPHA) 控制着兩個 SPI 裝置間何時資料交換以及何時對接收到的資料進行采樣, 來保證資料在兩個裝置之間是同步傳輸的。注意:當沒有資料交流時,時鐘線要麼保持高電平要麼保持低電平。

SPI通信有4種不同的模式:

Mode0:CPOL=0,CPHA=0

Mode1:CPOL=0,CPHA=1

Mode2:CPOL=1,CPHA=0

Mode3:CPOL=1,CPHA=1

注意:不同的從裝置一般在出廠時就配置為某種模式,這是不能改變的;但SPI通信雙方必須是工作在同一模式下,是以我們需要對主裝置的SPI模式進行配置,通過配置CPOL(時鐘極性)和CPHA(時鐘相位)來控制主裝置的通信模式,

CPOL時鐘極性,表示 SPI 在空閑時,時鐘信号是高電平還是低電平。CPHA是用來配置資料采樣是在第幾個邊沿:

CPOL=0,表示當SCLK=0時處于空閑态,是以有效狀态就是SCLK處于高電平時

CPOL=1,表示當SCLK=1時處于空閑态,是以有效狀态就是SCLK處于低電平時

CPHA=0,表示資料采樣是在第1個邊沿,資料發送在第2個邊沿

CPHA=1,表示資料采樣是在第2個邊沿,資料發送在第1個邊沿

例:

CPOL=0,CPHA=0:此時空閑态時,SCLK處于低電平,資料采樣是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,是以資料采樣是在上升沿,資料發送是在下降沿。

CPOL=0,CPHA=1:此時空閑态時,SCLK處于低電平,資料發送是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,是以資料采樣是在下降沿,資料發送是在上升沿。

CPOL=1,CPHA=0:此時空閑态時,SCLK處于高電平,資料采集是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,是以資料采集是在下降沿,資料發送是在上升沿。

CPOL=1,CPHA=1:此時空閑态時,SCLK處于高電平,資料發送是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,是以資料采集是在上升沿,資料發送是在下降沿。

SPI簡介SPI通信原理SPI通信模式資料傳輸

資料傳輸

SPI 裝置間的資料傳輸又被稱為資料交換, 因為 SPI 協定規定一個 SPI 裝置不能在資料通信過程中僅僅隻充當一個 "發送者(Transmitter)" 或者 "接收者(Receiver)".

在一個SPI時鐘周期内,會完成如下操作:

1)主機通過MOSI線發送1位資料,從機通過該線讀取這1位資料;

2)從機通過MISO線發送1位資料,主機通過該線讀取這1位資料。

這是通過移位寄存器來實作的。如下圖所示,主機和從機各有一個移位寄存器,且二者連接配接成環。随着時鐘脈沖,資料按照從高位到低位的方式依次移出主機寄存器和從機寄存器,并且依次移入從機寄存器和主機寄存器。當寄存器中的内容全部移出時,相當于完成了兩個寄存器内容的交換。

SPI簡介SPI通信原理SPI通信模式資料傳輸

一個 Slave 裝置要想能夠接收到 Master 發過來的控制信号, 必須在此之前能夠被 Master 裝置進行通路 (Access). 是以, Master 裝置必須首先通過 SS/CS pin 對 Slave 裝置進行片選, 把想要通路的 Slave 裝置選上. 在資料傳輸的過程中, 每次接收到的資料必須在下一次資料傳輸之前被采樣. 如果之前接收到的資料沒有被讀取, 那麼這些已經接收完成的資料将有可能會被丢棄, 導緻 SPI 實體子產品最終失效. 是以, 在程式中一般都會在 SPI 傳輸完資料後, 去讀取 SPI 裝置裡的資料, 即使這些資料(Dummy Data)在我們的程式裡是無用的(雖然發送後緊接着的讀取是無意義的,但仍然需要從寄存器中讀出來)。

繼續閱讀