在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ZYNQ-QSPI Flash讀寫操作

冬至子 ? 來源:Embeddeder ? 作者:Vuko ? 2023-06-02 17:40 ? 次閱讀

Flash簡介

Flash存儲器,又叫做閃存,是一種非易失性存儲器。具有操作方便讀寫速度快等優點。一般用于存儲操作系統程序代碼,或者用于數據存儲。Flash的存儲單元組織為塊陣列,塊是擦除操作的最小單位,擦除操作將塊內的所有為置位為1,頁是讀寫操作的基本單位。在對頁進行寫操作前,要判斷該頁內所有位是否為1。如果全部為1可以寫操作,否則要對整塊進行擦除操作(Flash只能從1反轉到0)。Flash在內部結構(接口)上主要分為Nor flash 和NAND flash。Nor Flash :寫入和擦除的速度低;結構復雜,成本高;存儲容量較小;一般用于存儲Bootloader以及操作系統或者程序代碼,可以在芯片內部直接運行代碼。NAND Flash :寫入和擦除的速度較快;結構簡單,成本低;存儲容量較大;一般用于存儲材料和數據。

Flash在外部接口上主要分為CFI flash 和SPI(STD/Dual/Quad) flash。CFI flash 讀寫速度快,需要的硬件引腳多且不同容量的硬件不兼容;而SPI(STD/Dual/Quad) flash讀寫速度慢,需要的硬件引腳少且不同容量的硬件兼容。

QSPI Flash簡介

介紹

Quad-SPI閃存控制器是位于PS內的輸入/輸出外設(IOP)的一部分。它用于訪問多位串行閃存設備,以實現高吞吐量和低引腳數應用。

控制器可以以三種模式運行: I / O模式線性尋址模式傳統SPI模式

在I / O模式下,軟件與閃存設備協議緊密交互,所以在該模式下需要對協議進行詳細了解。軟件通過使用四個TXD寄存器將閃存命令和數據寫入控制器。軟件通過讀取RXD寄存器。

線性尋址模式使用設備操作的子集來消除I / O模式讀取閃存所需的軟件開銷。也就是說線性尋址模式比IO模式要快的多。線性模式采用硬件來向閃存發出命令,并控制從flash到AXI接口的數據。控制器響應AXI接口上的存儲器請求,就好像閃存是ROM存儲器。

在傳統模式下,QSPI控制器充當普通的SPI控制器。

控制器可以與一或兩個閃存設備接口。可以并行連接兩個設備以實現8位性能,也可以以堆疊的4位布局連接以最大程度地減少引腳數。

系統框圖

QSPI Flash 控制器的系統框圖如下所示:

圖片

從上圖中可知, QSPI Flash 控制器通過 MIO 與外部 Flash 器件連接,支持三種模式:單個從器件模式、雙從器件并行模式和雙從器件堆疊模式。雙從器件并行模式把每個flash的IO進行單獨連接,擴展成8位用于控制對不同flash的訪問。而雙從器件堆疊模式,使用SS片選信號進行區分flash的使能,所以想擴展 QSPI Flash 的存儲容量,可以使用雙從器件并行模式。

當使用單個設備時,直接存儲器讀取的地址映射從FC00_0000開始,最大為FCFF_FFFF(16 MB)。兩臺設備系統的地址映射取決于存儲設備和I / O配置。

QSPI Flash 控制器內部框圖

圖片

由上圖可知,在線性地址模式下,使用的是AXI的接口進行數據交互的,首先由AXI總線讀取到響應的指令,并存到Command FIFO,然后使用AXI to SPI的命令轉化器傳輸到選擇器。在IO模式下,使用的是APB接口直接把接收到的信號傳輸給選擇器進行選擇。然后選擇器進行功能選擇后傳輸到TxFIFO,接著把Tx FIFO的數據進行串行化,然后通過MIO引腳發送。接收部分原理相反,而且可以看出在線性地址模式下,接收信號的轉換使用的是數據轉換器。所以在線性地址模式下,只支持讀取數據,不支持發送數據。

流程控制

在數據傳輸期間,I / O模式具有不同的流控制模式。用戶可以在自動和手動模式之間進行選擇,該模式由config_reg.MANSTARTEN(Man_start_com)控制。在自動模式下,包括芯片選擇控制在內的整個傳輸過程都在硬件中完成。無需軟件干預。在手動模式下,用戶控制數據傳輸的開始。在這種情況下,軟件要么將整個傳輸序列寫入TxFIFO,要么直到TxFIFO已滿。在手動模式下,用戶除了控制傳輸開始之外,還可以選擇控制芯片選擇。從命令開始,軟件再次將傳輸序列寫入TxFIFO,直到TxFIFO已滿。然后,軟件拉高CS,然后手動啟動進行硬件管理。

