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

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

3天內不再提示

如何開發功能齊全的QSPI驅動

嵌入式程序員 ? 來源:嵌入式程序猿 ? 作者:嵌入式程序猿 ? 2020-09-25 14:42 ? 次閱讀

1. 摘要

本篇筆記主要介紹,如何開發穩定可靠,功能齊全的QSPI驅動。

2. 準備工作

1, IAR 8.32.1

2, STM32Cube_FW_H7_V1.6.0

3. QSPI簡介

4. QSPI驅動

在項目的開發中,我們經常會使用外掛Flash在做一些應用,而STM32H743帶QSPI接口,可以用來外掛QSPI Flash,在之前的推送中我們以winbond華邦的W25Q256為例給大家說明了下QSPI的操作,借助ST的HAL庫例程可以快速驗證,不同型號的QSPI Flash會有一些參數和命令區別,大家應用時候要注意,例如美光和華邦的有的命令碼就不同。ST的驅動里STM32H743的評估板是以美光的MT25T_QLKT_L_01G為例。如果你使用不同的型號,請注意區分,既然是評估板,那么就只是給大家參考,在正式的項目中,還需要考慮一些其他的問題。

5. 驅動架構

驅動的架構可以參考STM32Cube_FW_H7中對QSPI Flash驅動架構,也可以自己做架構,盡量簡單明了,易用且穩定。對具體型號Flash的驅動可以放在一個文件下建立一個.c和.h. 如我們以華邦的W25Q系列為例,

還可以建立一個文本文檔,用來記錄驅動的一些變更,發布筆記等。

BSP層可以在BSP文件夾下建立QSPI的驅動,名字可以參考ST庫,也可以按照自己的命名規則來定,或者企業的軟件文件命名規則來定。

建立好這些文件后,接下來可以動手開發了。開發的時候可以先畫一些圖,除過正常的初始化,去初始化,外,考慮都包含那些功能,那些模式,那些命令,那些安全管理。那些中斷,是否可以用DMA操作等。還要考慮數據結構類型,配置信息,錯誤碼等。這些一定要結合數據手冊來考慮和分析。

5.1 初始化和去初始化

這部分相對比較簡單,可以參考例程,市面上的開發板,編碼風格和良莠不齊,大家盡量參考官方的資料和文檔,要考慮檢查返回值,初始化有沒有成功。跟硬件相關的管腳,時鐘等大家根據自己的應用去定,H743我一般跑400M. 官方的大部分例程也都是跑在400M.

5.2 驅動模式

從手冊可以知道分為間接模式,狀態輪詢模式,內存映射模式,那么我們的驅動就要能夠分別支持這三種模式。在stm32h743i_eval_qspi.h里面定義這些模式和其他數據類型。這些可以參考官方的定義

在w25q256.h中定義跟flash相關的數據類型,結構體,宏定義等。如QSPI的操作模式,這里要明白1-1-1,1-1-2,1-1-4,1-4-4等的含義,因為QSPI包含這四種,指令單線,地址單線/4線,數據單線/兩線/四線,這些在flash的數據手冊指令表里都會標出,支持那種操作,而我們在驅動中要綜合考慮這四種。

命令表的定義,這個要注意不同型號的FLASH,會稍有區別,即使同一家的不同型號的可能也有區別,如華邦256M和1G的指令就有一些個別的不同。恰好這兩款我都用過,在這里給大家提一下。由于指令比較多,這里就不一一列舉了,只截取其中一部分,具體指令表的定義可以參考flash手冊,

但是建議大家在做驅動的時候對所有指令做支持,這樣在用的時候就很方便,而不是用的時候發現少,在去填補??梢苑謩e做成子函數,例如讀取ID,可以做一些校驗

很多指令的內容官網的驅動里都沒有,需要我們自己去做。

5.3 狀態寄存器讀寫

W25Q系列一般有三個狀態寄存器,用來表示一些狀態,如狀態寄存器1就可以通過讀取來判斷flash的狀態,有沒有忙,寫使能有沒有打開,以及保護位保護了那些地址,這些都要自己去實現,市面上包括官方的例程驅動里都沒有,假如你不判斷的話,如果要寫的地址被保護,是寫不進去的,還有可能出現異常,這些都可以通過讀取狀態寄存器1和2來判斷和處理。以及結合WP腳。

