This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDSCNCD263P:OSPI 引导加载程序无法从闪存正常工作/正在执行

Guru**** 2463330 points
Other Parts Discussed in Thread: TMDSCNCD263P, TCA6424, TCA6416, UNIFLASH

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469103/tmdscncd263p-ospi-bootloader-not-working-executing-from-flash

器件型号:TMDSCNCD263P
主题中讨论的其他器件: TCA6424TCA6416UNIFLASH

工具与软件:

您好!  

我正在尝试让适用于 OSPI 通信的 TI 示例正常工作。 在 flash_diag 示例中、OSPI 驱动程序设置似乎存在问题。  

目标是让示例 XIP (基准测试/ocmc)正常工作、但我在这方面遇到了问题。 因此、我切换到确保 OSPI 闪存通信按预期工作。

硬件: TMDSCNCD263P、controlCARD 版本 PROC159A

SDK 版本: mcu_plus_sdk_am263px_10_01_00_31

到目前为止已完成的步骤:

1.在不使用引导加载程序(DEV_BOOT 模式)的情况下运行 ospi_flash_diag 示例(C:\xx\mcu_plus_sdk_am263px_10_01_00_31\examples\drivers\ospi\ospi_flash_diag\am263px-cc\r5fss0-0_nortos)。 结果:运行正常、我可以看到相同的 UART 输出作为示例。

2.在"C:\ti\mcu_plus_sdk_am263px_10_01_00_31\tools\boot\sbl_prebuild\am263px-cc\"下使用 sbl_ospi.release.tiimage 运行 ospi_flash_diag 示例。 根据预期使用偏移量0x0对 sbl_ospi 和偏移量0x81000的 ospi_flash_diag 进行刷写。 结果:

 

3.调试了 i2c_flash_reset 中的引导加载程序、其中具有以下代码。 从 EEPROM 读取的调试输出返回0、因此默认函数进入 TCA6416_Flash_reset、该错误消息不正确、因为该芯片仅存在于早期版本 的 controlCARD (版本 PROC159E2)上。 存在一个问题:为什么 EEPROM 没有为 boardver (0)返回正确的值、但是此代码可能需要更新、因此默认函数为 TCA6424_Flash_reset。

4.使用上面第3步中的此步骤创建了自定义引导加载程序。 将 UniFlash 与 HelloWorld 应用程序一起进行刷写。 从 OSPI 运行应用程序。 结果:串行输出正常。 (因此、自定义引导加载程序是可以的、从引导加载 OSPI 似乎也起作用)

5.从#1刷写自定义引导加载程序和 ospi_flash_diag 示例。 现在、随着我们进入应用、我们又进一步一步、但从那里与闪存芯片通信的第一步就失败了。

这意味着我们无法执行第一个 OSPI_norFlashReadId ()。 我尚未继续调试、但 OSPI 模式/时序或类似模式似乎存在根本错误。 能否通过 Flash Diag 示例验证 OSPI SBL 能否正常工作?

谢谢!

