FPGA解析串口指令控制spi flash完成连续写、读、擦除数据

这篇具有很好参考价值的文章主要介绍了FPGA解析串口指令控制spi flash完成连续写、读、擦除数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近在收拾抽屉时找到一个某宝的spi flash模块,如下图所示,我就想用能不能串口来读写flash,大致过程就是,串口向fpga发送一条指令,fpga解析出指令控制flah,这个指令协议目前就是:
55 + AA + CMD + LEN_h + LEN_m + LEN_l + DATA
CMD:01 写;02 读;03 擦除(片擦除);
LEN_h/m/l:三个字节表示读写长度,高字节在前低字节灾后;
DATA:如果是写flah,DATA则为需要写入的数据,其它两种状态可以不填;
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

1. 串口指令解析

软件使用序列式状态机完成串口指令解析,最后解析出三个使能信号,以及相应的数据、长度、地址。
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		state<=S0;
	else begin
		case(state)
			S0:
				if(uart_vld)begin
					if(uart_dat == 8'h55)
						state<=S1;
					else
						state<=S0;					
				end else 
					state<=S0;					
			S1:
				if(uart_vld)begin
					if(uart_dat == 8'hAA)
						state<=S2;
					else
						state<=S0;					
				end else 
					state<=S1;
					
			S2:
				if(uart_vld)
					state<=S3;
				else
					state<=S2;
			S3://命令字
				if(uart_vld)
					state<=S4;
				else
					state<=S3;		
			S4://长度h
				if(uart_vld)
					state<=S5;
				else
					state<=S4;	
			S5://长度m
				if(uart_vld)
					state<=S6;
				else
					state<=S5;
			S6://长度l
				if(uart_vld)
					state<=S7;
				else
					state<=S6;
			S7:
				state<=S7;
			default:state<=S0;	
		endcase
	end

2. flash 控制

对于flash三个功能(读、写、擦书)分别设计了三个模块,每个模块完成对应功能以及输出flash的cs、sclk、sdi等信号,但是flash接口只有一组控制信号,因此需要对三个模块输出的flash控制信号进行选择输出,如下所示。

always@(posedge clk,negedge rst_n)
	if(!rst_n)begin
		o_spi_cen	<=1'b1;		
	   o_spi_sclk	<=1'b0; 		
	   o_spi_sdi	<=1'b0; 	
	end else begin
		case(work_state)
			3'b001:begin//xie
				o_spi_cen	<= wr_flash_csn		;
			   o_spi_sclk	<= wr_flash_sclk		;
			   o_spi_sdi	<= wr_flash_sdi		;
				end
			3'b010:begin//du
				o_spi_cen	<= rd_flash_csn		;
			   o_spi_sclk	<= rd_flash_sclk		;
			   o_spi_sdi	<= rd_flash_sdi		;
				end	
			3'b100:begin//cachu
				o_spi_cen	<= er_flash_csn		;
			   o_spi_sclk	<= er_flash_sclk		;
			   o_spi_sdi	<= er_flash_sdi		;
				end	
			default:begin
				o_spi_cen	<=1'b1;		
				o_spi_sclk	<=1'b0; 		
				o_spi_sdi	<=1'b0; 
			end
		endcase
	end

assign 	work_state	={spi_flash_erctl,spi_flash_rdctl,spi_flash_wrctl};			

2.1 flash写控制

软件对flash写控制的基本方法是收到一个串口数据就写进flash,并不是先缓存256个字节然后直接进行页编程,这样搞控制逻辑比较复杂。方法确定后就是软件实现,上级输出了vld和data(vld和data上上沿对齐,vld只有一个时钟宽度),使用vld作为触发条件,完成数据写入。
同样软件使用序列式状态机器进行流程控制。然后先写使能,然后正常写指令(02)、地址数据。
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		state<=S0;
	else if(clken)begin
		case(state)
			S0:
				if(spi_flash_ctlr[2] && vld_zk)
					state<=S1;
				else
					state<=S0;
			S1://xieshineng  function code 06
				if(&cnt && cnt_bit=='d7)
					state<=S2;
				else	
					state<=S1;
			S2://delay
				if(&cnt && cnt_bit==WIDTH-1)
					state<=S3;
				else	
					state<=S2;
			S3://xie gongneng ma 02
				if(&cnt && cnt_bit=='d7)
					state<=S4;
				else 
					state<=S3;
			S4://xie dizhi
				if(&cnt && cnt_bit=='d23)
					state<=S5;
				else 
					state<=S4;
			S5://xie shuju 
				if(&cnt && cnt_bit=='d7)
					state<=S6;
				else 
					state<=S5;
			S6:
				if(&cnt)
					state<=S7;
				else 
					state<=S6;
			S7:
				if(cnt_byte == wr_len)
					state<=S8;
				else
					state<=S0;
			S8:
				state<=S8;
			default:state<=S0;
		endcase
	end

fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

2.2 flash擦除

直接在写控制上面改,前面有个写使能,下图是擦除指令(C7/60)
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		state<=S0;
	else if(clken)begin
		case(state)
			S0:
				if(spi_flash_ctlr[2:1]==2'b01)
					state<=S1;
				else
					state<=S0;
			S1://xieshineng  function code 06
				if(&cnt && cnt_bit=='d7)
					state<=S2;
				else	
					state<=S1;
			S2://delay
				if(&cnt && cnt_bit==WIDTH-1)
					state<=S3;
				else	
					state<=S2;
			S3://
				if(&cnt && cnt_bit=='d7)
					state<=S6;
				else 
					state<=S3;
			S6:
				if(&cnt)
					state<=S7;
				else 
					state<=S6;
			S7:
					state<=S8;
			S8:
				state<=S8;
			default:state<=S0;
		endcase
	end

fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

2.3 flash读控制

从falsh读数据比较简单,接口时序如下图,软件实现同样还是序列式状态机,根据传入的长度决定读取的字节数。
因为数据从flash读出后需要通过串口发送,因此为了减少工作量,从flash读出一个数据,串口就发送一个数据,因此为了避免flash两个数据都读出来了串口一个都没发完,需要控制flash读数间隔,使得这个间隔大于串口发完一个字节的时间,举个栗子,假设现在串口波特率为115200,那么发完一个字节的时间约为86.8us(10位),那么flash读数间隔要大于86.9us。
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		state<=S0;
	else if(clken)begin
		case(state)
			S0:
				if(spi_flash_ctlr[2:1]==2'b01)
					state<=S1;
				else
					state<=S0;
			S1:
				state<=S2;
			S2://cs xian ladi 		
				if(&cnt)	
					state<=S3;
				else 
					state<=S2;
			S3://xie gongneng ma 02
				if(&cnt && cnt_bit=='d7)
					state<=S4;
				else 
					state<=S3;
			S4://xie dizhi
				if(&cnt && cnt_bit=='d23)
					state<=S5;
				else 
					state<=S4;
			S5://xie shuju 
				if(&cnt && cnt_bit=='d7)
					state<=S6;
				else 
					state<=S5;
			S6:
				if(&cnt)
					state<=S7;
				else 
					state<=S6;
			S7:
				if(cnt_byte == rd_len)
					state<=S8;
				else
					state<=S9;
			S9:
				if(dly_end)
					state<=S1;
				else 
					state<=S9;
			S8:
				state<=S8;
			default:state<=S0;
		endcase
	end

fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口

3. 实物测试

开始我设置的波特率为921600,擦除和写没问题,至少在时序上是很完美的,但是回读出来的数据如下图前十个字节一样,本来写入是01~0a,现在读出的数据中第2、3、5、7、9都是FF,后来我把波特率降到9600,然后就好了,下图最后10个字节。中间10个ff是擦除完后读出来数据。
软件工程链接:
软件工程、源码、仿真、数据手册、fllash仿真模型
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口
最后来张全家福
fpga如何实现从文件中读取数据在不断输出,fpga开发,spi,flash,spi flash,串口文章来源地址https://www.toymoban.com/news/detail-774422.html

到了这里,关于FPGA解析串口指令控制spi flash完成连续写、读、擦除数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】SPI读写FLASH闪存

    通信原理 SPI也是以主从方式工作,通常需要四根线来完成数据的传输,分别是MISO MOSI CS SCLK。以下是这四根线代表的含义: MISO:主设备输入,从设备输出 MOSI:主设备输出,从设备输入 CS :片选信号,选择进行通信的从设备 SCLK:时钟线,由主设备产生给到从设备 SPI通信的

    2024年02月16日
    浏览(40)
  • FPGA模块——SPI协议(读写FLASH)

    芯片引脚图: 内部结构图: 存储区域总共分成了32块,每块64KB。每块又分成了16个部分,每个部分4KB。方便进行读取和局部操作。 电路设计 SPI的四种模式 这里使用这个模式: 主机和从机在时钟上升沿放入要输出的数据,在时钟下降沿读取要输入的数据。 8个时钟后交换一个

    2024年02月05日
    浏览(48)
  • 【FPGA】SPI-FLASH-M25P16手册解读

    M25P16概述: M25P16是一款带有先进写保护机制和高速SPI总线访问的串行Flash存储器。M25P16特点如下: 存储结构:16M Bit(2M Byte)的存储空间,一共32个扇区(sector),每个扇区256页,每页256字节,每个字节的的存储地址由扇区地址(8bit)+页地址(8bit)+字节地址(8bit)构成。 SP

    2024年02月04日
    浏览(40)
  • STM32—HAL库中断/DMA控制和完成串口通信

    目录 一、解决的问题 二、串口通讯协议和RS-232的介绍以及USB/TTL转232模块的工作原理   1、 串口协议和RS-232标准:  (1)串口协议: (2)RS-232 标准:   2、RS232电平与TTL电平的区别   3、USB/TTL转232“模块(CH340芯片为例)  (1)基本原理:  (2)CH340模块介绍: ​三、搭

    2024年02月02日
    浏览(75)
  • K7系列FPGA进行FLASH读写1——CCLK控制(STARTUPE2原语)

      最近的工作涉及对 FPGA 进行远程更新,也就是通过远程通信接口将 .bin 文件送到 FPGA,然后写入 FLASH,这样当 FPGA 重新上电后就可以执行更新后的程序了。因此第一步工作就是进行 FLASH 的读写控制。   然而如果尝试配置 FLASH 管脚时,会发现 CCLK 管脚是不可配置的,这

    2024年02月05日
    浏览(45)
  • C51---串口发送指令,控制LED灯亮灭

    1.Code: #include \\\"reg52.h\\\" #include \\\"intrins.h\\\" sfr   AUXR = 0x8E; sbit  D5 = P3^7; void UartInit(void)        //9600bps@11.0592MHz {     //PCON = 0x7F;        //波特率不倍速     AUXR  = 0x01;         SCON  = 0x50;        //8位数据,可变波特率     //AUXR = 0xBF;        //定时器1时钟为Fosc/12,即12T

    2024年02月12日
    浏览(36)
  • FPGA 按键控制串口发送

    消抖时间一般为10ms,我使用的板子是ACX720,晶振为50MHZ,20ns为一周期。 状态机 模块设计 设计文件 仿真验证 **注意:**电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。 所以我们一定要养成模块之间共地的

    2024年04月11日
    浏览(38)
  • FPGA控制W5500完成UDP环回测试

    本文针对已经对W5500有一定了解,并且数据手册已经通读一遍的人群,因为博主目前只完成了UDP环回测试,因此在后文可能只介绍有关UDP部分。 1.FPGA核心板或者开发板; 2.W5500模块。下图是博主使用的模块; 3.网络调试助手,网上随便找一个就行; 主机与W5500通信有固定协议

    2024年02月06日
    浏览(33)
  • STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏 上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬

    2024年02月13日
    浏览(50)
  • STM32通过串口发送指令控制LED灯亮灭OLED并显示命令

    先来看看程序运行的结果吧: 接下来就不说废话了,自己看源代码吧!每一行我都做了注释: 首先是主函数main.c文件: 接下来是LED.h文件: 接下来是LED.c文件: 记下来是串口相关的Serial.h文件: 接下来就是最后一个serial.c文件了: 所有文件在工程中的目录为: 工程编译后下

    2024年04月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包