概述
SPI = Serial Peripheral Interface,是串行外圍設備接口,是一種高速,全雙工,同步的通信總線。
優點
支持全雙工
支持高速
協議支持字長不限于8bit,可以根據應用靈活選擇消息字長。
硬件連接簡單
缺點
相比I2C多兩條線
沒有尋址機制,只能靠片選選擇不同的設備
沒有回應ACK機制,主設備不知道消息發送是否成功
典型應用僅支持單主控
硬件結構
信號定義
SCK
:Serial Clock,時鐘信號,由主設備產生。
MOSI
:Master Output,Slave Input 主發從收信號。在片選信號有效時,數據由高位到低位,在時鐘的上升沿依次發送給從設備。
MISO
:Master Input,Slave Output 主收從發信號,在片選信號有效時,數據由高位到低位,在時鐘的上升沿依次發送給主設備。
SS/CS
:Slave Select 片選信號,低有效,由主設備控制。即只有片選信號為預先規定的使能信號時,對應的芯片操作才有效,這使得在同一總線上連接多個SPI設備成為可能。
電路連接
單個主設備和單個從設備:
單個主設備和多個從設備,通過用多個片選信號或者菊花鏈的形式完成。
傳輸模式
通過設置相關控制寄存器,SPI可以有四種傳輸模式。
1、時鐘空閑時的電平為高或低。
2、數據采樣發生在時鐘(SCK)的上/下邊沿。
將以上兩種情況兩兩組合,即可得四種傳輸模式。
數據在時鐘上升沿或下降沿時改變,在緊接著的下降沿或上升沿被讀取,完成一位數據傳輸,輸入與輸出原理相近。這樣通過至少8次時鐘信號的改變(上升沿和下降沿為一次),就可以完成8位數據的傳輸。如下圖所示。
標準SPI讀
片選→讀指令→地址→數據讀出
標準SPI寫
片選→寫指令→地址→數據寫入
Verilog代碼解析
本文以SPI Master控制器為例來對Verilog源碼進行分析,參考資料為《VERILOG HDL應用程序設計實例精講》。
1、時鐘分頻模塊,將原始時鐘進行四分頻,過程較為簡單,不再詳述。
module clkdiv(clk,clkout); input clk; output clkout; reg [1:0]cnt=2'd0; reg clkout=1'b0; always @(posedge clk)begin if(cnt==2'd1)begin clkout<=1'b1; cnt<=cnt+2'd1; end else if(cnt == 2'd3)begin clkout<=1'b0; cnt<=2'd0; end else begin cnt<=cnt+2'd1; end end endmodule
2、SPI發送數據部分,在spiclk的上升沿完成數據的傳輸。spics為片選信號,低有效;spido為輸出的數據;dstate為FSM變量。dsend為待傳送數據,其中部分數據過程重復,代碼中僅保留首尾數據的傳輸過程。
begin case (dstate) 8'd0: begin spics <= 1'b0; spiclk <= 1'b1; spido <= 1'b1; dstate <= 8'd1; end 8'd1: begin spics <= 1'b0; spiclk <= 1'b1; spido <= 1'b1; dstate <= 8'd2; end 8'd2: begin spics <= 1'b0; spiclk <= 1'b0; spido <= 1'b1; dstate <= 8'd3; end 8'd3: begin spics <= 1'b0; spiclk <= 1'b1; spido <= dsend[7]; dstate <= 8'd4; end 8'd4: begin spics <= 1'b0; spiclk <= 1'b0; spido <= dsend[7]; dstate <= 8'd5; end …… 8'd17: begin spics <= 1'b0; spiclk <= 1'b1; spido <= dsend[0]; dstate <= 8'd18; end 8'd18: begin spics <= 1'b0; spiclk <= 1'b0; spido <= dsend[0]; dstate <= 8'd19; end 8'd19: begin spics <= 1'b0; spiclk <= 1'b1; spido <= 1'b1; dstate <= 8'd20; end 8'd20: begin spics <= 1'b0; spiclk <= 1'b1; spido <= 1'b1; dstate <= 8'd0; spistate <= idle; end endcase end default: begin spics <= 1'b1; spiclk <= 1'b1; spido <= 1'b1; spistate <= 2'b00; end endcase end
可以看到當片選信號spics為低有效時,數據在spiclk的上升沿按順序被發送至SPI總線上,數據信號spido與輸入數據相對應,SPI Master發送時序得到驗證。
3、SPI接收數據部分,參數定義與2一樣,其中部分數據過程重復,代碼中僅保留首尾數據的傳輸過程。在時鐘的下降沿進行數據的接收。
begin case (dstate) 8'd0: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd1; end 8'd1: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd2; end 8'd2: begin spics <= 1'b0; spiclk <= 1'b0; dstate <= 8'd3; end 8'd3: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd4; end 8'd4: begin spics <= 1'b0; spiclk <= 1'b0; dreceive[7] <= spidi; dstate <= 8'd5; end 8'd5: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd6; end …… 8'd18: begin spics <= 1'b0; spiclk <= 1'b0; dreceive[0] <= spidi; dstate <= 8'd19; end 8'd19: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd20; dataout <= dreceive; end 8'd20: begin spics <= 1'b0; spiclk <= 1'b1; dstate <= 8'd0; spistate <= 2'b00; end endcase end
由上圖分析看出,收到的數據與SPI傳輸的數據相對應,SPI接收數據部分得到正確驗證。
實驗項目框圖:
實驗心得:
1、在給復位信號低電平時時間過短,分頻后時鐘上升沿還未到復位信號就拉高了,導致未進行有效復位。
2、進行發送/接收狀態檢測時設置的計數子過大,如下圖,每過40個時鐘周期進行一次檢測,當仿真時間過短時,容易看不到結果。
if(cnt == 8'd40) begin cnt <= 8'd0; if((wr == 1'b0) && (rd == 1'b1)) begin spistate <= send_data; dstate <= 8'd0; dsend <= datain; end else if((wr == 1'b1) && (rd == 1'b0)) begin spistate <= receive_data; dstate <= 8'd0; end end else begin cnt <= cnt + 8'd1; end
3、若結果出現問題,將相關控制信號添加至窗口,觀察其狀態,分析程序存在的問題。
-
Verilog
+關注
關注
28文章
1352瀏覽量
110404 -
SPI
+關注
關注
17文章
1724瀏覽量
92144 -
通信總線
+關注
關注
0文章
45瀏覽量
9889
原文標題:SPI詳解及Verilog源碼分析
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
SPI總線的原理與Verilog設計實現
![<b class='flag-5'>SPI</b><b class='flag-5'>總線</b>的原理與<b class='flag-5'>Verilog</b>設計<b class='flag-5'>實現</b>](https://file1.elecfans.com/web2/M00/90/62/wKgaomTZfTGAKJ8UAAAbTIvaPvk620.png)
SPI總線概述
怎么使用FPGA實現SPI總線的通信接口?
STM32通信接口之硬件SPI概述
介紹一下SPI通信總線構成與通信特點
用SPI總線實現DSP和MCU之間的高速通信
使用Verilog實現SPI串行總線接口的資料和源代碼免費下載
![使用<b class='flag-5'>Verilog</b><b class='flag-5'>實現</b><b class='flag-5'>SPI</b>串行<b class='flag-5'>總線</b>接口的資料和源代碼免費下載](https://file.elecfans.com/web1/M00/C4/E4/pIYBAF88y6eALwenAAFgkjxZLUg341.png)
評論