ING916 的 SPI0 通過 AHB 總線連接到處理器,支持 4 線模式,以存儲映射方式只讀訪問 (https://ingchips.github.io/drafts/pg_ing916/ch-spi.html#qspi-讀取和xip)時支持 XIP。通過 SPI0 外掛串行 NOR Flash,處理器就可以通過映射方式讀取 NOR Flash 里的內(nèi)容。對于開發(fā)者而言, 這塊外掛 NOR Flash 可存放程序、只讀數(shù)據(jù)等,可被 Cache “加速”,像內(nèi)置 Flash 一樣,使用方便。
SDK 從v8.4.19開始:1)自動安裝 W25Q 燒寫算法;2)支持串口和 USB 燒錄。
01 芯片選型
SPI0 配置到專門的高速管腳可獲得最高的傳輸速率。建議結(jié)合項目需要,確定 ING916 和 NOR Flash 的選型。
02 開發(fā) Flash燒寫算法
下一步是為 NOR Flash 開發(fā)燒寫算法。由于燒寫算法不便調(diào)試,我們可以先在一個“普通”程序里實現(xiàn)相關(guān)的函數(shù), 測試正常后再轉(zhuǎn)換為燒寫算法。
用程序讀寫外部 Flash
注意:必須使用 SDK v8.4.10 或更高版本的 Cube。對于較低版本的 SDK, 請使用外設(shè)驅(qū)動。
先用 Wizard 創(chuàng)建一個 ING916 項目,打開 Cube。假設(shè)我們決定選用 ING91682C,在 Cube 里把封裝切換為 ING91682C, 然后直接點擊 “Set to High Speed Pins” 為 SPI0 配置高速管腳:

切換到時鐘樹界面,確認 SPI0 時鐘為 24MHz 慢時鐘(注:開發(fā)調(diào)試階段先使用較低的時鐘頻率。),回到 SPI0 的設(shè)置頁面, 將 Basic Settings 的 “Clock frequency” 設(shè)置為 24MHz。
說明:時鐘樹界面的 SPI0 時鐘為 SPI0 硬件模塊的驅(qū)動;而 Basic Settings 的 “Clock frequency” 為 SPI0 (主模式下) 輸出的 CLK 信號的頻率,由驅(qū)動分頻得來。
參考 NOR Flash 數(shù)據(jù)手冊,開發(fā)、調(diào)試相關(guān)的操作函數(shù),如擦除、寫入、設(shè)置模式等。
以AHB_QSPI_MEM_BASE為起始地址可直接以存儲映射方式讀取 NOR Flash 里的數(shù)據(jù)。讀取時,SPI0 不需要任何特殊設(shè)置。
待功能驗證正常后,可酌情優(yōu)化傳輸速率:提供 SPI0 時鐘、設(shè)置 NOR Flash 的 4 線模式等。 如果需要以 2 線或者 4 線模式讀取 NOR Flash,需要配置 SPI0 的MemAccessCmd參數(shù)。請參考 NOR Flash 數(shù)據(jù)手冊, 選擇合適的命令和時序。MemAccessCmd默認為SPI_MEMRD_CMD_03,單線模式。
// 示例:設(shè)置為使用 EB 命令(4 線模式) apSSP_SetMemAccessCmd(AHB_SSP0,SPI_MEMRD_CMD_EB);
將程序轉(zhuǎn)換為 Flash 燒寫算法
下一步是通過上面的 NOR Flash 操作函數(shù)實現(xiàn)下載工具或者 IDE 要求的 Flash 燒寫接口。以 Keil 為例, 需要實現(xiàn) 4 個必備的接口:
Init: 初始化
UnInit: 反初始化
EraseSector: 擦除一個扇區(qū)
ProgramPage: 寫入一頁
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ù)實際情況填寫,也可以填寫一個 Flash 同系列型號所支持的最大容量(W25Q 地址 24bit,最大支持 16MiB),當(dāng)以后更換容量更大的 Flash 型號時,不需要更改燒寫算法; D 務(wù)必根據(jù)實際情況填寫扇區(qū)大??;C 為燒錄時一頁的大小,由于 Flash 可能不支持按頁擦除、卻一定支持按扇區(qū)擦除, 所以這里把它設(shè)置為一個扇區(qū)的大小。
03 使用外部Flash
用 Wizard 創(chuàng)建一個 ING916 項目(假設(shè)名為use_ext_flash)。打開 Cube,切換到所選用的封裝,打開 SPI0 的時鐘,并為 SPI0 配置管腳。 在 Keil 里打開項目的 Target 設(shè)置,添加一塊外部 Flash,起始地址為AHB_QSPI_MEM_BASE:

進入燒寫算法設(shè)置頁面,添加外部 Flash 燒寫算法,添加完成后,這個項目存在兩個燒寫算法:

為項目添加一個新的文件demo.c,寫一個測試函數(shù):
#include"platform_api.h"
voidhello_world(void)
{
platform_printf("hello from EXT flash
");
}
在set_profile()里調(diào)用這個函數(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的選項窗口,將 “Code/Const” 指派到 ROM1:

檢查項目目錄下是否存在use_ext_flash.bin文件,如有則刪除。編譯,此時可發(fā)現(xiàn)項目目錄下生成了 一個名為use_ext_flash.bin的文件夾,里面存放了兩個分別對應(yīng)于 ROM1 和 IROM1 的文件。 打開下載工具,不勾選 “Burn Bin #2”(注意:v8.4.18 或更舊版本的下載工具可以下載 ER_IROM1,但無法下載 ER_ROM1;v8.4.19 及以上版本的下載工具兩個文件都支持。),只下載 platform.bin?;氐?Keil,點擊 Download (F8) 按鈕下載 app。 運行程序,用串口工具可看到如下輸出:
setup profile func @ 04000001 hello from EXT flash
可見hello_world函數(shù)已被存放于外掛 NOR Flash,使用時與內(nèi)置 Flash 沒有區(qū)別。
-
處理器
+關(guān)注
關(guān)注
68文章
20100瀏覽量
244173 -
FlaSh
+關(guān)注
關(guān)注
10文章
1702瀏覽量
154281 -
總線
+關(guān)注
關(guān)注
10文章
3006瀏覽量
91083 -
串口
+關(guān)注
關(guān)注
15文章
1602瀏覽量
81605
原文標題:《軟件設(shè)計指南之三》為 ING916 添加外部 Flash 擴充容量
文章出處:【微信號:INGCHIPS_OFFICIAL,微信公眾號:桃芯科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何通過SFL為設(shè)備添加Flash編程支持
ESP32-PICO-MINI-02確定內(nèi)部flash為2MB,沒有外部ram嗎?
RainSun陶瓷天線AN1603-916
FLASH容量的大小
PIC16F916/917 pdf
LPC2200_flash內(nèi)部Flash和外部Flash分散加載
以SRAM芯片為例系統(tǒng)介紹常用的擴充存儲容量的方法
DC916A-B DC916A-B評估板
DC916A-A DC916A-A評估板
基于FPGA的高速大容量FLASH存儲

為ING916添加外部Flash擴充容量
評論