編程指南

在xilinx給出的UG585指導手冊中,對QSPI Flash 控制器編程設計進行了指導開發,用戶可以根據自己的設計需要參考指導手冊中的編程順序實現自己的應用功能。

啟動順序

  1. 配置時鐘
  2. 配置發送/接收信號。(以上兩步在vivado底層搭建中已經完成設計)
  3. 重置控制器。
  4. 配置控制器。

配置控制器

該步驟適用于線性尋址和I / O模式。它配置了控制器的波特率,FIFO,flash模式,時鐘相位/極性和對環回延遲進行編程。

  1. 配置控制器。寫入qspi.Config_reg寄存器。a. 設置波特率[BAUD_RATE_DIV]。b. 選擇主模式,[MODE_SEL] = 1。C. 選擇flash模式(不是傳統SPI),[LEG_FLSH] = 1。d. 選擇Little Endian,[endian] = 0。e. 將FIFO寬度設置為32位[FIFO_WIDTH]。F. 設置時鐘相位[CLK_PH]和極性[CLK_POL]。
  2. 啟用回送時鐘。如果使用回送時鐘,確保將qspi.Config_reg [BAUD_RATE_DIV]設置為0b00,并使用以下設置配置qspi.LPBK_DLY_ADJ(回送延遲調整)寄存器:a. 設置為選擇內部時鐘。qspi.LPBK_DLY_ADJ [USE_LPBK] = 1。b. 將時鐘延遲設置為0。qspi.LPBK_DLY_ADJ [DLY0] = 0b00。c. 設置時鐘延遲1. qspi.LPBK_DLY_ADJ [DLY1] = 0b00。

線性尋址模式

線性尋址模式下數據讀取(存儲器讀取)的操作順序如下:

  1. 將手動啟動啟用設置為自動模式。設置qspi.Config_reg [Man_start_en] = 0。
  2. 使能片選信號。設置qspi.Config_reg [PCS] = 0。
  3. 將配置寄存器編程為線性尋址模式。
  4. 啟用控制器。設置qspi.En_REG [SPI_EN] = 1。
  5. 從線性地址存儲區讀取數據。內存范圍取決于大小和設備數量。范圍是從0xFC00_0000到0xFDFF_FFFF。
  6. 禁用控制器。設置qspi.En_REG [SPI_EN] = 0。
  7. 取消使能片選信號。設置qspi.Config_reg [PCS] = 1。

配置I / O模式

使用I / O模式進行讀取和寫入編程步驟如下:

  1. 啟用手動模式。qspi.Config_reg [Man_start_en,Manual_CS] = 1。
  2. 配置flash設備。對單個閃存設備使用qspi.LQSPI_CFG寄存器的重置值。如果是并行雙閃存設備,則將1寫入TWO_MEM,SEP_BUS位字段。
  3. 使能片選。設置qspi.Config_reg [PCS] = 0。
  4. 啟用控制器。設置qspi.En_REG [SPI_EN] = 1。
  5. 將字節序列寫入閃存。使用TXD從1到4字節寫入TxFIFO寄存器。
  6. 避免TxFIFO溢出。當TxFIFO為空時,可以寫入252個字節。此后,軟件可以通過讀取qspi.Intr_status_REG [TX_FIFO_full]并等待直到它等于0之后再寫入TXD寄存器,來避免TxFIFO溢出。
  7. 啟用中斷。寫入qspi.Intrpt_en_REG。
  8. 開始數據傳輸。設置qspi.Config_reg [Man_start_com] = 1。
  9. 中斷處理程序:在編程/讀取操作期間,將所有需要的數據傳輸到QSPI flash,并傳輸到Quad-SPI flash。
  10. 如果執行了讀取操作:重新排列READ數據以消除由于空循環而讀取的數據。
  11. 取消使能片選信號。設置QSPI.Config_reg [PCS] = 1。
  12. 禁用控制器。設置qspi.En_REG [SPI_EN] = 0。

I/O模式中斷服務程序

