NXP MCU 技术论坛
直播中

刘强

8年用户 1261经验值
私信 关注
[问答]

RT600 FlexSPI使用LoopbackFromSckPad或DQS读取时出现额外的clk,怎么解决?

在 EVK685 上运行示例 evkmimxrt685_flexspi_octal_polling_transfer
从 RAM 运行,semihost 进行调试。

当运行命令 Read Jedec ID 时,作码0x9F SPI 1-1-1 中读取 3 个字节,
使用 kFLEXSPI_ReadSampleClkLoopbackFromSckPad 或 kFLEXSPI_ReadSampleClkExternalInputFromDqsPad 时,将读取额外的字节,而使用 kFLEXSPI_ReadSampleClkLoopbackInternally 时,仅读取请求的 3 个字节。

请参阅随附的 logic capture 和源代码:

kFLEXSPI_ReadSampleClkLoopbackFromSckPad,读取 4 个字节,同时仅请求 3 个字节:


kFLEXSPI_ReadSampleClkLoopbackInternally,仅读取 3 个字节:

  
                                                                                                                                                                                                                                                                                                                                                                                                        

回帖(1)

elecfans

2025-4-10 17:46:59

针对RT600 FlexSPI在使用LoopbackFromSckPad或DQS读取时出现额外时钟的问题,以下是逐步解决方案:




  1. 检查LUT指令序列中的空周期(Pad Setting)



    • 在读取数据阶段(如JEDEC ID的0x9F命令),确保指令序列中设置了足够的空周期(例如,FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x9F, STOP, FLEXSPI_1PAD, 0x00))。若使用外部时钟源,可能需要增加空周期以等待数据稳定。

    • 调整方法:在LUT的读取数据阶段(如READ_DATA部分)增加DUMMY_SDRDUMMY_CYCLE的数量,例如将空周期从默认值0调整为1或2。




  2. 配置FlexSPI的DLL(延迟锁定环)



    • 当使用DQS采样时,需启用DLL并设置适当的延迟值以补偿信号延迟。

    • 操作步骤
      flexspi_config.dllEnable = true;
      flexspi_config.dllValue = 0x1; // 根据硬件调整具体值
      FLEXSPI_Init(BOARD_FLEXSPI, &flexspi_config);




  3. 调整FlexSPI的时钟分频与采样点



    • flexspi_config.clkDiv中降低时钟分频系数,确保在外部回环模式下SCK频率不超过目标设备支持的范围。

    • 设置flexspi_config.rxSampleClockkFLEXSPI_ReadSampleClkExternalInputFromDqsPad时,检查flexspi_config.dqsPinMux是否正确配置到实际DQS引脚。




  4. 验证数据阶段长度(Data Size)



    • 确认FlexSPI传输命令中指定的数据长度与实际请求一致。例如,在调用FLEXSPI_TransferBlocking时,确保xfer.dataSize字段设置为3字节而非默认的4字节。

    • 代码示例
      flexspi_transfer_t xfer = {
      .deviceAddress = 0,
      .seqIndex = READ_JEDEC_ID_SEQ_ID,
      .seqNum = 1,
      .dataSize = 3, // 明确指定读取3字节
      .data = &buffer
      };




  5. 检查CS信号的保持时间(Chip Select Hold Time)



    • 在LUT指令中,确保CS信号在数据读取完成后及时拉高。调整CS_INTERVALCS_HOLD_TIME寄存器设置,避免因CS释放延迟导致多出一个时钟周期。




  6. 逻辑分析仪验证与参数微调



    • 使用逻辑分析仪捕获SCK、DQS、DATA线波形,确认额外时钟的出现时机。若发现DQS未正确对齐数据,需调整DLL的phase值或增加dummyCycles




总结:问题根源在于外部采样时钟模式下时序未完全同步,导致FlexSPI提前或延长了数据读取阶段。通过增加空周期、调整DLL延迟、明确数据长度及优化LUT指令,可消除额外时钟,确保正确读取3字节。建议从增加空周期开始逐步调试,结合波形分析验证参数调整效果。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分