概述
MCXN947芯片是一款高度集成的微控制器,具有強大的處理能力、豐富的外設(shè)支持和高級安全特性,適用于多種復(fù)雜應(yīng)用。其中有個非常重要的外設(shè)為FlexSPI。
FlexSPI是一種可擴展的串行外設(shè)接口,主要用于連接固態(tài)存儲設(shè)備,如QuadSPI NOR Flash、QuadSPI NAND Flash、HyperRAM等。FlexSPI是一種全面的、靈活的、高性能的解決方案,可以配置成不同的模式以適應(yīng)不同的存儲設(shè)備。
NXP FRDM-MCXN947板是一款基于MCXN947設(shè)備的低成本設(shè)計與評估板。NXP為MCXN947設(shè)備提供了包括硬件評估板、軟件開發(fā)集成開發(fā)環(huán)境(IDE)、示例應(yīng)用程序和驅(qū)動程序在內(nèi)的工具和軟件支持。該板FlexSPI接口默認接了一塊MT35XU512 NOR Flash。

在本文中,我們將探討如何在MCXN947板的FlexSPI接口接HyperRAM。
硬件環(huán)境:
開發(fā)板:FRDM-MCXN947
HyperRAM:W956D8MBYA
軟件環(huán)境:
IDE:MCUXpresso IDE v11.9.0
SDK:SDK Builder | MCUXpresso SDKBuilder (nxp.com)
HyperRAM原理圖
以下是官方FRDM-MCXN947中的八線Flash的原理圖,由于W956D8MBYA的HyperRAM的封裝都為TFBGA 24-Ball 5 x 5 Array,所以可以直接進行替換。

根據(jù)以上原理圖,總結(jié)出HyperRAM存儲器的信號連接方式見表:

HyperRAM配置流程
3.1 時鐘配置
FlexSPI的時鐘需要正確配置。

我們在調(diào)試程序的階段還是保險地選擇低一點的頻率,這里選擇75MHz。
3.2 FlexSPI初始化配置結(jié)構(gòu)體詳解
接下來是FlexSPI相關(guān)配置,我們可以調(diào)用FLEXSPI_GetDefaultConfig獲取一些針對FlexSPI特性結(jié)構(gòu)體flexspi_config_t的一些默認配置,這個默認配置具有一定的普遍性,能兼容大部分的FlexSPI設(shè)備,對于該W956D8MBYA 的HyperRAM,在默認配置的基礎(chǔ)上,增加如下幾個參數(shù):
config.ahbConfig.enableAHBPrefetch = true;
config.ahbConfig.enableAHBBufferable = true;
config.ahbConfig.enableReadAddressOpt= true;
config.ahbConfig.enableAHBCachable = true;
config.rxSampleClock= kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;
(1)enableAHBPrefetch:是否使能AHB預(yù)讀取特性,當(dāng)使能時,F(xiàn)lexSPI會讀取比當(dāng)前AHB突發(fā)讀取更多的數(shù)據(jù)。
(2)enableAHBBufferable :是否使能AHB寫緩沖訪問,在執(zhí)行寫命令后,不等待其執(zhí)行完畢就返回,允許后續(xù)指令繼續(xù)執(zhí)行,提高系統(tǒng)的并發(fā)性。
(3)enableReadAddressOpt:控制是否移除AHB讀取突發(fā)起始地址對齊限制,若使能,突發(fā)讀取地址沒有字節(jié)對齊限制。
(4)enableAHBCachable:使能AHB總線緩存讀取,若命中則從緩存中讀取,但要確保數(shù)據(jù)的一致性
(5)rxSampleClock:讀數(shù)據(jù)使用的時鐘源,對于HyperRAM來說,HyperRAM提供讀選通脈沖并從DQS引腳輸入。
3.3 FlexSPI外部設(shè)備配置結(jié)構(gòu)體詳解
FlexSPI與外部設(shè)備通訊時常常需要與設(shè)備協(xié)調(diào)通訊的時序,如時鐘頻率、數(shù)據(jù)有效時間等內(nèi)容,NXP軟件庫提供了結(jié)構(gòu)體類型flexspi_device_config_t專門用于配置這些參數(shù)。
typedef struct _flexspi_device_config
{
uint32_t flexspiRootClk;
bool isSck2Enabled;
uint32_t flashSize;
flexspi_cs_interval_cycle_unit_t CSIntervalUnit;
uint16_t CSInterval;
uint8_t CSHoldTime;
uint8_t CSSetupTime;
uint8_t dataValidTime;
uint8_t columnspace;
bool enableWordAddress;
uint8_t AWRSeqIndex;
uint8_t AWRSeqNumber;
uint8_t ARDSeqIndex;
uint8_t ARDSeqNumber;
flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit;
uint16_t AHBWriteWaitInterval;
bool enableWriteMask;
} flexspi_device_config_t;
(1) flexspiRootClk = 75000000,此參數(shù)與前面設(shè)置的FlexSPI的時鐘頻率一致。
(2) flashSize = 0x2000, Flash的大小,以KB為單位。對于W956D8MBYA,64Mb = 8MB = 8 *1024KB。
(3) CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,此參數(shù)用于配置CS信號線間隔的時間單位。
(4) CSInterval = 2,此參數(shù)用于配置CS信號線有效與無效切換的最小時間間隔,單位為上面CSIntervalUnit成員的配置。
(5) CSHoldTime = 3,此參數(shù)用于設(shè)定CS信號線的保持時間,單位為FlexSPI根時鐘周期。
(6) CSSetupTime=3,此參數(shù)用于設(shè)定CS信號線的建立時間,單位為FlexSPI根時鐘周期。


