ING916 的 SPI0 通過(guò) AHB 總線連接到處理器,支持 4 線模式,以存儲(chǔ)映射方式只讀訪問(wèn) (https://ingchips.github.io/drafts/pg_ing916/ch-spi.html#qspi-讀取和xip)時(shí)支持 XIP。通過(guò) SPI0 外掛串行 NOR Flash,處理器就可以通過(guò)映射方式讀取 NOR Flash 里的內(nèi)容。對(duì)于開發(fā)者而言, 這塊外掛 NOR Flash 可存放程序、只讀數(shù)據(jù)等,可被 Cache “加速”,像內(nèi)置 Flash 一樣,使用方便。
SDK 從v8.4.19開始:1)自動(dòng)安裝 W25Q 燒寫算法;2)支持串口和 USB 燒錄。
01 芯片選型
SPI0 配置到專門的高速管腳可獲得最高的傳輸速率。建議結(jié)合項(xiàng)目需要,確定 ING916 和 NOR Flash 的選型。
02 開發(fā) Flash燒寫算法
下一步是為 NOR Flash 開發(fā)燒寫算法。由于燒寫算法不便調(diào)試,我們可以先在一個(gè)“普通”程序里實(shí)現(xiàn)相關(guān)的函數(shù), 測(cè)試正常后再轉(zhuǎn)換為燒寫算法。
用程序讀寫外部 Flash
注意:必須使用 SDK v8.4.10 或更高版本的 Cube。對(duì)于較低版本的 SDK, 請(qǐng)使用外設(shè)驅(qū)動(dòng)。
先用 Wizard 創(chuàng)建一個(gè) ING916 項(xiàng)目,打開 Cube。假設(shè)我們決定選用 ING91682C,在 Cube 里把封裝切換為 ING91682C, 然后直接點(diǎn)擊 “Set to High Speed Pins” 為 SPI0 配置高速管腳:
切換到時(shí)鐘樹界面,確認(rèn) SPI0 時(shí)鐘為 24MHz 慢時(shí)鐘(注:開發(fā)調(diào)試階段先使用較低的時(shí)鐘頻率。),回到 SPI0 的設(shè)置頁(yè)面, 將 Basic Settings 的 “Clock frequency” 設(shè)置為 24MHz。
說(shuō)明:時(shí)鐘樹界面的 SPI0 時(shí)鐘為 SPI0 硬件模塊的驅(qū)動(dòng);而 Basic Settings 的 “Clock frequency” 為 SPI0 (主模式下) 輸出的 CLK 信號(hào)的頻率,由驅(qū)動(dòng)分頻得來(lái)。
參考 NOR Flash 數(shù)據(jù)手冊(cè),開發(fā)、調(diào)試相關(guān)的操作函數(shù),如擦除、寫入、設(shè)置模式等。
以AHB_QSPI_MEM_BASE為起始地址可直接以存儲(chǔ)映射方式讀取 NOR Flash 里的數(shù)據(jù)。讀取時(shí),SPI0 不需要任何特殊設(shè)置。
待功能驗(yàn)證正常后,可酌情優(yōu)化傳輸速率:提供 SPI0 時(shí)鐘、設(shè)置 NOR Flash 的 4 線模式等。 如果需要以 2 線或者 4 線模式讀取 NOR Flash,需要配置 SPI0 的MemAccessCmd參數(shù)。請(qǐng)參考 NOR Flash 數(shù)據(jù)手冊(cè), 選擇合適的命令和時(shí)序。MemAccessCmd默認(rèn)為SPI_MEMRD_CMD_03,單線模式。
// 示例:設(shè)置為使用 EB 命令(4 線模式) apSSP_SetMemAccessCmd(AHB_SSP0,SPI_MEMRD_CMD_EB);
將程序轉(zhuǎn)換為 Flash 燒寫算法
下一步是通過(guò)上面的 NOR Flash 操作函數(shù)實(shí)現(xiàn)下載工具或者 IDE 要求的 Flash 燒寫接口。以 Keil 為例, 需要實(shí)現(xiàn) 4 個(gè)必備的接口:
Init: 初始化
UnInit: 反初始化
EraseSector: 擦除一個(gè)扇區(qū)
ProgramPage: 寫入一頁(yè)
Flash 的特性、地址范圍等在FlashDev.c的定義,如示例中:
structFlashDeviceconstFlashDevice ={ FLASH_DRV_VERS,// Driver Version, do not modify! "INGCHIPS 91600 EXT W25Q",// Device Name EXTSPI,// Device Type 0x04000000,// Device Start Address (A) 0x01000000,// Device Size in Bytes (B) 4096,// Programming Page Size (C) 0,// Reserved, must be 0 0xFF,// Initial Content of Erased Memory 800,// Program Page Timeout 100 mSec 3000,// Erase Sector Timeout 3000 mSec // Specify Size and Address of Sectors 0x1000,0x000000,// Sector Size 4kB (D) SECTOR_END };
其中,名稱可任意填寫;起始地址 A 為固定值(AHB_QSPI_MEM_BASE),不可修改; B 既可根據(jù)實(shí)際情況填寫,也可以填寫一個(gè) Flash 同系列型號(hào)所支持的最大容量(W25Q 地址 24bit,最大支持 16MiB),當(dāng)以后更換容量更大的 Flash 型號(hào)時(shí),不需要更改燒寫算法; D 務(wù)必根據(jù)實(shí)際情況填寫扇區(qū)大?。籆 為燒錄時(shí)一頁(yè)的大小,由于 Flash 可能不支持按頁(yè)擦除、卻一定支持按扇區(qū)擦除, 所以這里把它設(shè)置為一個(gè)扇區(qū)的大小。
03 使用外部Flash
用 Wizard 創(chuàng)建一個(gè) ING916 項(xiàng)目(假設(shè)名為use_ext_flash)。打開 Cube,切換到所選用的封裝,打開 SPI0 的時(shí)鐘,并為 SPI0 配置管腳。 在 Keil 里打開項(xiàng)目的 Target 設(shè)置,添加一塊外部 Flash,起始地址為AHB_QSPI_MEM_BASE:
進(jìn)入燒寫算法設(shè)置頁(yè)面,添加外部 Flash 燒寫算法,添加完成后,這個(gè)項(xiàng)目存在兩個(gè)燒寫算法:
為項(xiàng)目添加一個(gè)新的文件demo.c,寫一個(gè)測(cè)試函數(shù):
#include"platform_api.h" voidhello_world(void) { platform_printf("hello from EXT flash "); }
在set_profile()里調(diào)用這個(gè)函數(shù):
externvoidhello_world(void); uint32_tsetup_profile(void*data,void*user_data) { platform_printf("setup profile "); platform_printf("func @ %p ",hello_world); hello_world(); //... }
打開demo.c的選項(xiàng)窗口,將 “Code/Const” 指派到 ROM1:
檢查項(xiàng)目目錄下是否存在use_ext_flash.bin文件,如有則刪除。編譯,此時(shí)可發(fā)現(xiàn)項(xiàng)目目錄下生成了 一個(gè)名為use_ext_flash.bin的文件夾,里面存放了兩個(gè)分別對(duì)應(yīng)于 ROM1 和 IROM1 的文件。 打開下載工具,不勾選 “Burn Bin #2”(注意:v8.4.18 或更舊版本的下載工具可以下載 ER_IROM1,但無(wú)法下載 ER_ROM1;v8.4.19 及以上版本的下載工具兩個(gè)文件都支持。),只下載 platform.bin。回到 Keil,點(diǎn)擊 Download (F8) 按鈕下載 app。 運(yùn)行程序,用串口工具可看到如下輸出:
setup profile func @ 04000001 hello from EXT flash
可見hello_world函數(shù)已被存放于外掛 NOR Flash,使用時(shí)與內(nèi)置 Flash 沒(méi)有區(qū)別。
-
處理器
+關(guān)注
關(guān)注
68文章
20069瀏覽量
242746 -
FlaSh
+關(guān)注
關(guān)注
10文章
1701瀏覽量
153898 -
總線
+關(guān)注
關(guān)注
10文章
2999瀏覽量
90868 -
串口
+關(guān)注
關(guān)注
15文章
1596瀏覽量
81367
原文標(biāo)題:《軟件設(shè)計(jì)指南之三》為 ING916 添加外部 Flash 擴(kuò)充容量
文章出處:【微信號(hào):INGCHIPS_OFFICIAL,微信公眾號(hào):桃芯科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何通過(guò)SFL為設(shè)備添加Flash編程支持

ESP32-PICO-MINI-02確定內(nèi)部flash為2MB,沒(méi)有外部ram嗎?
RainSun陶瓷天線AN1603-916
FLASH容量的大小
PIC16F916/917 pdf
LPC2200_flash內(nèi)部Flash和外部Flash分散加載
以SRAM芯片為例系統(tǒng)介紹常用的擴(kuò)充存儲(chǔ)容量的方法

DC916A-B DC916A-B評(píng)估板
DC916A-A DC916A-A評(píng)估板
基于FPGA的高速大容量FLASH存儲(chǔ)

EVAL-AD916X EVAL-AD916X評(píng)估板
支持全規(guī)格BLE5.3的ING916X系列芯片重磅來(lái)襲
如何向Buildroot內(nèi)添加外部APP

評(píng)論