概述
MCXN947芯片是一款高度集成的微控制器,具有強(qiáng)大的處理能力、豐富的外設(shè)支持和高級(jí)安全特性,適用于多種復(fù)雜應(yīng)用。其中有個(gè)非常重要的外設(shè)為FlexSPI。
FlexSPI是一種可擴(kuò)展的串行外設(shè)接口,主要用于連接固態(tài)存儲(chǔ)設(shè)備,如QuadSPI NOR Flash、QuadSPI NAND Flash、HyperRAM等。FlexSPI是一種全面的、靈活的、高性能的解決方案,可以配置成不同的模式以適應(yīng)不同的存儲(chǔ)設(shè)備。
NXP FRDM-MCXN947板是一款基于MCXN947設(shè)備的低成本設(shè)計(jì)與評(píng)估板。NXP為MCXN947設(shè)備提供了包括硬件評(píng)估板、軟件開發(fā)集成開發(fā)環(huán)境(IDE)、示例應(yīng)用程序和驅(qū)動(dòng)程序在內(nèi)的工具和軟件支持。該板FlexSPI接口默認(rèn)接了一塊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ìn)行替換。
根據(jù)以上原理圖,總結(jié)出HyperRAM存儲(chǔ)器的信號(hào)連接方式見表:
HyperRAM配置流程
3.1 時(shí)鐘配置
FlexSPI的時(shí)鐘需要正確配置。
我們?cè)谡{(diào)試程序的階段還是保險(xiǎn)地選擇低一點(diǎn)的頻率,這里選擇75MHz。
3.2 FlexSPI初始化配置結(jié)構(gòu)體詳解
接下來是FlexSPI相關(guān)配置,我們可以調(diào)用FLEXSPI_GetDefaultConfig獲取一些針對(duì)FlexSPI特性結(jié)構(gòu)體flexspi_config_t的一些默認(rèn)配置,這個(gè)默認(rèn)配置具有一定的普遍性,能兼容大部分的FlexSPI設(shè)備,對(duì)于該W956D8MBYA 的HyperRAM,在默認(rèn)配置的基礎(chǔ)上,增加如下幾個(gè)參數(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)使能時(shí),F(xiàn)lexSPI會(huì)讀取比當(dāng)前AHB突發(fā)讀取更多的數(shù)據(jù)。
(2)enableAHBBufferable :是否使能AHB寫緩沖訪問,在執(zhí)行寫命令后,不等待其執(zhí)行完畢就返回,允許后續(xù)指令繼續(xù)執(zhí)行,提高系統(tǒng)的并發(fā)性。
(3)enableReadAddressOpt:控制是否移除AHB讀取突發(fā)起始地址對(duì)齊限制,若使能,突發(fā)讀取地址沒有字節(jié)對(duì)齊限制。
(4)enableAHBCachable:使能AHB總線緩存讀取,若命中則從緩存中讀取,但要確保數(shù)據(jù)的一致性
(5)rxSampleClock:讀數(shù)據(jù)使用的時(shí)鐘源,對(duì)于HyperRAM來說,HyperRAM提供讀選通脈沖并從DQS引腳輸入。
3.3 FlexSPI外部設(shè)備配置結(jié)構(gòu)體詳解
FlexSPI與外部設(shè)備通訊時(shí)常常需要與設(shè)備協(xié)調(diào)通訊的時(shí)序,如時(shí)鐘頻率、數(shù)據(jù)有效時(shí)間等內(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的時(shí)鐘頻率一致。
(2) flashSize = 0x2000, Flash的大小,以KB為單位。對(duì)于W956D8MBYA,64Mb = 8MB = 8 *1024KB。
(3) CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,此參數(shù)用于配置CS信號(hào)線間隔的時(shí)間單位。
(4) CSInterval = 2,此參數(shù)用于配置CS信號(hào)線有效與無效切換的最小時(shí)間間隔,單位為上面CSIntervalUnit成員的配置。
(5) CSHoldTime = 3,此參數(shù)用于設(shè)定CS信號(hào)線的保持時(shí)間,單位為FlexSPI根時(shí)鐘周期。
(6) CSSetupTime=3,此參數(shù)用于設(shè)定CS信號(hào)線的建立時(shí)間,單位為FlexSPI根時(shí)鐘周期。
根據(jù)MCXNx4x datasheet,= 6ns,最小的= 8.3ns,最小的= 9.8ns。時(shí)鐘為75M的周期時(shí)間大約是13.3ns。故CSHoldTime和CSSetupTime大于等于1即可,均配置成3。
(7) dataValidTime=2,寄存器DLLACR和DLLBCR,本成員用于配置通訊中的數(shù)據(jù)有效時(shí)間,單位為納秒。
(8) columnspace = 3,低位列地址寬度,對(duì)于這個(gè)HyperRAM來說,是用行列進(jìn)行尋址的,這里列地址的寬度為3位。
(9) enableWordAddress = true,配置是否使能2字節(jié)可尋址功能,使能后會(huì)以16位的數(shù)據(jù)格式對(duì)HyperRAM進(jìn)行訪問。
(10) AWRSeqIndex = 1,對(duì)應(yīng)寫的時(shí)序序列在LUT中的索引。
(11) AWRSeqNumber =1,此參數(shù)配置AHB寫命令的序列數(shù)目。
(12) ARDSeqIndex = 0,對(duì)應(yīng)讀的時(shí)序序列在LUT中的索引。
(13) ARDSeqNumber =1,此參數(shù)配置AHB讀命令的序列數(shù)目。
(14) enableWriteMask = true,此參數(shù)用于設(shè)置FlexSPI寫外部設(shè)備時(shí)是否使能驅(qū)動(dòng)DQS位作為掩碼,這種功能在訪問數(shù)據(jù)寬度為16位時(shí)用于地址對(duì)齊。
3.4 LUT表格配置
下面是HyperRAM 讀和寫的時(shí)序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í)鐘的雙邊沿都采樣,所以與外部存儲(chǔ)器通信時(shí)用的數(shù)據(jù)線的個(gè)數(shù)均為kFLEXSPI_8PAD。
(2) HyperRAM和HyperFlash是基于Cypress Semiconductor的HyperBus接口規(guī)范設(shè)計(jì)的存儲(chǔ)器產(chǎn)品,這個(gè)operand是在該規(guī)范中定義的,所以讀操作operand固定為0xA0,寫數(shù)據(jù)的operand固定為0x20。
(3) CADDR_DDR列地址,由于一次傳輸?shù)淖止?jié)一定是8的倍數(shù),如果你傳的行列地址大于特定大小的HyperRAM最大的行和列,F(xiàn)lexSPI會(huì)自動(dòng)將高位置0。
上表中顯示低16位是列地址,有效位有3位,高13位是預(yù)留兼容的列地址位,需要置0。所以這里列地址的時(shí)序參數(shù)需要填16,即0x10。
(4) RADDR_DDR行地址,如圖所示,如果 FLSHxxCR1[CAS] 位不為 0 ,那么 FlexSPI 外設(shè)在傳輸時(shí)序里會(huì)拆分實(shí)際映射 Flash Address (即存儲(chǔ)器自身偏移地址) 為行地址 FA[31:CAS] 和列地址 [CAS-1:1] 來分別傳輸。對(duì)于字可尋址閃存設(shè)備,不需要地址的最后一位,因?yàn)殚W存是按照兩個(gè)字節(jié)讀取和編程的。Flexspi 一個(gè)字為兩個(gè)字節(jié),所有需要如果2個(gè)字節(jié)對(duì)齊,就需要少一位地址。行列地址加一起少一位。W956D8MBYA有64Mbit,即2^26,列地址還有3位,所以理論上行地址需要傳輸26-1-3=22位,即可尋址整個(gè)HyperRAM。然后向8位對(duì)齊,不然FlexSPI會(huì)在低位補(bǔ)0,就不是我們要訪問的地址了。所以參數(shù)為0x18,即24位。
實(shí)驗(yàn)驗(yàn)證 我們可以利用簡(jiǎn)單的AHB讀寫來驗(yàn)證此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文章
7953瀏覽量
155087 -
NXP
+關(guān)注
關(guān)注
61文章
1348瀏覽量
189403 -
接口
+關(guān)注
關(guān)注
33文章
9005瀏覽量
153763 -
HyperRAM
+關(guān)注
關(guān)注
0文章
5瀏覽量
1655
原文標(biāo)題:MCX N947:FlexSPI接HyperRAM分析和配置
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
恩智浦MCU MCXN947 基于MCUXpresso Config tools創(chuàng)建IIC的教程步驟

如何在MCXN947微控制器上配置安全啟動(dòng)和生命周期

FRDM-MCXN947的純Linux命令行環(huán)境搭建
關(guān)于將Flash寫入FRDM-MCXN947的問題求解
MCXN947使用ADC并編寫代碼,總是報(bào)警告是怎么回事?
MCXN947如何配置和外擴(kuò)PSRAM?
MCXN947怎么驅(qū)動(dòng)FRDM-STBI-A8974三軸陀螺儀?
《電子發(fā)燒友電子設(shè)計(jì)周報(bào)》聚焦硬科技領(lǐng)域核心價(jià)值 第14期:2025.06.2--2025.06.6
如何在HyperRAM中讀/寫?
FlexSPI1 ISSI HyperRAM初始化問題求解
恩智浦MCX系列MCU的新品MCXN947
《恩智浦FRDM-MCXN947開發(fā)實(shí)踐指南》上線啦

使用VSCode調(diào)試FRDM MCXN947開發(fā)板

MCXN947系列高性能微控制器產(chǎn)品介紹

使用NXP MCX-N板卡搭建環(huán)境及點(diǎn)燈

評(píng)論