SPI通信的四種方式 FPGA的SPI從機(jī)實(shí)現(xiàn)方案_第1頁(yè)
SPI通信的四種方式 FPGA的SPI從機(jī)實(shí)現(xiàn)方案_第2頁(yè)
SPI通信的四種方式 FPGA的SPI從機(jī)實(shí)現(xiàn)方案_第3頁(yè)
SPI通信的四種方式 FPGA的SPI從機(jī)實(shí)現(xiàn)方案_第4頁(yè)
SPI通信的四種方式 FPGA的SPI從機(jī)實(shí)現(xiàn)方案_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

SPI通信的四種方式FPGA的SPI從機(jī)實(shí)現(xiàn)方案一.SPI總線協(xié)議SPI(SerialPeripheralInterface)接口,中文為串行外設(shè)接口。它只需要3根線或4根線即可完成通信工作(這里討論4根線的情況)。這4根通信線分別為NCS/NSS(片選信號(hào))、SCK/SCLK(串行同步時(shí)鐘)、MOSI/SDO(主機(jī)輸出從機(jī)輸入,MasterOutputSlaveInput)、MISO/SDI(主機(jī)輸入從機(jī)輸出)。SPI通信有四種方式,由CPOL(時(shí)鐘極性)、CPHA(時(shí)鐘相位)的4種組合決定的。CPOL決定總線空閑時(shí),SCK是高電平還是低電平(CPOL=,0,無(wú)數(shù)據(jù)傳輸時(shí),SCK=0;CPOL=1,無(wú)數(shù)據(jù)傳輸時(shí),SCK=1)。CPHA決定在數(shù)據(jù)開(kāi)始傳輸時(shí),SCK第幾個(gè)跳變沿采集數(shù)據(jù)(CPHA=0,開(kāi)始傳輸時(shí),在第一個(gè)跳變沿采集數(shù)據(jù),第二個(gè)跳變沿改變發(fā)送數(shù)據(jù)(即改變MISO或者M(jìn)OSI線上電平);CPHA=1,開(kāi)始傳輸是,在第一個(gè)跳變沿改變發(fā)送的數(shù)據(jù),在第二個(gè)跳變沿采集數(shù)據(jù))(見(jiàn)圖1)。圖1確立可靠通信前,必須保證主從機(jī)處于同一種的傳輸方式,這里為方便起見(jiàn),專門(mén)以CPOL=0,CPHA=0的傳輸方式進(jìn)行討論。需要注意的是:在CPOL=0,CPHA=0的情況下,主從機(jī)都在SCK上跳沿對(duì)數(shù)據(jù)進(jìn)行采集,SCK下跳沿改變總線電平(見(jiàn)圖2)。圖2這里在使用FPGA實(shí)現(xiàn)SPI模塊時(shí),做一個(gè)規(guī)定:1.使用CPOL=0,、CPHA=0的傳輸方式;2.傳輸時(shí),以最高位先輸出,最后輸出最低位;3.FPGA實(shí)現(xiàn)的SPI模塊作從機(jī),SCK由外部主機(jī)提供;4.通信數(shù)據(jù)長(zhǎng)度為8位。二.FPGA的SPI從機(jī)實(shí)現(xiàn)實(shí)現(xiàn)SPI從機(jī),可以分為兩個(gè)模塊:一個(gè)是SPI接收模塊,另一個(gè)則是SPI發(fā)送模塊。1.首先確定模塊的輸出輸入管腳由標(biāo)題一可以知道,SPI通信腳有4根線,我們還是用到時(shí)鐘總線和模塊復(fù)位腳,因此模塊管腳可以定義為modulemyspi(nrst,clk,ncs,mosi,miso,sck);inputclk,nrst;inputncs,mosi,sck;outputmiso;2.SCK跳變沿檢測(cè)原理十分簡(jiǎn)單:使用寄存器記錄SCK狀態(tài),由狀態(tài)判斷SCK是否出現(xiàn)跳變沿。reg[2:0]sck_edge;always@(posedgeclkornegedgenrst)beginif(~nrst)beginsck_edge<=3'b000;endelsebeginsck_edge<={sck_edge[1:0],sck};endendwiresck_riseedge,sck_falledge;assignsck_riseedge=(sck_edge[2:1]==2'b01);//檢測(cè)到SCK由0變成1,則認(rèn)為發(fā)現(xiàn)上跳沿assignsck_falledge=(sck_edge[2:1]==2'b10);//檢測(cè)到SCK由1變成0,則認(rèn)為發(fā)現(xiàn)下跳沿3.SPI接收部分SPI接收部分使用有限狀態(tài)機(jī):狀態(tài)1:等待SCK上跳沿,并將MOSI的數(shù)據(jù)移入移位寄存器byte_received,接收位數(shù)寄存器bit_received_cnt記錄接收到的數(shù)據(jù)位數(shù),接收到8位數(shù)據(jù)后轉(zhuǎn)入狀態(tài)2;狀態(tài)2:保存移位寄存器byte_received數(shù)據(jù)到接收緩存器rec_data,接收標(biāo)志位/接收緩存器非空標(biāo)志位rec_flag置高4個(gè)clk時(shí)鐘周期后轉(zhuǎn)入狀態(tài)3;狀態(tài)3:清除rec_flag并轉(zhuǎn)入狀態(tài)1。reg[7:0]byte_received;reg[3:0]bit_received_cnt;regrec_flag;reg[1:0]rec_status;//SPI接收部分狀態(tài)機(jī)reg[7:0]rec_data;reg[2:0]rec_flag_width;//SPI接收完成標(biāo)志位脈沖寬度寄存器always@(posedgeclkornegedgenrst)//每次sck都會(huì)接收數(shù)據(jù),spi的頂端模塊狀態(tài)機(jī)決定是否取用beginif(~nrst)beginbyte_received<=8'h00;bit_received_cnt<=4'h0;rec_flag<=1'b0;rec_status<=2'b00;rec_flag_width<=3'b000;endelsebeginif(~ncs)begincase(rec_status)2'b00:beginif(sck_riseedge)beginbyte_received<={byte_received[6:0],mosi};if(bit_received_cnt==4'h7)beginbit_received_cnt<=4'b0000;rec_status<=2'b01;endelsebeginbit_received_cnt<=bit_received_cnt+1;endendend2'b01:beginrec_data<=byte_received;rec_flag<=1'b1;if(rec_flag_width==3'b100)beginrec_flag_width<=3'b000;rec_status<=2'b11;endelsebeginrec_flag_width<=rec_flag_width+1;endend2'b11:beginrec_flag<=1'b0;rec_status<=2'b00;endendcaseendendend

