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.

[参考译文] AM2432:AM2432 OSPI 闪存访问 0x60000000

Guru**** 2693225 points

Other Parts Discussed in Thread: AM2432, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1578824/am2432-am2432-ospi-flash-access-0x60000000

器件型号:AM2432
主题: SysConfig 中讨论的其他器件

你(们)好

我正在处理一个基于 AM2432 的项目、

我对更改 SDK 有疑问。

我之前使用的 SDK 是工业 SDK 9.0.0.03 版、部分 SysConfig 内容如下所示。

2158db5f-77ef-4673-8b34-4884a3d849c9.png

image.png

OSPI

image.png

我尝试更改的 SDK 是 Industrial SDK 11.0.0.08、SysConfig 内容如下所示。  

image.png

 

image.png

OSPI

image.png

两个 SDK 都使用闪存 API、因此读/写功能正常。

但是、下面的代码有所不同。

#define HTTP_FLASH_FILE_BASE_ADDRESS       0x60000000
#define HTTP_FLASH_FILE_HEADER_START_ADDRESS  0x00E00000// 0x00D98000 //ysh
#define HTTP_FLASH_FILE_START_ADDRESS       0x00E00400// 0x60E00000 //ysh
#define HTTP_FLASH_JSON_START_ADDRESS       0x00EE8000//0x60E00000 //ysh

WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

在工业 SDK 版本 09 中、我可以​​正常访问和读取闪存区域中的值。

在工业 SDK 版本 11 中、值访问在执行代码后失败。

有何差异、如何执行相同的操作?

请快速响应。

