
Mar . 2025
分享至

1. 基本原理與機制

PSOC 6 SMIF存取片外Flash的操作模式,如《淺談PSOC 6 SMIF的使用(一)-基本功能》一文中介紹,主要是MMIO模式和XIP模式。但考慮透過PSoC6 SWD的方式來在線燒錄連接在SMIF上的片外flash的內容,意味著對於PSOC 6來說片外Flash是可以尋址的,所以這裡需要配合XIP模式,把片外的flash空間映射到PSOC 6能訪問的地址段,如之前提到的0x1800 0000開始的地址區域。
要完成整個燒錄的工作,需要從片外flash的配置(參考文中QSPI Configurator的介紹)、片內工程保存QSPI Data Structure、工程的linker script、燒錄工具配合來完成。參考以下完整的Ecosystem Tool設計

接下來會自上而下的介紹這裡的基本原理和操作:
(1)首先,針對不同的memory產品,可以透過QSPI Configurator配置或自訂對應的讀寫指令組合,產生對應的指令集合的結構體參數:

自動產生的源碼檔案:
cycfg_qspi_memslot.c, cycfg_qspi_memslot.h
原始碼中有對應的結構體映射了實際執行的命令配置的集合,如以下範例中deviceCfg_S25FL512S_SlaveSlot_0就包含了讀寫對應QSPI Data Structure。

(2)有了產生的memslot資訊後,就要綁定PSOC 6系統的讀寫介面到對應的QSPI flash的設定結構體,讓flash loader知道如果要讀寫某個位址片段的資訊時,使用哪個存取外部指令來進行操作。這一部分需要由一個保存在SFlash (0x1600 0000) 區域裡進行聲明,這部分片區在PSoC6裡定義為Table of Contents part 2 (TOC2)。
例子如下,聲明由QSPI Configurator設定工具自動產生的memslot原始碼中的smifBlockConfig的結構體位址指標到指定的區間。

然後在TOC2 固定區域(offset = 0x000C)把對應的指標存進去。編譯後產生的程式碼就會自動產生新的TOC2的固定配置,在燒錄片內flash區域後,System Call就取得了目前的配置結構體的指標索引。

經過以上配置後,就可以實現透過燒錄介面存取片外的結構體。但這部分目前英飛凌已經提供了現成的中間件serial-flash,用戶只要引用中間件,就可以直接使用上面的配置,無需額外的重寫以上存儲結構體。

實現了XIP區域編譯和燒錄的例程,推薦參考CY8CPROTO-062S3-4343W這個BSP上使用WiFi的例程。上面使用了CY8C6245LQI-S3D72, 具有512KB Flash和256KB SRAM。在需要驅動WIFI模組時,由於WIFI模組的韌體由400KB左右的區間,所以需要保存在片外NorFlash上。

main.c :

bsp.mk裡也需要對應聲明

這樣wifi的韌體就會編譯時指定到xip的位址段。

在bsp資料夾中提供的PSoC 6的預設link script (e.g. GCC的.ld檔案) 已經包含了對.cy_xip段的定義描述:
2. 燒錄片外flash的注意事項:
根據上述章節的描述,我們可以理解以下的讀寫的流程:
- 片外SPI Flash的配置結構體保存到片內flash,產生了確定的&smifBlockConfig指標。
- SFlash 相關區域(TOC2)儲存了能索引配置結構體資訊的指標位址(e.g. &smifIpBlocksArr).
- 這個索引資訊已經生效。
- 需要燒錄到片外flash的內容編譯後能落在0x18000000開始的 xip 的位址段(Link Script 已經預設做了相關定義)
- 燒錄器根據需要燒錄的Hex File,當需要燒錄0x18000000 ~ 0x1FFFFFFF這些位址段的區域時,透過DAP介面索引到對應片外flash的讀取,寫,擦除等命令,對片外flash進行存取和控制。
所以,針對這個流程,當想要透過PSoC6燒錄口對片外flash進行直接燒錄的話,需要確定以下問題(Trouble Shooting):
1. 對應的片外flash的配置結構體的參數是否正確:
- 指令是否符合正確的IO數,SPI/Dual-SPI/Quad-SPI 對應的讀寫指令一般時不一致的。需要確認目前配置的IO數與指令一致。
- Memory擦除的命令是否匹配,例如4KB sector擦除,還是64KB sector擦除,對應的命令和效果會影響燒錄的結果。
- Write Enable的暫存器位元是否正確,Qaud Mode的啟用或指令是否符合。
- 擦除,Program等時間參數是否一致,這裡建議使用對應memory datasheet的最大時間來保證擦和寫的可靠性。
2. 置結構體已經燒錄到片內,TOC2的結構體有正確的索引指標。基於燒錄的原理,TOC2裡必須包含能索引到指令集合,而且已經生效,否則系統無法確定片外flash的映射位址的操作方式。
3.片外flash的介面狀況,有些使用者設計會考慮給片外flash做供電管理控制,例如用MCU的IO口控制flash的供電,以節省功耗。這時,如果需要考慮片外flash的線上燒錄,需要明確在燒錄進行時片外flash的供電情況時明確上電的。由於這時候MCU並沒有進入正常的工作邏輯,所以管理片外flash的IO不一定處在給flash打開電源開關的狀體,這時候需要考慮額外的設計來保證片外flash的供電,比如:
- 定製化燒錄製具可燒錄時明確為片外flash供電。
- 設計預設上電,控制IO時可以關閉電源的電路。
- 如果外部電路無法使用預設上電,可以考慮客製化flash loader來增加IO管理的功能先給片外flash上電。
3. 總結
本篇主要簡述了燒錄器(Programmer)通過PSOC 6 SMIF介面對片外SPI Flash進行直接燒錄的基本原理與實現方式,以及需要考慮的注意事項。
如果對PSOC 6 SMIF燒錄片外flash的方式有疑問,歡迎在評論區留言交流。
文章來源:英飛凌官微