配置ISR以根據Quad-SPI器件類型處理中斷條件。要從Quad-SPI器件讀取數據,最簡單的ISR從RxFIFO讀取數據并將內容寫入TxFIFO。控制器生成系統外設中斷(SPI),IRQ ID#51。對以下兩種情況進行觸發中斷。a. 讀取傳輸中斷。RxFIFO不為空中斷 b. 寫傳輸中斷。TxFIFO未完全中斷

I/O模式中斷

中斷僅在I / O模式下使用。只要滿足任何中斷條件,控制器中斷就被置為有效。Quad-SPI中斷處理程序檢查中斷原因。單個中斷服務程序可以管理所有中斷條件。

Rx和Tx的中斷處理程序

中斷處理程序由IRQ ID#51觸發。示例讀取RxFIFO直到其為空,然后填充TxFIFO。RxFIFO非空中斷狀態用于確定是否可以從RxFIFO讀取內容。TxFIFO未滿中斷指示TxFIFO中是否有空間容納更多內容。

  1. 禁用控制器中的所有中斷。將qspi.Intrpt_dis_REG [TX_FIFO_not_full,RX_FIFO_full]都設置為1。
  2. 清除中斷。將1s寫入中斷狀態寄存器qspi.Intr_status_REG。
  3. 清空RxFIFO。檢查是否聲明了RxFIFO非空中斷。如果qspi.Intr_status_REG [RX_FIFO_not_empty] = 1,則RxFIFO中有數據。a. 如果狀態為有效,則從RxFIFO讀取數據。使用qspi.RX_data_REG寄存器讀取數據。b. 從RxFIFO讀取數據并輪詢中斷狀態,直到RxFIFO為空。當qspi.Intr_status_REG [RX_FIFO_not_empty] = 0時,RxFIFO為空。
  4. 填充TxFIFO。檢查TxFIFO未滿狀態是否有效。如果 qspi.Intr_status_REG [TX_FIFO_not_Full] = 1,則存在要發送到閃存設備的數據(編程和/或讀取操作):a. 將數據寫入qspi.TXD0寄存器。b. 輪詢qspi.Intr_status_REG [TX_FIFO_full] = 1,這表明TX FIFO已滿。c. 遵循步驟a和b,直到將所有數據寫入TxFIFO或直到qspi.Intr_status_REG[TX_FIFO_full] = 1。
  5. 啟用中斷。將qspi.Intrpt_en_REG [TX_FIFO_not_full,RX_FIFO_full]都設置為1。
  6. 開始數據傳輸。設置qspi.Config_reg [MANSTRTEN] = 1。

工程系統框圖

本次工程的系統框圖如下:

圖片

在本次工程設計中,使用QSPI Flash控制器對ZYNQ的QSPI Flash進行讀寫操作。通過對比讀取數據和寫入數據是否相等驗證讀寫功能是否正常。

硬件平臺搭建

新建工程,創建 Block Design。添加ZYNQ7 ip,根據本次工程需要對IP進行配置。勾選本次工程使用的資源。

圖片

完成對所用資源的勾選,

圖片

在clock configuration這里可以查看對QSPI的時鐘配置。

圖片

這里不需要對其他資源進行配置,所以可以使用默認配置。整體硬件系統構建完成如下:

圖片

然后我們進行generate output product 然后生成HDL封裝。這里用到了僅僅用到了PS部分的資源,所以不需要進行管腳分配。點擊導出硬件資源(不用包含bit流文件),接著launch SDK,進入軟件部分編寫。

SDK軟件部分

打開SDK后,新建application project。在system.mss中可以打開相關參考文檔輔助設計。

圖片

可以選擇qspi的例程進行參考設計,導入例程模板,

圖片

根據提供的模板,主要使用的函數如下,這里對他的讀寫測試進行了簡化,