這些功能在正式的產品中我們一定要考慮,否則你的驅動就不穩定,不安全,因為工業現場各種干擾,以及其他異常情況??赡苣阍趯嶒炇遗艿暮煤玫拇a,到現場就不行了

5.4 讀寫擦驅動

擦除操作比較耗時,所以如果你是用查詢模式的話,要不斷去查詢狀態,而不能死等,從手冊可以看除時間量級,擦除正片最大需要1000s,還是比較耗時,即使最小的擦除單元4k擦除,最壞情況也需要400ms。用中斷或者DMA方式操作的話不涉及,但DMA的話中斷需要好幾個,有命令,完成,狀態匹配,收發完成等。要熟悉這些大概時間量級。方便參考?;诓煌J降尿寗游覀冊诠娞柪锒冀o大家介紹過。

讀寫驅動,可以參考官網的例程,但是要加一些改動,如考慮讀寫失敗怎么辦,超時退出,如果連續兩次還是失敗,怎么考慮,我們一般會考慮嘗試三次,如果第一次失敗就嘗試第二次讀取,第二次失敗,嘗試第三次,這樣可以大大加強安全性,可能99.99%的情況下一次就成功,但不排除失敗的可能性。此外還要考慮參數的保護。

5.4.1 擦除

可以按照擦除單位來綜合寫一個函數

這里要注意就是W25Q256 和W25Q01J 的一些區別。如有的指令前者支持指令地址四線,而后者不支持。

5.4.2 讀操作

讀操作要考慮是single還是dual模式,分別出兩個子函數,讀的指令不同,時序也不同

建議大家一個指令做一個子函數。如0x6C和0xEC的時序和操作模式就不同,如0X6c

代碼實現

從時序圖可以看到指令單線,地址單線,數據4線即 1-1-4模式。0xEC留給大家去聯系實現。

5.4.3 寫操作

寫操縱也有幾條不同的命令

不同的時序和方式,可以寫成不同的子函數,我們以34h為例子

通過時序圖可以看到是指令單線,地址單線,數據四線,這樣就可以實現寫操作了。

5.5 異常

通常我們還需要去管理和處理一些異常情況,例如下面的定義,你也可以按照自己的方式,總之要對異常和錯誤做一些管理。

官方的例子基本上每個都有返回值,大家可以去參考,這樣使你的驅動更安全可靠。

5.6 其他

其他一些應考慮的問題,大家可以根據自己的需求和應用在添加,這里就不在贅述。

6. 測試驗證

開發完后,就可以寫一個簡答的測試程序,對自己的驅動進行測試,因為我是在freeRTOS系統下用的,所以建立一個QSPI的測試任務,去實現擦,寫,讀,比較的功能和驗證。截取幾張測試圖

7. 參考文檔

序號 文獻
1 STM32H743RM
2 STM32Cube_FW_H7_V1.6.0

原文標題:如何寫好QSPI驅動

文章出處:【微信公眾號:嵌入式程序猿】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    11

    文章

    1723

    瀏覽量

    84444
  • QSPI
    +關注

    關注

    0

    文章

    39

    瀏覽量

    11997

原文標題:如何寫好QSPI驅動

