相同的代码,AHB方式读取QSPI Flash数据,启动方式不一样,分别是从sd卡启动和QSPI启动,但最终都是加载到sdram中运行的。SD卡启动时,任何操作程序正常;
QSPI启动,读取qspi的数据会产生死机,IP操作qspi正常。
启动时xip flash配置:
const flexspi_nor_config_t spiflash_config = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,/*标志:FCFB*/
.version = FLEXSPI_CFG_BLK_VERSION,/*版本:V1.4.0*/
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,/*内部环回*/
.csHoldTime = 3u, /*保持时间*/
.csSetupTime = 3u,/*建立时间*/
.columnAddressWidth = 0u,/*列地址宽度*/
.deviceModeCfgEnable = 1u,/*设备模式配置使能*/
.deviceModeType = 1u,/*Quad 使能命令*/
.deviceModeSeq.seqNum = 1u,/*LUT序列号*/
.deviceModeSeq.seqId = 4u, /*LUT序列索引*/
.deviceModeArg = 0x000200,/*设置 QE=1(S9)*/
.deviceType = kFlexSpiDeviceType_SerialNOR,/*设备类型为nor flash*/
.sflashPadType = kSerialFlash_4Pads,/*设备数据总线为4*/
.serialClkFreq = kFlexSpiSerialClk_100MHz,/*flash 时钟*/
.sflashA1Size = 16u * 1024u * 1024u, /*flash 大小32MBytes*/
//.dataValidTime = {16u, 16u},
.lookupTable =
{
/*快速读命令(四线)*/
[0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x6B, RADDR_SDR, FLEXSPI_4PAD, 0x18),
[1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
/*读状态命令*/
[1*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
/*写使能命令*/
[3*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),
/*擦除扇区命令*/
[5*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x04),
/*页编程命令(四线)*/
[9*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),
[9*4+1] = FLEXSPI_LUT_SEQ(WRITE_SDR,FLEXSPI_4PAD , 0x04, STOP, FLEXSPI_1PAD, 0),
/*整片擦除*/
[11*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xc7, STOP, FLEXSPI_1PAD, 0),
},
},
.pageSize = 256u,/*页大小为256字节*/
.sectorSize = 4u * 1024u,/*扇区大小为4k字节*/
};
程序中重新对flexspi 进行初始化:
FLEXSPI_GetDefaultConfig(&config);
config.ahbConfig.enableAHBPrefetch = true;// 允许AHB预读取的功能
FLEXSPI_Init(base, &config);// 写入配置
// 根据串行闪存功能配置闪存设置
FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA1);
udelay(10);
// 更新查找表
FLEXSPI_UpdateLUT(base, 0, &customLUT_24bit[0], 64);
哪位大侠知道原因么? |