1. 程式人生 > >FPGA 學習之路(九)SPI協議通訊

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上升沿決定。

相關推薦

FPGA 學習SPI協議通訊

SPI通訊協議 SPI是同步序列通訊介面。 SPI是英語Serial Peripheral Interface的縮寫,顧名思義就是序列外圍裝置介面。SPI是一種高速的、全雙工、同步通訊匯流排,標準的SPI也僅僅使用4個引腳,常用於微控制器和EEPROM、FL

Vue學習 --- 非父元件之間的通訊

1. 非vuex實現 非父元件之間的通訊 原理是:在父元件或者全域性建立一個事件倉儲eventHub,然後通過$emit 和 $on 實現通訊 1.1 通過在window上繫結eventHub的Vue例項物件,具體實現方法如下: 目錄結構

Netty學習-JBoss Marshalling編解碼

JBoss Marshalling 是一個Java物件序列化包,對JDK預設的序列化框架進行了優化,但又保持跟java.io.Serializable介面的相容,同時增加了一些可調的引數和附加的特性。 Marshalling開發環境準備 下載相關的Marshalling類庫:地址,將

Linux 學習:特殊許可權及終端

特殊許可權及SUID xargs find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles\; find /etc -size +1M | xargs echo >> /tmp/et

Python小白學習—【字串格式化】【百分號方式】【format方式】

寫在前面: 最近的事情好像有很多。李詠的離去,讓我覺得很突然,彷彿印象中就是主持節目的他,看著他和哈文的愛情,很是感動。離去,沒有什麼抱怨,只是遺憾。 總會感慨,時光的流逝。 好像真的很快,轉眼間,我都這麼大了。 最近,劉某人總說的一句話,小時候雖然很窮,但是很快樂 而現在,不僅僅是窮,而且還不快樂 想想還真

Nginx學習Nginx中的事件驅動過程詳解-----connection事件的註冊過程

在上一篇文章Nginx學習之路(八)Nginx中的事件驅動過程詳解-----以listenfd註冊過程為例中舉了listenfd的註冊過程來說明事件驅動中的事件註冊過程,這是一個簡單的過程,今天來說明下當瀏覽器發起一個http請求時,nginx是如何將這個事件註冊到epoll

FPGA 學習EDA軟體設計流程

以QuartusII13.0EDA軟體為例,介紹Verilog文字輸入的EDA設計流程。 1.首先在D盤或G盤等新建一個資料夾,用英文字母命名,例如建立資料夾SY1。    FPGA工程目錄 : de

FPGA 學習 UART串列埠設計

UART串列埠通訊協議 UART使用的是 非同步,序列通訊。 序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。 非同步通訊以一個字元為傳輸

React-Native學習TabNavigator隱藏問題的分析及解決

首先說明一下我是用的TabNavigator+StackNavigator來寫的頁面跳轉。 我們先分析一下為什麼在每個Tab的Item裡面實現跳轉,跳轉頁面還是會有底部的TabNvigator 先看下我出問題的專案結構,首先,我們可以看到我給這個Tab的Item指定的

Spring 學習:Spring 中的AOP(二):事務通知

AspectJ 目前,spring 框架中我們可以使用基於 AspectJ 註解或者是基於XML配置的 AOP(主流是使用 AspectJ ,簡單,方便) 如何配置AspectJ 簡單理解,Asp

USB小白學習7 FPGA Communication with PC by CY7C68013,TD_init()解析

圖片 語句 學習之路 解析 進行 body mod out 關閉 void TD_Init(void) {   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1); //設置CPU時鐘頻率為48M,寄存器CPUCS的

(轉)USB小白學習8FX2LP cy7c68013——Slave FIFO 與FPGA通信

讀取 批量傳輸 clock 數據接收 select 緩沖 targe operation 暫停 此博客轉自CSDN:http://blog.csdn.net/xx116213/article/details/50535682 1 USB 概述 USB名稱解釋 USB是通

FPGA小白學習1 System Verilog的概念以及與verilog的對比

函數返回 enable 傳遞 轉換操作符 st2 輸出 時間值 擴展 isa 轉自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog語言簡介 SystemVerilog是一種硬件描

FPGA小白學習4PLL中的locked信號解析

count 功能 style use doc 分享圖片 tar cte cal ALTPLL中的areset,locked的使用   轉自:http://www.360doc.com/content/13/0509/20/9072830_284220258.shtml   

FPGA小白學習6串口波特率問題的處理

失真 https 容易 由於 間隔 之路 使用 應該 增強 串口波特率問題的處理 此博文一共包含三個方面的內容:(1)異步串口通信的數據格式;(2)為何串口通信中接收端采樣時鐘頻率是傳輸的波特率的16倍;(3)串口波特率等概念。 1、異步串口通信的數據格式   串口的通信可

python學習

[1] size class dex epc uri msu 語句 這就是 繼續昨天的學習,學到了數組。 首先有兩個數組,name1和name2.我們可以將兩個數組合並 name1=[1,2,3,4] name2=[5,6,7,8] names=name1.extend(

Linux學習幫助命令

查看系統 lin 查看 inux 舉例 config pro nbsp 雜項 幫助命令man .man  命令  #獲取指定命令的幫助 .man  ls    #查看ls的幫助 man的級別 1 查看命令的幫助 2 查看可被內核調用的函數的幫助 3 查看函數的

python學習使用socketserver進行ftp斷點續傳

def += __init__ con 不存在 不為 local 接收 class 最近學習python到socketserver,本著想試一下水的深淺,采用Python3.6. 目錄結構如下: receive_file和file為下載或上傳文件存放目錄,ftp_clie

我的學習SQL盲註學習

網絡安全 dvwa sql盲註 我的學習之路,現在零基礎,是一個小白,請各位大牛批評指正!寫下這篇,是對自己的一個思路的整理,僅供參考。 Dvwa中登錄進入,首先在DVWA Security中設置等級為low,然後進入SQL Injection(blind),隨意輸入一個數字進行抓包,然後找

Hibernate學習

ring int 表示 gen prop generator 需要 blog hibernate 簡述 多對多關系映射 多對多關系映射需要一張中間表來維護關系      一:Role類與Function類 1 publi