基于FPGA的SPI接口设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于FPGA的SPI接口设计SPI是一种在FPGA和其他芯片之间传输数据的简单有效的接口方式。SPI项目第一部分:什么是SPI第二部分:SPI的简单实现第三部分:应用第一部分:什么是SPISPI是允许一个器件同其他一个或多个器件进行通讯的简单接口。SPI是什么样的?首先让我们来看看两个芯片之间的SPI接口是如何连接的。在两个芯片时间通讯时,SPI需要4条连线。正如你所看到的,他们是SCK、MISO、MOSI以及SSEL。其中一个芯片叫做主控芯片,另一个叫从芯片。SPI基础基本特点:1.同步2.串行3.全双工4.非即插即用5.一主多从更多细节:1.同步时钟有主控芯片产生,每个时钟传输一位数据2.数据在传输前,首先许要进行并转串,才能用一条线传输3.两条数据线,一条输入、一条输出4.主从双方有关于SPI传输的先验知识,如比特顺序、数据长度等5.数据传输有主控芯片发起,每次只与一个从芯片通讯SPI是一种同步全双工的通讯接口,每个时钟在两条数据线上各传输一比特数据。简单的传输假设在主从芯片之间进行的是8位长度的,高位数据在前的SPI传输,则单个字节的传输在波形上看起来是这样的。MOSI是主输出线,而MISO则是从输出线。由于SPI是全双工的,所以在时钟沿上两条线同时传输数据。MOSI将数据从主控芯片传输至从芯片,MISO则将从芯片的数据传输到主控芯片。详细的说是这样的:1,首先主控芯片使能相应的SSEL信号,通知相应的从芯片数据传输要开始了;2,主控芯片产生8个SPI时钟周期,并将数据在每个时钟沿发送出去,同时从芯片在也每个时钟沿将数据发送到MISO线上。3,主控芯片撤销SSEL信号,一次SPI传输结束多个从芯片的情况通过扩展SSEL信号,一个主控芯片可以和多个从芯片进行SPI通讯。下图是有三个从芯片的情况:主控芯片有3条SSEL线,每次只使能条,和其中一个从芯片进行SPI通讯。由于所有芯片的MISO都连接在一起,所以不允许同时有多个从芯片驱动MISO线。SPI有多快SPI可以很轻易的做到几Mbps的传输速率,这就意味着SPI可以用来进行非压缩的音频和和压缩的视频信号传输。相关链接:Wikipedia的SPI接口总线第二部分SPI接口的FPGA简单实现ARM处理器为了检验我们刚学得的关于SPI的知识,我们使用一个带有SPI接口的ARM7板和FPGA板,板间由SPI总线连接。ARM处理器作为主控器,FPGA作为SPI从机。下图为他们之间的连接方式。SPI主控机-C语言程序使用ARM的SPI接口,只需要初始化一些寄存器,然后对SPI接口进行写数和读数操作即可让SPI接口自动完成发送和接收数据。voidmain(void){//初始化SPI接口,因处理器而异SSP0CPSR=0x02;SSP0CR0=0x07;SSP0CR1=0x02;PINSEL1=0x2A8;while(1){//发送两个字节SSP0DR=0x55;SSP0DR=0x54;//等待数据发送完毕while(!(SSP0SR&0x01));//读数intdata1=SSP0DR;intdata2=SSP0DR;//...}}SPI从机-HDL代码再来考虑FPGA端SPI从机的设计。SincetheSPIbusistypicallymuchslowerthantheFPGAoperatingclockspeed,wechoosetoover-sampletheSPIbususingtheFPGAclock.Thatmakestheslavecodeslightlymorecomplicated,buthastheadvantageofhavingtheSPIlogicrunintheFPGAclockdomain,whichwillmakethingseasierafterwards.Firstthemoduledeclaration.moduleSPI_slave(clk,SCK,MOSI,MISO,SSEL,LED);inputclk;inputSCK,SSEL,MOSI;outputMISO;outputLED;Notethatwehaveclk(theFPGAclock)andanLEDoutput...anicelittledebugtool.clkneedstobefasterthantheSPIbus.Saxo-Lhasadefaultclockof24MHz,whichworksfinehere.Wesample/synchronizetheSPIsignals(SCK,SSELandMOSI)usingtheFPGAclockandshiftregisters.//syncSCKtotheFPGAclockusinga3-bitsshiftregisterreg[2:0]SCKr;always@(posedgeclk)SCKr={SCKr[1:0],SCK};wireSCK_risingedge=(SCKr[2:1]==2'b01);//nowwecandetectSCKrisingedgeswireSCK_fallingedge=(SCKr[2:1]==2'b10);//andfallingedges//samethingforSSELreg[2:0]SSELr;always@(posedgeclk)SSELr={SSELr[1:0],SSEL};wireSSEL_active=~SSELr[1];//SSELisactivelowwireSSEL_startmessage=(SSELr[2:1]==2'b10);//messagestartsatfallingedgewireSSEL_endmessage=(SSELr[2:1]==2'b01);//messagestopsatrisingedge//andforMOSIreg[1:0]MOSIr;always@(posedgeclk)MOSIr={MOSIr[0],MOSI};wireMOSI_data=MOSIr[1];NowreceivingdatafromtheSPIbusiseasy.reg[2:0]bitcnt;//wehandleSPIin8-bitsformat,soweneeda3bitscountertocountthebitsastheycomeinregbyte_received;//highwhenabytehasbeenreceivedreg[7:0]byte_data_received;always@(posedgeclk)beginif(~SSEL_active)bitcnt=3'b000;elseif(SCK_risingedge)beginbitcnt=bitcnt+3'b001;byte_data_received={byte_data_received[6:0],MOSI_data};//implementashift-leftregister(sincewereceivethedataMSBfirst)endendalways@(posedgeclk)byte_received=SSEL_active&&SCK_risingedge&&(bitcnt==3'b111);//weusetheLSBofthedatareceivedtocontrolanLEDregLED;always@(posedgeclk)if(byte_received)LED=byte_data_received[0];Finallythetransmissionpart.reg[7:0]byte_data_sent;reg[7:0]cnt;always@(posedgeclk)if(SSEL_startmessage)cnt=cnt+8'h1;//countthemessagesalways@(posedgeclk)if(SSEL_active)beginif(SSEL_startmessage)byte_data_sent=cnt;//firstbytesentinamessageisthemessagecountelseif(SCK_fallingedge)beginif(bitcnt==3'b000)byte_data_sent=8'h00;//afterthat,wesend0selsebyte_data_sent={byte_data_sent[6:0],1'b0};endendassignMISO=byte_data_sent[7];//sendMSBfirst//weassumethatthereisonlyoneslaveontheSPIbus,sowedon'tbotherwithatri-statebufferforMISO//otherwisewewouldneedtotri-stateMISOwhenSSELisinactiveendmoduleWehaveestablishedcommunicationbetweentheARMandtheFPGA!RunningthecodeAswestepthroughtheARMcode,wecanseetheLEDchangingstate,andthedatareturnedbytheFPGA.Nowlet'sseeifwecandousefulthingswithSPI.

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功