這里,使用rec_flag的原因是通知另一個(gè)模塊處理接收數(shù)據(jù)(后面將會(huì)提到),rec_data若在下一次數(shù)據(jù)傳輸完成前不做處理則會(huì)丟失。4.SPI發(fā)送部分SPI從機(jī)一般在解析主機(jī)發(fā)送的命令后,主動(dòng)發(fā)出主機(jī)所需數(shù)據(jù),所以,SPI發(fā)送部分,需要其他模塊的觸發(fā),并將數(shù)據(jù)送往MISO管腳。SPI發(fā)送部分也離不開(kāi)狀態(tài)機(jī):狀態(tài)1:等待發(fā)送觸發(fā)標(biāo)志位send_flag置高,一旦標(biāo)志位send_flag置高,發(fā)送移位寄存器byte_sended存儲(chǔ)外部觸發(fā)模塊的數(shù)據(jù)send_data,miso管腳輸出發(fā)送數(shù)據(jù)最高位send_data[7],置位正在發(fā)送標(biāo)志位sending_flag,轉(zhuǎn)入狀態(tài)2;狀態(tài)2:等待SCK上跳沿,即等待主機(jī)接收數(shù)據(jù)最高位后進(jìn)入狀態(tài)3;(其實(shí)這個(gè)狀態(tài)可有可無(wú)的狀態(tài))狀態(tài)3:在SCK下跳沿,將發(fā)送移位寄存器byte_sended最高位移入miso管腳,當(dāng)發(fā)送移位寄存器被移空,清除正在發(fā)送標(biāo)志位sending_flag,進(jìn)入狀態(tài)4;狀態(tài)4:置低miso管腳,轉(zhuǎn)入狀態(tài)1。regmiso;regsending_flag;//正在發(fā)送標(biāo)志位reg[7:0]byte_sended;//發(fā)送移位寄存器reg[3:0]bit_sended_cnt;//SPI發(fā)送位計(jì)數(shù)器reg[1:0]send_status;//SPI發(fā)送部分狀態(tài)機(jī)always@(posedgeclkornegedgenrst)beginif(~nrst)beginbyte_sended<=8'h00;bit_sended_cnt<=4'b0000;send_status<=2'b00;sending_flag<=1'b0;endelsebeginif(~ncs)begincase(send_status)2'b00:beginif(send_flag)begin//鎖存發(fā)送數(shù)據(jù)send_status<=2'b01;//2'b01;byte_sended<=send_data;sending_flag<=1'b1;miso<=send_data[7];endend2'b01:begin//發(fā)送數(shù)據(jù)移入移位寄存器if(sck_riseedge)begin//miso<=byte_sended[7];//byte_sended<={byte_sended[6:0],1'b0};send_status<=2'b11;endend2'b11:begin//根據(jù)sck下降沿改變數(shù)據(jù)miso<=byte_sended[7];if(sck_falledge)///---------------------------------------這里多移了一位begin//miso<=byte_sended[7];byte_sended<={byte_sended[6:0],1'b0};if(bit_sended_cnt==4'b0111)beginsend_status<=2'b10;bit_sended_cnt<=4'b0000;sending_flag<=1'b0;endelsebeginbit_sended_cnt<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論