FPGA 學習之路(九)SPI協議通信

SPI通信協議

SPI是同步串行通信接口。
SPI是英語Serial Peripheral Interface的縮寫,顧名思義就是串行外圍設備接口。SPI是一種高速的、全雙工、同步通信總線,標準的SPI也僅僅使用4個引腳,常用於單片機和EEPROM、FLASH、實時時鐘、數字信號處理器等器件的通信。SPI通信原理比I2C要簡單,它主要是主從方式通信,這種模式通常只有一個主機和一個或者多個從機,標準的SPI是4根線,分別是SSEL(片選,也寫作SCS)、SCLK(時鐘,也寫作SCK)、MOSI(主機輸出從機輸入Master Output/Slave Input)和MISO(主機輸入從機輸出Master Input/Slave Output)。

SSEL:從設備片選使能信號。如果從設備是低電平使能的話,當拉低這個引腳後,從設備就會被選中,主機和這個被選中的從機進行通信。
SCLK:時鐘信號,由主機產生,和I2C通信的SCL有點類似。
MOSI:主機給從機發送指令或者數據的通道。
MISO:主機讀取從機的狀態或者數據的通道。

在某些情況下,我們也可以用3根線的SPI或者2根線的SPI進行通信。比如主機只給從機發送命令,從機不需要回複數據的時候,那MISO就可以不要;而在主機只讀取從機的數據,不需要給從機發送指令的時候,那MOSI可以不要;當一個主機一個從機的時候,從機的片選有時可以固定爲有效電平而一直處於使能狀態,那麼SSEL可以不要;此時如果再加上主機只給從機發送數據,那麼SSEL和MISO都可以不要;如果主機只讀取從機送來的數據,SSEL和MOSI都可以不要。 3線和2線的SPI大家要知道怎麼回事,實際使用也是有應用的,但是當我們提及SPI的時候,一般都是指標準SPI,都是指4根線的這種形式。

SPI通信的主機也是我們的單片機,在讀寫數據時序的過程中,有四種模式,要了解這四種模式,首先我們得學習一下2個名詞。

CPOL:Clock Polarity,就是時鐘的極性。
時鐘的極性是什麼概念呢?通信的整個過程分爲空閒時刻和通信時刻,SCLK在數據發送之前和之後的空閒狀態是高電平那麼CPOL=1,如果空閒狀態SCLK是低電平,那麼CPOL=0。
CPHA:Clock Phase,就是時鐘的相位。

主機和從機要交換數據,就牽涉到一個問題,即主機在什麼時刻輸出數據到MOSI上而從機在什麼時刻採樣這個數據,或者從機在什麼時刻輸出數據到MISO上而主機什麼時刻採樣這個數據。同步通信的一個特點就是所有數據的變化和採樣都是伴隨着時鐘沿進行的,也就是說數據總是在時鐘的邊沿附近變化或被採樣。而一個時鐘週期必定包含了一個上升沿和一個下降沿,這是週期的定義所決定的,只是這兩個沿的先後並無規定。又因爲數據從產生的時刻到它的穩定是需要一定時間的,那麼,如果主機在上升沿輸出數據到MOSI上,從機就只能在下降沿去採樣這個數據了。反之如果一方在下降沿輸出數據,那麼另一方就必須在上升沿採樣這個數據。
CPHA=1,就表示數據的輸出是在一個時鐘週期的第一個沿上,至於這個沿是上升沿還是下降沿,這要是CPOL的值而定,CPOL=1那就是下降沿,反之就是上升沿。那麼數據的採樣自然就是在第二個沿上了。
CPHA=0,就表示數據的採樣是在一個時鐘週期的第一個沿上,同樣它是什麼沿由CPOL決定。那麼數據的輸出自然就在第二個沿上了。
仔細想一下,這裏會有一個問題:就是當一幀數據開始傳輸第一bit時,在第一個時鐘沿上就採樣該數據了,那麼它是在什麼時候輸出來的呢?有兩種情況:一是SSEL使能的邊沿,二是上一幀數據的最後一個時鐘沿,有時兩種情況還會同時生效。

我們以CPOL=1/CPHA=1爲例,把時序圖畫出來給大家看一下,如圖1所示,。
這裏寫圖片描述

大家看圖15-1所示,當數據未發送時以及發送完畢後,SCK都是高電平,因此CPOL=1。可以看出,在SCK第一個沿的時候,MOSI和MISO會發生變化,同時SCK第二個沿的時候,數據是穩定的,此刻採樣數據是合適的,也就是上升沿即一個時鐘週期的後沿鎖存讀取數據,即CPHA=1。注意最後最隱蔽的SSEL片選,一般情況下,這個引腳通常用來決定是哪個從機和主機進行通信。剩餘的三種模式,我把圖畫出來,簡化起見把MOSI和MISO合在一起了,大家仔細對照看看研究一下,把所有的理論過程都弄清楚,有利於你對SPI通信的深刻理解,如圖2所示。

這裏寫圖片描述

Verilog程序設計

程序設計採用的通信協議爲上圖1,即(CPOL=1/CPHA=1)

程序設計步驟:

接收模塊:
1)MCU端與FPGA端的數據同步化處理。
SPI數據從MCU輸出, MCU與FPGA完全不在同一時鐘域,可以採用最簡單的D觸發器來實現數據的同步。 而上升沿的邊沿檢測需要消耗兩個D觸發器,爲了保證SPI數據的同步,其他信號也要經過兩級觸發器輸出同步。
接入SPI_DATA 信號和邊沿檢測SPI_CS和SPI _SCK信號:SPI_SCK上升沿輸出數據標誌;SPI_CS上升沿爲寫入數據完成標誌。
2)SPI通信協議的設計(數據接收)。
判斷SPI_CS是否有效,根據接收使能信號(MCU時序上升沿採樣信號)來捕獲8位數據,數據的捕獲通過計數器計數實現串轉並。
3)捕獲完成後使能信號的輸出。
便於後端響應,輸出捕獲完成信號標誌。

發送模塊:
1)MCU端與FPGA端的數據同步化處理。
只需要邊沿檢測SPI_CS和SPI _SCK信號:SPI_SCK下降沿寫入數據標誌;SPI_CS上升沿爲寫入數據完成標誌。
2)SPI通信協議的設計(數據接收)。
採用狀態機來設計發送協議,設計兩個狀態,狀態1爲IDLE等待狀態數據輸出始終爲0,狀態2爲SEND狀態,逐個輸出並轉串數據。
3)發送數據完成後使能信號的輸出。
便於後端響應,輸出完成信號標誌。信號由CS上升沿決定。

本文部分理論引用自:
http://www.diangon.com/wenku/rd/danpianji/201501/00017903.html

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