国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA解析串口指令控制spi flash完成連續(xù)寫、讀、擦除數(shù)據(jù)

這篇具有很好參考價值的文章主要介紹了FPGA解析串口指令控制spi flash完成連續(xù)寫、讀、擦除數(shù)據(jù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

最近在收拾抽屜時找到一個某寶的spi flash模塊,如下圖所示,我就想用能不能串口來讀寫flash,大致過程就是,串口向fpga發(fā)送一條指令,fpga解析出指令控制flah,這個指令協(xié)議目前就是:
55 + AA + CMD + LEN_h + LEN_m + LEN_l + DATA
CMD:01 寫;02 讀;03 擦除(片擦除);
LEN_h/m/l:三個字節(jié)表示讀寫長度,高字節(jié)在前低字節(jié)災后;
DATA:如果是寫flah,DATA則為需要寫入的數(shù)據(jù),其它兩種狀態(tài)可以不填;
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口

1. 串口指令解析

軟件使用序列式狀態(tài)機完成串口指令解析,最后解析出三個使能信號,以及相應的數(shù)據(jù)、長度、地址。
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),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寫控制的基本方法是收到一個串口數(shù)據(jù)就寫進flash,并不是先緩存256個字節(jié)然后直接進行頁編程,這樣搞控制邏輯比較復雜。方法確定后就是軟件實現(xiàn),上級輸出了vld和data(vld和data上上沿對齊,vld只有一個時鐘寬度),使用vld作為觸發(fā)條件,完成數(shù)據(jù)寫入。
同樣軟件使用序列式狀態(tài)機器進行流程控制。然后先寫使能,然后正常寫指令(02)、地址數(shù)據(jù)。
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),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如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口

2.2 flash擦除

直接在寫控制上面改,前面有個寫使能,下圖是擦除指令(C7/60)
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),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如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口

2.3 flash讀控制

從falsh讀數(shù)據(jù)比較簡單,接口時序如下圖,軟件實現(xiàn)同樣還是序列式狀態(tài)機,根據(jù)傳入的長度決定讀取的字節(jié)數(shù)。
因為數(shù)據(jù)從flash讀出后需要通過串口發(fā)送,因此為了減少工作量,從flash讀出一個數(shù)據(jù),串口就發(fā)送一個數(shù)據(jù),因此為了避免flash兩個數(shù)據(jù)都讀出來了串口一個都沒發(fā)完,需要控制flash讀數(shù)間隔,使得這個間隔大于串口發(fā)完一個字節(jié)的時間,舉個栗子,假設現(xiàn)在串口波特率為115200,那么發(fā)完一個字節(jié)的時間約為86.8us(10位),那么flash讀數(shù)間隔要大于86.9us。
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),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如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口

3. 實物測試

開始我設置的波特率為921600,擦除和寫沒問題,至少在時序上是很完美的,但是回讀出來的數(shù)據(jù)如下圖前十個字節(jié)一樣,本來寫入是01~0a,現(xiàn)在讀出的數(shù)據(jù)中第2、3、5、7、9都是FF,后來我把波特率降到9600,然后就好了,下圖最后10個字節(jié)。中間10個ff是擦除完后讀出來數(shù)據(jù)。
軟件工程鏈接:
軟件工程、源碼、仿真、數(shù)據(jù)手冊、fllash仿真模型
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口
最后來張全家福
fpga如何實現(xiàn)從文件中讀取數(shù)據(jù)在不斷輸出,fpga開發(fā),spi,flash,spi flash,串口文章來源地址http://www.zghlxwxcb.cn/news/detail-774422.html