根據(jù)MCXNx4x datasheet,= 6ns,最小的= 8.3ns,最小的= 9.8ns。時鐘為75M的周期時間大約是13.3ns。故CSHoldTime和CSSetupTime大于等于1即可,均配置成3。
(7) dataValidTime=2,寄存器DLLACR和DLLBCR,本成員用于配置通訊中的數(shù)據(jù)有效時間,單位為納秒。
(8) columnspace = 3,低位列地址寬度,對于這個HyperRAM來說,是用行列進行尋址的,這里列地址的寬度為3位。

(9) enableWordAddress = true,配置是否使能2字節(jié)可尋址功能,使能后會以16位的數(shù)據(jù)格式對HyperRAM進行訪問。
(10) AWRSeqIndex = 1,對應(yīng)寫的時序序列在LUT中的索引。
(11) AWRSeqNumber =1,此參數(shù)配置AHB寫命令的序列數(shù)目。
(12) ARDSeqIndex = 0,對應(yīng)讀的時序序列在LUT中的索引。
(13) ARDSeqNumber =1,此參數(shù)配置AHB讀命令的序列數(shù)目。
(14) enableWriteMask = true,此參數(shù)用于設(shè)置FlexSPI寫外部設(shè)備時是否使能驅(qū)動DQS位作為掩碼,這種功能在訪問數(shù)據(jù)寬度為16位時用于地址對齊。
3.4 LUT表格配置
下面是HyperRAM 讀和寫的時序LUT表格的代碼示例,
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
/* Read Data */
[4 * PSRAM_CMD_LUT_SEQ_IDX_READDATA] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR,kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
[4 * PSRAM_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR,kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x07),
[4 * PSRAM_CMD_LUT_SEQ_IDX_READDATA + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR,kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
/* Write data */
[4 * PSRAM_CMD_LUT_SEQ_IDX_WRITEDATA] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR,kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
[4 * PSRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_CADDR_DDR,kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 0x07),
[4 * PSRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 2] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_DDR,kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
};
(1) 我們使用的是8線差分的HyperRAM,在時鐘的雙邊沿都采樣,所以與外部存儲器通信時用的數(shù)據(jù)線的個數(shù)均為kFLEXSPI_8PAD。
(2) HyperRAM和HyperFlash是基于Cypress Semiconductor的HyperBus接口規(guī)范設(shè)計的存儲器產(chǎn)品,這個operand是在該規(guī)范中定義的,所以讀操作operand固定為0xA0,寫數(shù)據(jù)的operand固定為0x20。

