ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

fpga实现简单的SPI主机模块

fpga实现简单的SPI主机模块 一 SPI介绍SPISerial Peripheral Interface串行外围设备接口通讯协议是Motorola公司提出的一种同步串 行接口技术是一种高速、全双工、同步通信总线在芯片中只占用四根管脚用来控制及数据传输广 泛用于 EEPROM、Flash、RTC实时时钟、ADC数模转换 器、DSP数字信号处理器以及数字信号解码器上是常用的、重要的低速通讯协议之一。二 SPI四线1:CS/SS(Slave Select/Chip Select)这个是片选信号线用于选择需要进行通信的从设备。I2C通信时通过主机发送从机设备地址来选择需要进行通信的从机设备而 SPI 主机不需要发送从机设备直接将相应的从机设备片选信号拉低即可。片选信号是低电平有效2:SCKSerial Clock串行时钟和 I2C 的 SCL 一样为 SPI 通信提供时钟。3:MOSI/SDOMaster Out Slave In/Serial Data Output简称主出从入信号线这根数据线只能用于主机向从机发送数据也就是主机输出从机输入。4:MISO/SDIMaster In Slave Out/Serial Data Input简称主入从出信号线这根数据线只能用户从机向主机发送数据也就是主机输入从机输出。三 SPI特点SPI 作为一种经典的同步串行通信协议具有以下几个显著特点1. 高速传输SPI 没有像 I2C 那样的应答机制和地址帧开销通信速率仅受限于从设备的最高工作频率和主设备的时钟产生能力因此可以达到很高的数据传输速率通常远高于 I2C 和 UART。2. 全双工通信SPI 采用主出从入MOSI和主入从出MISO两根独立的数据线主机发送数据的同时可以接收从机返回的数据实现真正的全双工同步传输收发互不干扰。3. 同步串行通信SPI 依靠串行时钟线SCK来同步数据的发送与接收所有数据位都在时钟沿的驱动下逐位传输不需要额外的起始位、停止位和校验位协议开销小、时序清晰。4. 主从结构一主多从SPI 总线采用主从架构由主机产生时钟并控制整个通信过程。主机通过独立的片选信号CS/SS来选择目标从设备可以挂接多个从设备且从设备之间互不干扰。5. 接口简单占用管脚少SPI 通信仅需 SCK、MOSI、MISO、CS 四根信号线即可完成数据交互若只做单向传输还可进一步减少相比并行总线大大节省了芯片管脚资源。6. 无设备地址片选寻址与 I2C 通过发送从机地址寻址不同SPI 直接通过拉低对应从机的片选信号来选择通信对象寻址方式简单直接无需在数据帧中携带地址信息。7. 协议灵活模式可配置通过配置时钟极性CPOL和时钟相位CPHASPI 可以组合出四种工作模式能够灵活适配不同从设备的时序要求兼容性强。8. 无应答机制可靠性依赖约定SPI 本身不包含应答和错误检测机制通信是否成功需要由主从双方通过协议约定或软件方式如 CRC 校验、超时判断来保证这是其与 I2C 的一个重要区别。四时钟极性和时钟相位SPI总线的极性--时钟极性CPOL时钟极性决定SPI总线空闲时的时钟信号是高电平还是低电平。CPOL 1表示空闲时是高电平CPOL 0表示空闲时是低电平。SPI总线的相位--时钟相位(CPHA)时钟相位决定SPI总线从哪个跳变沿开始采样数据。CPHA 0在时钟信号SCK的第1个跳变沿采样CPHA 1在时钟信号SCK的第2个跳变沿采样。五 工作模式根据时钟的极性以及相位可以分为4种工作模式模式0CPOL 0CPHA0。SCK串行时钟线空闲是为低电平数据在SCK时钟的上升沿被采样数在SCK时钟的下降沿切换。模式1CPOL 0CPHA1。SCK串行时钟线空闲是为低电平数据在SCK时钟的下降沿被采样数据在SCK时钟的上升沿切换。模式2CPOL 1CPHA0。SCK串行时钟线空闲是为高电平数据在SCK时钟的下降沿被采样数据在SCK时钟的上升沿切换。模式3CPOL 1CPHA1。SCK串行时钟线空闲是为高电平数据在SCK时钟的上升沿被采样数据在SCK时钟的下降沿切换。以模式0为例第一步 拉低片选信号第二步产生同步时钟第三步主机发送数据主机必须在数据采样之前把数据准备好也就是在图中1位置和3位置5位置等下降沿时除1位置特殊情况外将数据准备好然后再时钟上升沿时从机对数据集采样也就是2位置4位置等。第四步从机发送数据。与主机发送数据一样第五步拉高片选信号结束通讯。六 代码编写6.1接口分析默认4线SCK,MOSI,MISO,CS_n.发送或者接受完成以及SPI完成后产生的done信号:done_r,done_w,done_spi;总数据量发送数据量data_len,wr_len;输入数据输出数据data_i_spi,data_o_spi,(分别是需要发送的数据以及接受到的数据)工作开始信号start_spi6.2状态分析根据时序图可以分为4种状态空闲态START,DATASTOP。空闲态用来检测开始信号检测到开始信号上升沿跳转到STARTSTATR:(拉低片选)。,DATA(发送数据与接受数据)。STOP:将片选拉高。6.3部分代码分析6.3.1 bit计数器与分频计数器分频计数器选择6分频bit计数器最大值data_len*8-1;6.3.2开始信号寄存通过寄存开始信号可以选择在上升沿触发开始start_reg01或者下降沿触发开始(start_reg10)亦或是高电平11或者低电平00作为开始信号。6.3.3发送数据与接收数据的时序分析根据模式选择的不同采样数据与接收数据需要根据模式来调整时序七 仿真结果7.1仿真代码timescale 1ns/1ps module test(); reg clk ; reg rst_n ; reg start_spi ; reg [7:0] data_i_spi ; wire [7:0] data_o_spi ; wire done_r ; wire done_w ; wire done_spi ; wire SCK ; wire MOSI ; wire CS_n ; always #10 clk~clk; initial begin clk0; rst_n1; start_spi0; #20 rst_n0; #20 rst_n1; #20 start_spi1; #20 start_spi0; #20000 $stop; end always (posedge clk or negedge rst_n) begin if(!rst_n) data_i_spi8haa; else if(done_w||done_r) data_i_spidata_i_spi8h11; end SPI_master SPI_master_tb( .clk (clk ), .rst_n (rst_n ), .start_spi (start_spi ), .data_i_spi (data_i_spi ), .data_o_spi (data_o_spi ), .data_len (5 ), .wr_lenth (3 ), .done_r (done_r ), .done_w (done_w ), .done_spi (done_spi ), .SCK (SCK ), .MOSI (MOSI ), .CS_n (CS_n ), .MISO (MOSI ) ); endmodule7.2结果与预想结果一致
返回列表