到了這里,關(guān)于FPGA解析串口指令控制spi flash完成連續(xù)寫、讀、擦除數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【FPGA】SPI讀寫FLASH閃存

    【FPGA】SPI讀寫FLASH閃存

    通信原理 SPI也是以主從方式工作,通常需要四根線來完成數(shù)據(jù)的傳輸,分別是MISO MOSI CS SCLK。以下是這四根線代表的含義: MISO:主設備輸入,從設備輸出 MOSI:主設備輸出,從設備輸入 CS :片選信號,選擇進行通信的從設備 SCLK:時鐘線,由主設備產(chǎn)生給到從設備 SPI通信的

    2024年02月16日
    瀏覽(26)
  • FPGA模塊——SPI協(xié)議(讀寫FLASH)

    FPGA模塊——SPI協(xié)議(讀寫FLASH)

    芯片引腳圖: 內(nèi)部結(jié)構(gòu)圖: 存儲區(qū)域總共分成了32塊,每塊64KB。每塊又分成了16個部分,每個部分4KB。方便進行讀取和局部操作。 電路設計 SPI的四種模式 這里使用這個模式: 主機和從機在時鐘上升沿放入要輸出的數(shù)據(jù),在時鐘下降沿讀取要輸入的數(shù)據(jù)。 8個時鐘后交換一個

    2024年02月05日
    瀏覽(20)
  • 【FPGA】SPI-FLASH-M25P16手冊解讀

    【FPGA】SPI-FLASH-M25P16手冊解讀

    M25P16概述: M25P16是一款帶有先進寫保護機制和高速SPI總線訪問的串行Flash存儲器。M25P16特點如下: 存儲結(jié)構(gòu):16M Bit(2M Byte)的存儲空間,一共32個扇區(qū)(sector),每個扇區(qū)256頁,每頁256字節(jié),每個字節(jié)的的存儲地址由扇區(qū)地址(8bit)+頁地址(8bit)+字節(jié)地址(8bit)構(gòu)成。 SP

    2024年02月04日
    瀏覽(20)
  • STM32—HAL庫中斷/DMA控制和完成串口通信

    STM32—HAL庫中斷/DMA控制和完成串口通信

    目錄 一、解決的問題 二、串口通訊協(xié)議和RS-232的介紹以及USB/TTL轉(zhuǎn)232模塊的工作原理? ?1、?串口協(xié)議和RS-232標準: ?(1)串口協(xié)議: (2)RS-232 標準:? ?2、RS232電平與TTL電平的區(qū)別? ?3、USB/TTL轉(zhuǎn)232“模塊(CH340芯片為例)? (1)基本原理:? (2)CH340模塊介紹: ?三、搭

    2024年02月02日
    瀏覽(29)
  • K7系列FPGA進行FLASH讀寫1——CCLK控制(STARTUPE2原語)

    K7系列FPGA進行FLASH讀寫1——CCLK控制(STARTUPE2原語)

    ??最近的工作涉及對 FPGA 進行遠程更新,也就是通過遠程通信接口將 .bin 文件送到 FPGA,然后寫入 FLASH,這樣當 FPGA 重新上電后就可以執(zhí)行更新后的程序了。因此第一步工作就是進行 FLASH 的讀寫控制。 ??然而如果嘗試配置 FLASH 管腳時,會發(fā)現(xiàn) CCLK 管腳是不可配置的,這

    2024年02月05日
    瀏覽(31)
  • C51---串口發(fā)送指令,控制LED燈亮滅

    C51---串口發(fā)送指令,控制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位數(shù)據(jù),可變波特率 ?? ?//AUXR = 0xBF;?? ??? ?//定時器1時鐘為Fosc/12,即12T

    2024年02月12日
    瀏覽(15)
  • FPGA 按鍵控制串口發(fā)送

    FPGA 按鍵控制串口發(fā)送

    消抖時間一般為10ms,我使用的板子是ACX720,晶振為50MHZ,20ns為一周期。 狀態(tài)機 模塊設計 設計文件 仿真驗證 **注意:**電平信號的傳輸線中有一個參考電平線(一般是GND),然后信號線上的信號值是由信號線電平和參考電平線的電壓差決定。 所以我們一定要養(yǎng)成模塊之間共地的

    2024年04月11日
    瀏覽(15)
  • FPGA控制W5500完成UDP環(huán)回測試

    FPGA控制W5500完成UDP環(huán)回測試

    本文針對已經(jīng)對W5500有一定了解,并且數(shù)據(jù)手冊已經(jīng)通讀一遍的人群,因為博主目前只完成了UDP環(huán)回測試,因此在后文可能只介紹有關(guān)UDP部分。 1.FPGA核心板或者開發(fā)板; 2.W5500模塊。下圖是博主使用的模塊; 3.網(wǎng)絡調(diào)試助手,網(wǎng)上隨便找一個就行; 主機與W5500通信有固定協(xié)議

    2024年02月06日
    瀏覽(18)
  • STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    串口屏是一個集成了單片機的屏幕模塊,采用的是TTL串口協(xié)議,可以直接通過對應指令控制屏幕, 本文采用的串口屏是陶晶馳T0系列的基本型,目的是通過單片機的串口來控制串口屏 上面僅是一部分常用的基礎指令,更多更仔細的指令或者函數(shù)可以訪問陶晶馳資料官網(wǎng)。 硬

    2024年02月13日
    瀏覽(29)
  • STM32通過串口發(fā)送指令控制LED燈亮滅OLED并顯示命令

    STM32通過串口發(fā)送指令控制LED燈亮滅OLED并顯示命令

    先來看看程序運行的結(jié)果吧: 接下來就不說廢話了,自己看源代碼吧!每一行我都做了注釋: 首先是主函數(shù)main.c文件: 接下來是LED.h文件: 接下來是LED.c文件: 記下來是串口相關(guān)的Serial.h文件: 接下來就是最后一個serial.c文件了: 所有文件在工程中的目錄為: 工程編譯后下

    2024年04月16日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包