(3) CADDR_DDR列地址,由于一次傳輸?shù)淖止?jié)一定是8的倍數(shù),如果你傳的行列地址大于特定大小的HyperRAM最大的行和列,F(xiàn)lexSPI會自動將高位置0。
上表中顯示低16位是列地址,有效位有3位,高13位是預(yù)留兼容的列地址位,需要置0。所以這里列地址的時序參數(shù)需要填16,即0x10。

(4) RADDR_DDR行地址,如圖所示,如果 FLSHxxCR1[CAS] 位不為 0 ,那么 FlexSPI 外設(shè)在傳輸時序里會拆分實際映射 Flash Address (即存儲器自身偏移地址) 為行地址 FA[31:CAS] 和列地址 [CAS-1:1] 來分別傳輸。對于字可尋址閃存設(shè)備,不需要地址的最后一位,因為閃存是按照兩個字節(jié)讀取和編程的。Flexspi 一個字為兩個字節(jié),所有需要如果2個字節(jié)對齊,就需要少一位地址。行列地址加一起少一位。W956D8MBYA有64Mbit,即2^26,列地址還有3位,所以理論上行地址需要傳輸26-1-3=22位,即可尋址整個HyperRAM。然后向8位對齊,不然FlexSPI會在低位補0,就不是我們要訪問的地址了。所以參數(shù)為0x18,即24位。
實驗驗證 我們可以利用簡單的AHB讀寫來驗證此HyperRAM是否可以工作。
代碼如下:
for (i = 0; i < sizeof(s_psram_write_buffer); i++)
{
s_psram_write_buffer[i] = i;
}
memcpy((uint32_t*)(EXAMPLE_FLEXSPI_AMBA_BASE), s_psram_write_buffer, sizeof(s_psram_write_buffer));
memcpy(s_psram_read_buffer,(uint32_t*)(EXAMPLE_FLEXSPI_AMBA_BASE) , sizeof(s_psram_read_buffer));
if (memcmp(s_psram_read_buffer, s_psram_write_buffer,sizeof(s_psram_write_buffer)) == 0)
{
PRINTF("AHB Command Read/Write data successfully !
");
}
當(dāng)你的串口打印出"AHB Command Read/Write data successfully!"
證明你的FlexSPI接HyperRAM現(xiàn)在可以正常工作啦!
作者:Hang Zhang
-
微控制器
+關(guān)注
關(guān)注
48文章
8244瀏覽量
162097 -
NXP
+關(guān)注
關(guān)注
61文章
1375瀏覽量
194403 -
接口
+關(guān)注
關(guān)注
33文章
9438瀏覽量
156070 -
HyperRAM
+關(guān)注
關(guān)注
0文章
5瀏覽量
1751
原文標(biāo)題:MCX N947:FlexSPI接HyperRAM分析和配置
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
恩智浦MCU MCXN947 基于MCUXpresso Config tools創(chuàng)建IIC的教程步驟
如何在MCXN947微控制器上配置安全啟動和生命周期
FRDM-MCXN947的純Linux命令行環(huán)境搭建
關(guān)于將Flash寫入FRDM-MCXN947的問題求解
MCXN947使用ADC并編寫代碼,總是報警告是怎么回事?
MCXN947如何配置和外擴PSRAM?
《電子發(fā)燒友電子設(shè)計周報》聚焦硬科技領(lǐng)域核心價值 第14期:2025.06.2--2025.06.6
如何在HyperRAM中讀/寫?
FlexSPI1 ISSI HyperRAM初始化問題求解
恩智浦MCX系列MCU的新品MCXN947
《恩智浦FRDM-MCXN947開發(fā)實踐指南》上線啦
使用VSCode調(diào)試FRDM MCXN947開發(fā)板
MCXN947系列高性能微控制器產(chǎn)品介紹
使用NXP MCX-N板卡搭建環(huán)境及點燈

如何在MCXN947板的FlexSPI接口接HyperRAM
評論