RENs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Rens:

    对不起,你面对这个问题,我们上周发现了这个错误,我们正在努力使更新的版本来修复它。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    发生该问题是由于电路板版本不匹配、因为控制卡的新版本具有与 am263px-LP 类似的闪存复位机制。

    同时、您可以使用以下权变措施:

    在 syscfg ( examples\drivers\boot\sbl_ospi\am263px-cc) 添加以下 GPIO 引脚:

    GPIO1.pinDir ="输出";
    GPIO1.$name ="GPIO_OSPI_RST";
    gpio1.defaultValue ="1";
    GPIO1.GPIO_n.$ASSIGN ="EPWM11_B";

    2.在 SBL OSPI 示例中替换该文件 examples\drivers\boot\sbl_ospi\am263px-cc\r5fss0-0_nortos\board.c 使用以下文件:

    C:\ti\mcu_plus_sdk_am263px_10_00_00_35\examples\drivers\boot\sbl_ospi\am263px-lp\r5fss0-0_nortos\board.c

    3.重新编译示例

    对于闪存示例、需要完成相同的操作、

    如果这有帮助、请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Nilabh:

    感谢快速的响应。 对于其他查看此内容的人、请务必选择"GPIO1.GPIO_n.$ASSIGN ="EPWM11_ B/J1 "";(与'EPWM11_相对 A' )。

    现在连接该复位后、定制 SBL 按预期运行。 然而、当我尝试也在示例 ospi_diag 应用程序中刷写时、我遇到了与之前相同的问题、即应用程序未在运行时:

    我注意到、ospi 引导加载程序和闪存诊断应用之间有很多不同的 OSPI 设置。 例如、 在 ospi 引导加载程序中、ospi 时钟 freq 设置为80MHz 而不是133.3 MHz、mode 为1s-1s-1s vs 8d-8d-8d 等  

    我曾尝试对齐 ospi 设置、但认为 ospi 闪存诊断示例包含 OSPI 模块的一些重复次级初始化部分、 因此预计资源锁定或类似机制会导致问题。

    要解决该问题、对于测试、我可以在应用程序启动时添加闪存芯片下电上电、从而复位 ospi 接口。 这允许闪存诊断示例按预期继续、从 OSPI 引导。

    不过、这就会引发有关 OSPI 初始化(相对于 XIP)的一些问题。

    1 -在引导加载程序初始化结束时、就在跳转到应用程序之前、不会关闭/取消初始化 ospiHandle 实例。 从应用程序中、我们希望访问 OSPI 接口。 此句柄是否可从应用程序访问、或者(每个内核)是否需要 opiHandle 自己的实例? 或者、我们是否可能需要在启动应用之前从 OSPI 驱动器中删除资源锁定?

      

    2.多个内核处于运行状态(r5fss0-0/r5fss0-1采用锁步模式、r5fss1-0 和1-1相互独立) -如何确保内核不能 同时访问 OSPI?这是否需要实施队列系统?

    3.目前是否有 建议用于 OSPI 的设置(FREQ、MODE 等)、特别是用于 XIP?

    4. 下一步是使 ocmc_benchmarking 示例项目正常运行、但多个内核会使初始配置不太清晰。  是否有单核 XIP 运行的示例项目?

    谢谢!

    RENs

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我注意到在 ospi 引导加载程序和闪存诊断应用程序之间有几种不同的 OSPI 设置。 例如、 在 ospi 引导加载程序中、ospi 时钟 freq 设为80MHz 而不是133.3 MHz、mode 为1s-1s-1s vs 8d-8d-8d 等。
     

    OSP{I diag 示例使用最低配置、因为预计它将测试闪存是否正常工作、还将读取 SFDP 表、该表用于获取所有受支持的闪存 RW 组合。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    -在引导加载程序初始化结束时、即跳转到应用程序之前、不会关闭/取消初始化 ospiHandle 实例。 从应用程序中、我们希望访问 OSPI 接口。 此句柄是否可从应用程序访问、或者(每个内核)是否需要 opiHandle 自己的实例? 或者、我们是否可能需要在启动应用程序之前从 OSPI 驱动程序中删除资源锁定?[/QUOT]

    尊敬的 Rens:您不需要 OSPI 句柄来执行 XIP、SBL 设置正确、接下来、 CPU 或 DMA 可通过直接存储器映射模式访问闪存中存在的所有代码(指令)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2. 多个内核处于运行状态(r5fss0-0/r5fss0-1采用锁步模式、r5fss1-0 和1-1相互独立)时 -确保内核无法 同时访问 OSPI 的方法是什么-这是否需要实施队列系统?[/QUOT]

    您是否要求对 XIP 或正常的闪存读取和写入执行此操作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    3.目前是否有 建议用于 OSPI 的设置(FREQ、MODE 等)、特别是用于 XIP?

    4. 下一步是使 ocmc_benchmarking 示例项目正常运行、但多个内核会使初始配置不太清晰。  是否有单核 XIP 运行的示例项目?

    谢谢!

    [报价]

    您可以使用这些文档来仅通过 XIP 实现简单的 hello world 示例:

    software-dl.ti.com/.../BOOTFLOW_XIP.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nilabh、感谢您的跟进。

    到目前为止、我已经有一个  使用 XIP 运行的单核项目、然后还运行了 ocmc_benchmark、这样可以向正确的方向发展。

    关于这一点:

    您是向 XIP 还是普通闪存读写请求此问题吗?

    内核2 (r5fss1-0)或内核 3  (r5fss1-1)可能需要将某些变量读取/写入 闪存、同时内核0 (r5fss0-0)使用 XIP 运行一些/所有代码-也是从闪存运行的。  

    处理这个问题的绝对最简单的方法是确保内核2或3只使用 RAM 中的变量-而不使用闪存中的变量。

    但是、如果其他内核确实需要闪存访问、我设想过程如下:

    -内核0和内核2 (或内核3)之间的设置共享(r/w)内存区域,包含内核2 (或3)需要访问的所有闪存变量

    -设置 IPC 在 需要块闪存读取/写入时触发从内核2/内核3到内核0的请求

    -核心0允许此请求并在可能的情况下处理/执行到闪存驱动程序-即代码执行主要来自 RAM 而不是闪存

    我不太清楚这种"正常"闪存读取/写入的可能性。 您是否需要在某些代码区域中构建以便仅从 RAM 执行、从而在 XIP 读取之间留出正常的闪存读取/写入请求时间? 或者、您是否需要依靠较大的高速缓存(例如 RL2高速缓存)来存储一定数量的符号、然后有一个特定的缓冲区、代码仅从高速缓存运行、从而为正常的闪存 r/w 留出时间?

    或者可能我错过了一个步骤- 您是否建议以另一种方式执行此操作?

    谢谢、Rens

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    到目前为止、我已经有一个  使用 XIP 运行的单核项目、然后又运行了 ocmc_benchmark,所以朝着正确的方向前进。

    这是很好的认识。

    对于 XIP、您的方法听起来不错、因为这种方法只有一个内核可以访问 OSPI 驱动器、因此同步开销更小。

    [报价 userid="640733" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1469103/tmdscncd263p-ospi-bootloader-not-working-executing-from-flash/5662070 #5662070"]

    内核2 (r5fss1-0)或内核 3  (r5fss1-1)可能需要将某些变量读取/写入 闪存、同时内核0 (r5fss0-0)使用 XIP 运行一些/所有代码-也是从闪存运行的。  

    [报价]

    这可以通过 IPC 实现。

    因此、有两种方法可以从闪存进行读取:

    1.直接访问模式(内存映射模式),也用于 XIP

    2.间接访问、通过 OSPI 控制器发送一些命令、然后接收返回的响应。

    希望这澄清了疑问。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢 Nilabh。 我将在此主题上做更多实验、如果还有其他问题、我会提出另一个问题。 非常感谢。

    此致、伦斯