本課講為大家講解CKS32F4xx系列產品的FSMC應用實例,FSMC全稱是Flexible Static Memory Controller,讀作靈活的靜態存儲控制器,顧名思義,MCU可以通過FSMC擴展靜態內存,靈活則是因為支持PC卡/CF卡、SRAM、PSRAM、NOR Flash和NAND Flash等幾種模式,本應用實例主要是幫助讀者們學習驅動NAND Flash。注意,FSMC并不能支持如SDRAM這類型動態存儲器,需要FMC功能才支持。
FSMC簡介
FSMC主要框圖
FSMC的主要思路是內核想訪問存儲器,但是存儲器需要接收到特定的數據/地址/控制等信號,內核并不好操作,于是就誕生了FSMC外設,有了這個外設我們就無須自己寫復雜的硬件時序,由配置好的FSMC替我們完成。根據配置的不同,FSMC可用于控制ROM、SRAM、NOR Flash、PSRAM和NAND Flash,其結構框圖如圖1所示。
圖1FSMC框圖
從框圖可以了解到,FSMC外設包含4個模塊:AHB總線接口(包含配置寄存器)、NOR Flash/PSARM控制器、NAND Flash/PC 卡控制器、外部接口。
(1)內核通過AHB總線發送總線事務請求,AHB時鐘(HCLK)是FSMC的參考時鐘。
(2)配置寄存器按配置形成擴展外設的通信協議,驅動相應的存儲器控制器,進而控制外設。
(3)兩大控制器用于生成適當的時序,如NOR Flash/PSRAM控制器用于驅動8位、16位、32位的異步SRAM和ROM、異步或突發模式的NOR Flash和PSRAM;NAND/PC卡控制器用于驅動8位或16位的NAND Flash以及16位的PC卡兼容設備。
(4)不同外設共用一組地址數據總線、讀寫使能和輸入等待線,此共用信號基本上涵蓋了擴展外設讀寫所需要的所有信息,地址用于尋址,讀寫使能和輸入等待線用于控制數據傳輸方向,并標識數據有效時間以同步數據。FSMC每次訪問外設時,都會切換片選信號,如NOR Flash的NE信號,NAND Flash和PC卡的NCE信號,其余外設接口信號根據具體外設驅動方式分配。
FSMC設備地址映射
FSMC的外部設備地址映射劃分在0x60000000~0x9FFFFFFF這一段存儲空間內,我們可以直接以讀寫內存的形式訪問存儲設備,類似訪問片上外設寄存器一樣方便,如圖2所示將外部存儲器劃分為四個存儲塊(Bank),每個Bank對應256M字節的空間,加起來FSMC總共管理著1G字節的空間。Bank1用于NOR Flash/PSRAM,最多可以連接4個存儲器,Bank2/3可以各接入1個NAND Flash,Bank4則用于擴展PC卡兼容設備。本文主要探討NAND Flash驅動,因此主要討論塊2、塊3的相關配置。
圖2FSMC存儲區域
對于NAND Flash/PC卡控制器,塊2.3.4被劃分為表1所示的訪問空間,地址映射分通用區和特性區,塊4-PC卡相比多了一個I/O空間,分別由各自的時序寄存器控制訪問時序。
表1 NAND Flash/PC卡地址
對于NAND Flash,通用空間和特性空間在其低256K字節部分劃分了3個區,前64K為地址區,中64K為命令區,后128K為數據區,地址范圍如表2所示。訪問NAND存儲空間流程簡單描述為:先發送命令到命令區,其次發送需要操作的地址至地址區,最后在數據區寫入或讀出數據,以上流程只需要在三個區內任意地址執行即可。
表2 每個存儲塊的低256K字節
NANDFlash/PC卡存儲器控制器
FSMC內部有兩個獨立的控制器分別用于驅動NOR/PSRAM內存和NAND/PC卡。由于本文所涉及的例子是驅動一個8位NAND Flash(型號K9F1G08U0E),所以這里主要講述一下NAND/PC卡控制器。
支持設備和接口
表3列出了FSMC支持的NAND設備、訪問模式和總線事務,可以看到NAND Flash/PC卡控制器能夠以異步方式訪問8位或16位的NAND Flash,而請求AHB操作的數據寬度可以是8位、16位、32位,為了保障數據傳輸的一致性,FSMC遵循以下原則:
1、AHB操作的數據寬度和外部存儲器寬度相同時,無傳輸一致性問題。
2、AHB操作的數據寬度大于外部存儲器寬度,FSMC將AHB操作分割成幾個連續的較小數據寬度的存儲器操作,以適應外部存儲器。
3、AHB操作的數據寬度小于外部存儲器寬度,異步傳輸時不能進行寫的操作,只能進行讀操作,如表3灰色部分所示。
表3支持的存儲器和事務
表4列出了用于連接8位NAND Flash的接口信號,我們主要通過地址區(A17)、命令區(A16)和數據區(D[7:0])這三個區來訪問NAND Flash,注意名稱前綴N表示低電平有效。
表4 8位NAND存儲器接口信號
NANDFlash操作流程
以NAND Flash頁讀取操作流程為例,說明控制器是怎么參與操作的:
1、根據所選8位NANDFlash的特性,配置控制寄存器FSMC_PCRx、通用區時序寄存器 FSMC_PMEMx和特性區時序寄存器FSMC_PATTx,進而配置并使能相應的存儲區域
2、根據NAND Flash命令集在通用區域的命令區執行字節寫操作,將頁讀取的命令寫入命令區,在NWE低電平時,Flash的CLE輸入有效,將命令鎖存。
3、在通用區域或特性區域的地址區寫入表示讀操作起始地址的相應字節,在NEW低電平時,Flash的ALE輸入有效,將地址鎖存為讀操作起始地址。
4、借助特性存儲器空間,可設置預等待功能,當寫入地址結束時,控制器會等待存儲器準備好,R/NB信號變為低電平后方可訪問新的存儲空間。
5、在通用區域的數據區按字節讀出數據完成頁讀取操作。
6、后續可繼續執行第五步讀出數據而無需再進行命令和地址的寫操作,或重新執行第三步寫入新的地址,或重新執行第二步發送新的命令。
NANDFlash/PC卡寄存器
控制寄存器FSMC_PCRx
位1 PWAITE:等待特性使能位=1時,使能等待特性,注意當使能等待特性后,需配置相應等待時間,如使用讀芯片忙腳作為反饋時,可關閉等待特性。
位2 PBKEN:NAND Flash/PC卡存儲區域使能位=1時使能存儲塊功能,于FSMC_NANDcmd函數內使能。
位3 PTYP:存儲器類型=1時為NAND Flash,設置0時為PC卡、PC卡等。
位5:4 PWID:數據總線寬度,用于定義外部存儲器設備寬度,00時為8位,01則16位。位6 ECCEN:ECC計算邏輯使能位=1時使能ECC邏輯。
位12:9 TCLR: CLE到RE的延遲時間,從0000到1111可配置1到16個HCLK周期。
位16:13 TAR: ALE到RE的延遲時間,從0000到1111可配置1到16個HCLK周期。
位19:17 ECCPS: ECC頁大小,自定義擴展ECC的頁大小,000為256字節,001為512字節,最大配置101為8192字節。
通用存儲器空間時序寄存器FSMC_PMEMx
位7:0 MEMSETx:通用存儲器x的建立時間,定義為讀寫使能命令(NWE,NOE)前建立地址所需要的HCLK周期數,可設置0x00到0xFF表示2到257個周期數(NAND Flash)。
位15:8 MEMWAITx:通用存儲器x的等待時間,定義為保持讀寫使能命令(NWE,NOE)所需要的HCLK周期數,可設置0x01到0xFF表示2到256個周期數(再加上NWAIT變低的等待時間),0x00用于保留。
位23:16 MEMHOLDx:通用存儲器x的保持時間,定義為讀寫禁止命令(NWE,NOE)后保持地址信號或數據信號的HCLK周期數,可設置0x01到0xFF表示1到255個周期數,0x00用于保留。
位31:24 MEMHIZx:數據總線高阻態時間,當進行寫操作時,數據總線需要保持一段時間的高阻態狀態,可設置0x00到0xFF表示1到256個HCLK周期數(NAND Flash)。
特性存儲器空間時序寄存器FSMC_PATTx與通用寄存器一樣,有同樣的4個參數分別為ATTHIZx、ATTHOLDx、ATTWAITx和ATTSETx,可自行對應參考。
驅動NANDFlash示例
FSMC代碼示例
(1)FSMC初始化配置:A.首先開啟GPIO、FSMC、AFIO復用等三個時鐘,按外接引腳配置除PD6以外所有引腳復用推挽輸出,PD6忙腳作為上拉輸入,然后所有腳開啟FSMC復用功能。B.FSMC寄存器配置,使用外接忙腳作為應答,因此關掉等待特性,數據寬度選擇8bit,使能ECC校驗功能,ECC頁大小為512字節,各信號時序因為外接模塊,最后初始化并使能復位。
(2)進行讀取NAND Flash ID號的操作,按照上一節的控制邏輯,ReadID,必須發送命令90H(H代表16進制)到命令區(命令區、地址區和數據區的地址如表2所示),接著發送0x00到地址區,最后在數據區讀回32位的ID號0xECF10095。
(3)寫入操作前,需要先整塊擦除,命令區輸入0x60,然后地址區輸入要擦除的地址,再第二輪輸入命令區0xD0執行擦除,函數最后返回讀取當前狀態的值,會持續等待設備擦除完畢或超時退出。
(4)填充TxBuffer用于寫入實驗,目前填充共2K的空間,剛好一個頁容量。
(5)頁寫入TxBuffer的數據,函數的三個參數為TxBuffer、寫入地址和寫入頁的數量,給定TxBuffer數據,寫入地址為WriteReadAddr.Zone = 0x00、WriteReadAddr.Block = 0x00、WriteReadAddr.Page = 0x00,寫入頁數量為1。當寫入頁數量不為0、地址狀態有效且狀態已準備好時,進入循環,發送寫入一次命令80H,寫入列地址表示頁內偏移,無偏移所以為0x00,寫入行地址為當前塊地址,在將Txbuffer依次連續寫入數據區,完成后二次命令0x10結束寫入,讀NAND Flash的忙腳等待寫入完成信號,等待完成后行地址遞增,可進行下一個頁的寫入。
(6)頁讀取操作同頁寫入,命令區一次寫入0x00,二次寫入0x30,列地址0x00,行地址選當前頁地址。二次命令寫入后才讀出數據給到RxBuffer。
(7)最后利用串口打印,讀ID、比較TxBuffer和RxBuffer(比較前100個數據)是否一致可以看到ID識別為0xECF10095,TxBuffer和RxBuffer數據一致。
審核編輯:劉清
-
寄存器
+關注
關注
31文章
5325瀏覽量
120048 -
存儲器
+關注
關注
38文章
7455瀏覽量
163621 -
Nand flash
+關注
關注
6文章
241瀏覽量
39774 -
AHB總線
+關注
關注
0文章
18瀏覽量
9469 -
FSMC
+關注
關注
0文章
55瀏覽量
38113
原文標題:MCU微課堂|CKS32F4xx系列FSMC功能
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論