本帖最后由 小恩GG 于 2021-10-22 17:51 编辑
【经验分享】RT1050 MX25U6432 QSPI调试 一 文档说明 最近总是遇到客户在使用RT10XX加上外部QSPI flash的自定义板子遇到不能启动的问题,所以本文以客户实际板子RT1050+MXICMX25U6432芯片为例,给出如何调试一个和官方板子不一样的RT+QSPI情况。
二 测试准备与测试 首先查看开发板的QSPI是否连接在RT的flexSPI的boot引脚,如果是MIMXRT1050-EVKB板子换QSPI 芯片,需要注意电阻修改: OPTION1: USE Hyperflash( DNPR153~R158, Mount R356,R361~R366) OPTION2:USE QSPI FLASH(Mount R153~R158, DNP R356,R361~R366) 其次,在确定开发板能够使用JLINK通过SWD接口找到内核的情况下,可以借助SDK的flexspi_nor_polling_transfer工程对外部的QSPI初步测试,主要查看QSPI是否可以正常通信,擦写,读取和编程。如果这一套都可以,说明QSPI和RT芯片的硬件通信完全没有问题,可以烧录客户的APP予以debug。 flexspi_nor_polling_transfer在SDK中的工程路径: SDK_2_10_0_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\flexspi\nor\polling_transfer 测试该工程的时候需要注意,代码需要下载到芯片RAM中测试,这里以MCUXpresso IDE为例: 图1 调试之前,还需要确认如下几点: a. LUT相关的QSPI操作命令是否一致,需要查看使用的QSPI 芯片数据手册去对比。 b. QSPI QE 位是否一致,如果不一致需要修改寄存器值位置
2.1 MX25U6432 LUT命令对比 主要查看工程中flexspi_nor_polling_transfer.c中const uint32_t customLUT[CUSTOM_LUT_LENGTH] 相关的命令。 和源SDK对比,主要两点区别: 1) /* Erase Sector */ - [4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xD7, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
- to
- /* Erase Sector */
- [4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x20, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
复制代码
图2 2) /* Page Program - quad mode */ - [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),
- [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
- to
- /* Page Program - quad mode */
- [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x38, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),
- [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
- FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
复制代码
图3
2.2 QE 位确认 图4 Status1bit 6 对应的代码是: status_tflexspi_nor_enable_quad_mode(FLEXSPI_Type *base) #define FLASH_QUAD_ENABLE 0x40 可以看到0X40正好是bit6,这点不需要修改。如果使用芯片不一致,则需要修改为对应的位。
2.3 QSPI读写测试 所以下面直接在RAM中运行,调试结果: 图5 可以看到,芯片的试步,擦除,读取编程都没有问题。
三, APP debug 本文测试debugger是基于JLINK,下载算法使用超级下载算法RT_UFL. 安装JLINK驱动 安装之后,驱动在C:\ProgramFiles\SEGGER\JLink 下面可以按照RT_UFL的文章调试MCUXPresso 工程: APP代码可以使用SDK的led_blinky, SDK路径: SDK_2_10_0_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky 调试之前,需要修改XIP文件夹下的FCB,默认的是Hyperflash,内容修改为: - const flexspi_nor_config_t qspiflash_config = {
- .memConfig =
- {
- .tag = FLEXSPI_CFG_BLK_TAG,
- .version = FLEXSPI_CFG_BLK_VERSION,
- .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
- .csHoldTime = 3u,
- .csSetupTime = 3u,
- .sflashPadType = kSerialFlash_4Pads,
- .serialClkFreq = kFlexSpiSerialClk_100MHz,
- .sflashA1Size = 8u * 1024u * 1024u,
- .lookupTable =
- {
- // Read LUTs
- FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
- FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
- },
- },
- .pageSize = 256u,
- .sectorSize = 4u * 1024u,
- .blockSize = 64u * 1024u,
- .isUniformBlockSize = false,
- };
复制代码
RT_UFL打包到JLINK驱动之后,需要注意下MCUXpresso 工程的配置,JLINK server选择为: C:\ProgramFiles\SEGGER\JLink\JLinkGDBServerCL.exe 工程debug device选择为MIMXRT1050_UFL_L0 图6 图7 测试结果如下:
图8
目前为止,完成了外部QSPI MX25U6432的下载与测试,退出debugger模式,芯片启动模式改为internal boot,可以看到Led 灯闪烁。
|