int QspiFlashPolledExample(XQspiPs *QspiInstancePtr, u16 QspiDeviceId)
{
	int Status;
	u8 *BufferPtr;
	u8 UniqueValue;
	int Count;
	int Page;
	XQspiPs_Config *QspiConfig;
	//初始化QSPI
	QspiConfig = XQspiPs_LookupConfig(QspiDeviceId);
	XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig,QspiConfig- >BaseAddress);
	//自測
	Status = XQspiPs_SelfTest(QspiInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	//初始化讀寫BUFFER
	for (UniqueValue = UNIQUE_VALUE, Count = 0; Count < PAGE_SIZE;
	     Count++, UniqueValue++) {
		WriteBuffer[DATA_OFFSET + Count] = (u8)(UniqueValue + Test);
	}
	memset(ReadBuffer, 0x00, sizeof(ReadBuffer));
	//設置手動啟動和手動片選模式
	XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_MANUAL_START_OPTION |
			XQSPIPS_FORCE_SSELECT_OPTION |
			XQSPIPS_HOLD_B_DRIVE_OPTION);
	//設置QSPI時鐘的分頻系數
	XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8);
	//片選信號置為有效
	XQspiPs_SetSlaveSelect(QspiInstancePtr);
	//讀FLASH ID
	FlashReadID();
	//使能FLASH Quad模式
	FlashQuadEnable(QspiInstancePtr);
	//擦除FLASH
	FlashErase(QspiInstancePtr, TEST_ADDRESS, MAX_DATA);
	//向FLASH中寫入數據
	for (Page = 0; Page < PAGE_COUNT; Page++) {
		FlashWrite(QspiInstancePtr, (Page * PAGE_SIZE) + TEST_ADDRESS,
			   PAGE_SIZE, WRITE_CMD);
	}
	//使用QUAD模式從FLASH中讀出數據
	FlashRead(QspiInstancePtr, TEST_ADDRESS, MAX_DATA, READ_CMD);
	//對比寫入FLASH與從FLASH中讀出的數據
	BufferPtr = &ReadBuffer[DATA_OFFSET];
	for (UniqueValue = UNIQUE_VALUE, Count = 0; Count < MAX_DATA;
	     Count++, UniqueValue++) {
		if (BufferPtr[Count] != (u8)(UniqueValue + Test)) {
			return XST_FAILURE;
		}
	}
	return XST_SUCCESS;
}

運行效果

讀寫測試正常,運行效果如下:

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16361

    瀏覽量

    178050
  • STD
    STD
    +關注

    關注

    0

    文章

    36

    瀏覽量

    14359
  • Flash存儲器
    +關注

    關注

    3

    文章

    104

    瀏覽量

    25763
  • QSPI
    +關注

    關注

    0

    文章

    41

    瀏覽量

    12205
  • 選擇器
    +關注

    關注

    0

    文章

    108

    瀏覽量

    14539