谢谢你。  

 

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

    您好;

    我正在浏览代码库、但找不到定义的宏。 因此、我认为这些是您在应用中引入的自定义宏。

    在应用程序中定义偏移之后、您将只执行对闪存的读取操作。 如果是、则您将从闪存中的哪个位置读取数据。

    如果您也要执行写入、那么我也要知道相同的偏移量。 请确保在写入前执行擦除。

    此致、

    Vaibhav

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

    你(们)好

    感谢您的答复。

    闪存使用 W25Q128、在下面的 SysConfig 中定义。

    如前所述、可以使用提供的 API 访问闪存读取和写入。

    据我所知、Osip 将 0x60000000 区域识别为闪存访问地址。

    但是、使用相同的源代码时、
    可访问工业 9.0.0.03 版本、并支持读取和写入操作。
    如下面的函数所示:
    WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

    但是、Industrial 11.0.0.08 版本不支持读写操作。

    WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

    我需要直接访问函数中的闪存区域以支持读取/写入功能、但当我更改 SDK 时、该器件不起作用。

    请告诉我需要更改的内容以及如何继续。

    我会等待你的答复。

    谢谢你。

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

    为了进一步说明、

    实际闪存偏移为 0x00E00400。

    我要检查该器件的值、

    WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

    这意味着我要直接访问和读取它、如下所示:

    WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

    这是直接访问、不使用闪存 API。

    问题在于此器件在 IND SDK 版本 09 和 11 之间的行为不同。

    我想知道我需要更改什么。

    谢谢你。

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

    您好、

    我已经查看了您所附的 SysConfig 屏幕截图。

    您可以在应用中重新访问这些内容并比较 MPU ARMv7 配置。 如果它们完全相同、那么我们可以继续。

    现在、当您说访问失败时、实际上发生了什么。

    那么、之前、当您尝试从偏移 0x00E00400 访问数据时、您是否能够正确读取它?

    如果没有、您看到的行为是什么? 数据中止、数据读取不正确、请详细说明一下。

    此致、

    Vaibhav

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

    您好、

    工业 SDK 9.0.0.03 中使用的 SysConfig 和工业 SDK 11.0.0.08 中使用的 SysConfig 中的 MPU ARMv7 设置是相同的。

    (首先附加的 SysConfig 设置照片)

    SysConfig 中是否有其他部分可以配置这些设置?

    SDK 版本不同、因此 SysConfig 版本也不同。

    工业 SDK 9.0.0.03 SysConfig 版本。

    0.08의 SDK 11.0 μ A SysConfig 版本。

    以下功能在两个 SDK 版本中均正常工作。

    Flash_Read (ospiHandle、HTTP_FLASH_FILE_START_ADDRESS、(uint8_t *) g_ucWebFlash、sizeof (g_ucWebFlash);

    已成功检索闪存数据值。

    但是、在 Industrial SDK 版本 11.0.0.08 中、直接访问失败。

    WEB_FP =(char *)(HTTP_FLASH_FILE_BASE_ADDRESS + HTTP_FLASH_FILE_START_ADDRESS);

    由于实现所需的字符串存在于该偏移处、因此 CPU 在使用 lwip_strnstr (web_fp、str、MAX_WEB_STRING_LENGTH);函数时会冻结。 (这似乎是任务冻结或卡在 while 循环中的症状。)

    因为字符串是可变的、所以我想使用指针直接访问它并进行比较。

    问题是什么?

    为什么行为会根据 SDK 版本而变化?

    它在 Industrial SDK 9.0.0.03 中运行良好、但为什么它在 Industrial SDK 11.0.0.08 中不能很好地运行?

    我将等待你的答复。

    谢谢你。

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

    你(们)好

    在测试这一点和那,我成功地使用下面的函数直接访问!

    Flash_Handle ospiHandle = Flash_getHandle (flash_instance_ID);

    Flash_enableDacMode (ospiHandle);

    我有疑问。
    如果我在本地函数中使用上述函数、然后直接访问它们、那么当我尝试从其他位置再次访问它们时、是否需要再次调用 Flash_enableDacMode 函数?

    如果我在本地调用它、然后直接访问它、是否会再次禁用登记册?

    如果我在调用直接访问的任何位置调用 Flash_enableDacMode 函数、它就可以正常工作。 否则、访问将被阻止。

    我会等待你的答复。

    谢谢你。

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

    您好、

    我们先了解 DAC 模式。

    目前、我们仅在读取闪存时启用 DAC。 对于闪存擦除和写入、我们不启用 DAC 模式。

    DAC 是寄存器 FC40000 中的第 7 位。 当设置为 1 时、闪存内容直接映射到从 0x60000000 开始的地址。

    因此、NOR 闪存的总映射范围为 0x60000000 至(0x60000000 +闪存的大小)。

    因此、一旦启用 DAC 模式、它就不会有任何超时、因此将保留将被设置为 1 的位值。 您必须通过调用禁用 DAC 模式函数来显式将其关闭。

    如果我在本地函数中使用上述函数、然后直接访问它们、那么当我尝试从其他位置再次访问它们时、我是否需要再次调用 Flash_enableDacMode 函数?

    访问以下位置范围内的任何位置时: (0x60000000 +闪存大小)、启用 DAC 后、无需再次调用 ENABLE。

    如果我在本地调用它、然后直接访问它、该注册表是否会再次被禁用?

    编号

    如果在调用直接访问的任何位置调用 Flash_enableDacMode 函数、它都可以正常工作。 如果没有、则访问被阻止。

    这是预期结果。 在中执行一项操作 以前的版本,当你能够完全访问 、在访问之前、放置一个断点、查看寄存器 0xFC40000 的位 7 的值。 是否设置为 1?

    谢谢、

    Vaibhav

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

    您好、

    感谢您的回答。

    我在某种程度上理解。

    但是、需要很长时间才能找到 Flash_enableDacMode 函数。

    我在测试时遇到了问题。

    在您的答案中、您说过一旦调用 Flash_enableDacMode 函数、就不需要再次调用它。

    但是、这与我测试的行为不同。

    正在运行多个任务、某些任务中有直接访问 0x60000000 的函数。

    当第一个任务调用 Flash_enableDacMode 并读取数据时、另一个任务尝试访问 0x60000000、
    除非在访问之前再次调用 Flash_enableDacMode、否则访问会失败。

    因此、现在每次访问 0x60000000 时、该函数都会调用 Flash_enableDacMode。

    请注意、我在工程中的任何位置都不调用 Flash_disableDacMode。

    我应该检查什么?

    谢谢你。

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

    您好、

    请允许我检查更新的 API Flash_enableDacMode。

    我会尽快回复您。

    谢谢、

    Vaibhav

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

    如果调用顶层使能 DAC 模式函数、您将在低电平下看到调用函数 OSPI_LLD_enableDacMode。

    它负责设置 DAC 位。

    现在、当您说您有其他任务时、它们是否也在同一个内核上运行?

    如果是、则必须正好是这样、当您到达要访问闪存区域的另一个任务(0x60000000 +闪存大小)时、届时 DAC 位将设置回 0。 请在到达另一个任务时检查 DAC 位是否设置为 0? 仅在闪存写入的情况下、DAC 位才设置为 0。

    谢谢、

    Vaibhav

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

    感谢您的答复。

    多个任务在同一个内核上运行。

    正如我所理解的、
    每当多个任务直接访问闪存时、我需要设置 DAC 位(0x60000000 +闪存大小)。

    因此、正确的方法是在测试中为每个直接访问调用 Flash_enableDacMode。

    这是与工业 SDK 版本 09 不同的器件。

    谢谢你。

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

    您好、

    因此、正确的方法是为每个直接访问调用 Flash_enableDacMode

    您的理解是正确的。

    谢谢、

    Vaibhav