文章出處:【微信號:InterruptISR,微信公眾號:嵌入式程序員】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    stm32l476 QSPI如何退出 Memory_Mapped MODE?

    下將數據寫入外部QSPI的RAM中。 然后再將QUADSPI切換到QSPI_FUNCTIONAL_MODE_MEMORY_MAPPED模式,將數據發送出去。 現在功能已經實現。但是要進行下一
    發表于 04-10 07:12

    STM32 QSPI怎么退出映射模式?

    我使用QSPI FLASH 作為放置主程序的地方,首先從BOOT 啟動,將QSPI 映射到0X90000000, 然后跳轉到0X90000000, 但是當我需要OTA 的時候,我必須跳到 內部
    發表于 03-29 08:15

    無法使用STWB5MMG的QSPI IO2怎么解決?

    無法使用STWB5MMG的QSPI IO2 CS:PA2 CLK: PA3 IO0: PB9 IO1: PB8 IO2: PA7----->驅動W25Q64(芯片正常),我用QSPI 4線傳輸的時候, 唯獨這個線上的數據
    發表于 03-26 07:09

    STM32H7B0通過QSPI地址映射外部flash開始使用正常,出現QSPI功能異常是什么原因導致的?

    STM32H7B0 通過QSPI地址映射外部flash開始使用正常,后面出現QSPI功能異常(直接尋址和地址映射均不能訪問外部flash),QSPI IO2作為
    發表于 03-08 06:34

    QSPI使用GPIO當做SLSO,如何使用QSPI emulate模式?

    如果將某個GPIO設置成Output作為SPISLSO(CS線),該如何使用QSPI emulate模式么,詳細描述見TC275芯片手冊第1969頁。不知道Port以及相應寄存器該怎么配置,看芯片手冊不能完全理解。
    發表于 02-20 08:24

    如何在PSOC 6中初始化QSPI?

    我正在使用 QSPI 進行外部閃存讀/寫。 我打電話 結果 = cy_serial_flash_qspi_init ( sfdp_slaveslot_1_config、CYBSP_QSPI
    發表于 01-26 07:48

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

    QSPI 控制器,用來更新 Flash 的啟動分區。 軟件方面,移植了 Embedded SW 的相關驅動代碼至 xdma 平臺,并提供了一個簡單的上位機測試程序,用來燒寫啟動鏡像至 Flash 分區
    發表于 11-30 18:49

    AT32 MCU QSPI應用說明

    AT32 MCU QSPI Application Note主要介紹以下幾部分內容:1. 基于雅特力提供的V2.x.x 的BSP 板級支持包來進行QSPI 的命令端口的配置及操作2. 基于雅特力提供
    發表于 10-25 06:18

    QSPI硬件實現驅動功能原理解析

    左圖為主芯片的內部QSPI的控制器,右圖則為外部的支持QSPI協議的外部Flash,兩者之間通過QSPI協議接口連接,包含1個CLK引腳,1個CS引腳與4個用于傳輸數據的IO引腳。
    發表于 10-19 10:15 ?2467次閱讀
    <b class='flag-5'>QSPI</b>硬件實現<b class='flag-5'>驅動</b><b class='flag-5'>功能</b>原理解析

    QSPI Flash驅動功能解析和使用注意事項

    QSPI全稱為“Queued SPI”,本質上是屬于SPI協議的一種,一般來說,SPI協議可以分為Standard SPI,Dual SPI,以及本文要講解的Queued SPI。只不過Dual SPI,Queued SPI常用于作為SPI Flash的通信接口。
    的頭像 發表于 10-19 10:09 ?1214次閱讀
    <b class='flag-5'>QSPI</b> Flash<b class='flag-5'>驅動</b><b class='flag-5'>功能</b>解析和使用注意事項

    利用MPLAB Harmony v3在Cortex-M7 MCU上實現QSPI的就地執行(XIP)功能

    電子發燒友網站提供《利用MPLAB Harmony v3在Cortex-M7 MCU上實現QSPI的就地執行(XIP)功能.pdf》資料免費下載
    發表于 09-20 14:54 ?0次下載
    利用MPLAB Harmony v3在Cortex-M7 MCU上實現<b class='flag-5'>QSPI</b>的就地執行(XIP)<b class='flag-5'>功能</b>

    QSPI閃存的主機編程

    電子發燒友網站提供《QSPI閃存的主機編程.pdf》資料免費下載
    發表于 09-14 11:08 ?0次下載
    <b class='flag-5'>QSPI</b>閃存的主機編程

    請問M032的QSPI支持哪些FLASH芯片型號?

    你好,請問M032的QSPI支持哪些FLASH芯片型號?BSP里有sample code,但是并沒有具體的FLASH芯片型號。 Numaker-M032SE開發板上也沒有。
    發表于 08-18 08:24

    HbirdV2-SoC中如何配置QSPI1和QSPI2的時鐘極性CPOL和時鐘相位CPHA?

    HbirdV2-SoC中QSPI0的時鐘極性CPOL和時鐘相位CPHA可以通過SPI_SCKMODE寄存器來配置;在QSPI1和QSPI2中沒有找到相關寄存器,如何配置QSPI1和
    發表于 08-12 06:17

    Vitis-Vivado強制JTAG模式燒錄QSPI方法

    本教程提供 VITIS 2021.1 QSPI-FLASH 下載方法如下
    的頭像 發表于 07-07 14:14 ?2495次閱讀
    Vitis-Vivado強制JTAG模式燒錄<b class='flag-5'>QSPI</b>方法
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>