收藏 人收藏

    評論

    相關推薦

    編譯可在QSPI Flash上運行的程序

    在前文中已經實現了一個能夠在 MDK 平臺進行下載代碼到 QSPI Flash 中的下載算法,以及一個能跳轉執行應用程序的 2nd Bootloader,但若想將代碼下載到 QSPI Flas
    的頭像 發表于 03-31 09:50 ?3152次閱讀
    編譯可在<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>上運行的程序

    使用PCIE更新AMD ZYNQQSPI Flash參考設計

    AMD ZYNQ 7000 的 S_AXI 端口提供了外設訪問 PS 內部外設控制器的接口,這其中包括 4 個 S_AXI_HP 端口以及兩個 S_AXI_GP 端口。一般來說,可以訪問的內部資源包括 DDR 控制器,QSPI 控制器,OCM,IIC,SPI 等。
    的頭像 發表于 11-17 10:02 ?1266次閱讀
    使用PCIE更新AMD <b class='flag-5'>ZYNQ</b>的<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>參考設計

    STM32H750 QSPI flash重映射模式下有方法能實現讀寫操作嗎?

    STM32H750 QSPI flash重映射模式下有方法能實現讀寫操作
    發表于 03-25 08:06

    STM32CUBEMX_H750_QSPI單片flash間接讀寫模式

    STM32CUBEMX_H750_QSPI單片flash間接讀寫模式使用STM32cubemx配置串口,QSPI等(QSPI 配置初始化是g
    發表于 12-09 06:39

    使用硬件QSPI讀寫SPI Flash的方法

    本篇詳細的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設與 SPI Flash 通信(W25Q64)。
    發表于 01-26 07:29

    什么是QSPI?如何使用QSPIQSPI Flash進行通信呢?

    ,然后是交替字節,空指令周期,最后是數據,任意兩個階段之間都是緊挨著的。  一般來說,每次與 QSPI Flash 通信都至少包含指令階段,其余的階段都是可選的,例如讀寫 QSPI
    發表于 03-17 15:17

    使用 PCIE 更新 AMD ZYNQ? 的 QSPI Flash 參考設計

    的內部資源包括 DDR 控制器,QSPI 控制器,OCM,IIC,SPI 等。 本教程提供一個最小的參考設計,使上位機可以通過 PCIE 端口,通過 S_AXI_GP0 端口訪問 ZYNQ 內部
    發表于 11-30 18:49

    如何使用QSPI Flash控制器開發板上的 QSPI Flash進行寫讀操作

    學習內容 本文首先介紹FlashQSPI Flash控制器的相關內容,然后使用 QSPI Flash 控制器,開發板上的
    的頭像 發表于 06-10 17:08 ?1.4w次閱讀
    如何使用<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>控制器開發板上的 <b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>進行寫讀<b class='flag-5'>操作</b>

    STM32內部Flash讀寫問題

    讀寫要注意幾點keil的.map文件中包含了什么操作不當導致Flash損壞會怎樣Flash上鎖與解鎖Keil編譯器如何查看MCU寄存器的值Flash
    發表于 12-01 20:21 ?20次下載
    STM32內部<b class='flag-5'>Flash</b><b class='flag-5'>讀寫</b>問題

    【STM32Cube-18】使用硬件QSPI讀寫SPI Flash(W25Q64)

    本篇詳細的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設與 SPI Flash 通信(W25Q64)。
    發表于 12-01 21:06 ?14次下載
    【STM32Cube-18】使用硬件<b class='flag-5'>QSPI</b><b class='flag-5'>讀寫</b>SPI <b class='flag-5'>Flash</b>(W25Q64)

    STM32單片機基礎18——使用硬件QSPI讀寫SPI Flash(W25Q64)

    本篇詳細的記錄了如何使用STM32CubeMX配置STM32L431RCT6的硬件QSPI外設與 SPI Flash 通信(W25Q64)。1. 準備工作硬件準備開發板首先需要準備一個開發板,這里我
    發表于 12-02 10:21 ?19次下載
    STM32單片機基礎18——使用硬件<b class='flag-5'>QSPI</b><b class='flag-5'>讀寫</b>SPI <b class='flag-5'>Flash</b>(W25Q64)

    nrf5340 LCD和flash 共用Qspi 息屏導致flash讀寫問題

    操作flash,影響qspr的時序,導致flash讀寫錯誤。現象表現:CPU工作頻率低于qspr頻率時,影響flash
    發表于 12-07 20:36 ?10次下載
    nrf5340 LCD和<b class='flag-5'>flash</b> 共用<b class='flag-5'>Qspi</b> 息屏導致<b class='flag-5'>flash</b><b class='flag-5'>讀寫</b>問題

    STM32H743+CubeMX-QSPI讀寫外部FLASH(W25Q128JVSQ)

    的開發板上使用的是已經停產的華邦的W25Q128FV外部FLASH,這塊老FLASHQSPI上的編程比較坑,
    發表于 12-27 18:36 ?41次下載
    STM32H743+CubeMX-<b class='flag-5'>QSPI</b><b class='flag-5'>讀寫</b>外部<b class='flag-5'>FLASH</b>(W25Q128JVSQ)

    微控制器外置QSPI Flash選型的注意事項

    為了擴展微控制器可用的 Flash 空間,用戶可以使用 QSPI 接口連接 QSPI Flash;為了讓用戶能盡量像使用片內 Flash
    的頭像 發表于 04-07 09:23 ?2117次閱讀

    Zynq中程序存儲位置和設置方法

    Zynq中存儲程序的地方有QSPI Flash,SD卡,EMMC。
    的頭像 發表于 10-17 17:00 ?1845次閱讀
    主站蜘蛛池模板: 国产成人综合一区人人| 国产成人教育视频在线观看| www.4虎影院| 成人免费一区二区三区| 最新人妖shemaletube人妖| 亚洲第一区精品日韩在线播放| 久久免费精品| 最好看的最新中文字幕2018免费视频 | 日日噜噜夜夜狠狠久久aⅴ | 一级一片一a一片| 美女国产精品| 特黄特黄一级高清免费大片| 亚洲电影在线看| 久久国产伦三级理电影| 天天操免费视频| 久久婷婷激情| 久久成人免费网站| 久草3| 香蕉视频黄色在线观看| 国产精品成人四虎免费视频| 色成人免费网站| 色偷偷资源网| 天天躁狠狠躁| 黄网站视频在线观看| 久久久蜜桃| www干| 日韩三级中文| 上色天天综合网| 亚洲综合色一区二区三区小说| 国产精品乳摇在线播放| 黑人40厘米全进去xxxx猛交| 日本免费人成在线网站| 欧美影院在线| 亚洲www.| 天天视频国产免费入口| 中文字幕11页| jiuse视频| 老师下面好紧| 成年片免费网址网站| 性久久久久| 国产伦理一区二区三区|