英飞凌
直播中

辛太励

7年用户 1096经验值
擅长:20153
私信 关注

FX3第二阶段引导加载程序需要第二微秒延迟,否则SPI闪存读取将失败,为什么?

我使用的 FX3 配置了 SPI 启动和IS25WP128闪存。 我可以用它成功启动第二阶段引导加载程序。 在我的第二阶段引导加载程序中,它会读取一些闪存,然后从闪存中启动主固件。
我注意到,我需要在第二阶段引导加载程序的main()中首先延迟约 2 微秒,否则闪存读取将失败。 第二阶段引导加载程序中的闪存读取按照 FX3 的 SDK 示例(boot_fw/src/spi_test.c)中的实现方式进行。 [bootFromSpi()])。 交换延迟和配置 SPI 也能达到同样的效果。
事件时间轴:
活动main()
默认引导程序从 SPI 启动
移交给第二阶段引导程序(main()的入口)
CyFx3BootBusyWait(2);
配置 SPI。
从闪存中读取。
...

进一步调试后,根据FX3 启动选项文档第 7.1 节的说明:
For SPI boot, the bootloader sets CPOL=0 and CPHA=0.我注意到我是在第二阶段引导加载程序中为 SPI 接口设置的。
spiConfig.isLsbFirst = CyFalse;
spiConfig.cpol = CyTrue;
spiConfig.cpha = CyTrue;
spiConfig.ssnPol = CyFalse;
spiConfig.leadtime = CY_FX3_BOOT_SPI_SSN_LAG_LEAD_HALF_CLK;
spiConfig.lagTime = CY_FX3_BOOT_SPI_SSN_LAG_LEAD_HALF_CLK;
spiConfig.ssnCtrl = CY_FX3_BOOT_SPI_SSN_CTRL_FW;因此,我可以得出的结论是,默认引导加载程序使用模式 0 访问闪存,而我的第二阶段引导加载程序使用模式 3 访问闪存。如果我将第二阶段引导加载程序改为继续使用模式 0,就完全不需要这么小的延迟了。

SPI 闪存支持模式 0 和模式 3。

如果有模式切换,似乎需要一点延迟。 我的一个假设是,默认引导加载程序在处理第二阶段引导加载程序之前,尚未干净利落地完成闪存读取,但我没有证据证明这一点,因为引导加载程序代码是保密的。

我的问题是

  • 这种行为是预料之中的吗? 我只是想知道是否有其他人有过这样的经历。
  • 如果更改模式,尤其是在两个进程(引导加载程序)之间更改模式,会对 FX3 或闪存芯片产生副作用吗? 我相信,一般不会针对同一芯片改变模式。 也许有更懂行的人可以帮忙解答。
  • 任何关于 2 微秒延迟的解释都会有所帮助。
由于我的开发周期已经很晚了,现在在引导加载程序中将模式改为 0 是不可行的(需要做大量的 VnV)。

回帖(1)

郭中

2024-7-3 17:05:55
在这种情况下,第二阶段引导加载程序需要在读取 SPI 闪存之前进行微秒级延迟,原因可能有以下几点:

1. **电源稳定**:当 FX3 从 SPI 启动时,电源可能需要一些时间来稳定。在电源稳定之前,SPI 闪存可能无法正常工作。延迟可以确保电源稳定,从而避免读取失败。

2. **SPI 接口初始化**:在第二阶段引导加载程序开始读取 SPI 闪存之前,可能需要一些时间来初始化 SPI 接口。延迟可以确保 SPI 接口已经正确初始化,从而避免读取失败。

3. **闪存启动模式退出**:IS25WP128 闪存在启动模式下可能需要一些时间来退出启动模式。延迟可以确保闪存已经退出启动模式,从而避免读取失败。

4. **时序要求**:SPI 闪存和 FX3 之间可能存在一定的时序要求。延迟可以确保满足这些时序要求,从而避免读取失败。

5. **缓存刷新**:在某些情况下,FX3 可能需要刷新其缓存以确保从 SPI 闪存中读取的数据是最新的。延迟可以确保缓存已经刷新,从而避免读取失败。

总之,延迟可以确保 SPI 闪存、FX3 和第二阶段引导加载程序之间的同步和稳定性,从而避免读取失败。你可以尝试调整延迟时间,以找到最佳的延迟长度。同时,也可以检查 SPI 接口的配置和时序设置,以确保它们满足 IS25WP128 闪存的要求。
举报

更多回帖

×
20
完善资料,
赚取积分