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.

[参考译文] AM2434:AM2434错误的自定义闪存驱动程序

Guru**** 2430620 points
Other Parts Discussed in Thread: AM2434, SYSCONFIG, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1096852/am2434-custom-flash-driver-for-am2434-error

器件型号:AM2434
主题中讨论的其他器件: SysConfigUNIFLASH

您好!

尝试使用本指南创建自定义闪存驱动程序时遇到问题:

AM243x MCU+ SDK:为定制闪存器件编写闪存驱动程序

步骤1:

AM2434使用 IS25PL080D 闪存。 我运行了 ospi_flash_diag 示例并获取了以下信息:

[OSPI 闪存诊断测试]启动  
[OSPI Flash Diagnostic Test] Flash Manufacturer ID:0x9D
[OSPI Flash Diagnostic Test] Flash Device ID:0x6014
[OSPI 闪存诊断测试]在第一个块上执行闪存擦除...
[OSPI 闪存诊断测试]完成了!!!
[OSPI 闪存诊断测试]正在执行读写测试...
[OSPI 闪存诊断测试]写入-读取测试通过!
[OSPI 闪存诊断测试] SFDP 信息:
========================================================================================================
SFDP
========================================================================================================
SFDP 主版本:0x1.
SFDP 次要版本:0x6
此表中的参数标题数:1.

此闪存中其他参数表的类型
------------------------------

Flash_NorXspiDevDefinites gFlashNorXspiDeviceDefinites_ ={

.xSPI_NOR_CMD_RSTEN = 0x66、
.xSPI_NOR_CMD_RSTMEM = 0x99、
.xSPI_NOR_CMD_WREN = 0x06、
.xSPI_NOR_CMD_WRREG = 0x00、
.xSPI_NOR_CMD_BULK_ERASE = 0xC7、
.xSPI_NOR_CMD_SECTOR_ERASE_3B = 0x20、
.xSPI_NOR_CMD_SECTOR_ERASE_4B = 0x20、
.xSPI_NOR_CMD_BLOCK_ERASE_3B = 0xD8、
.xSPI_NOR_CMD_BLOCK_ERASE_4B = 0xD8、
.xSPI_NOR_CMD_PAGE_PROG_3B = 0x02、
.xSPI_NOR_CMD_PAGE_PROG_4B = 0x00、
.xSPI_NOR_CMD_RDSR = 0x05、
.xSPI_NOR_CMD_RDREG = 0x00、
.xSPI_NOR_CMD_RDID = 0x9F、
.xSPI_NOR_CMD_READ = 0x03、
.xSPI_NOR_CMD_888_SDR_READ = 0x00、
.xSPI_NOR_CMD_888_DDR_Read = 0x00、
.xSPI_NOR_CMD_444_SDR_READ = 0xEB、
.xSPI_NOR_CMD_444_DDR_READ = 0x00、
.xSPI_NOR_CMD_114_Read = 0x6B、
.xSPI_NOR_SR_WIP = 0、
.xSPI_NOR_SR_WEL = 0、
.xspi_nor_RDID_NUM_bytes = 5、
.xspi_nor_manf_ID = 0x9D、
.xSPI_NOR_DEVICE_ID = 0x6014、
.xSPI_NOR_114_READ_MODE_CLKS = 0、
.xspi_nor_114_read_dummy_cycles = 8、
.xSPI_NOR_444_READ_MODE_CLKS = 2、
.xspi_nor_444_read_dummy_cycles = 4、
.xspi_nor_444_read_dummy_cycles = 0x00、
.xSPI_NOR_Quad_CMD_READ_Dummy_cycles = 0x00、
.xspi_nor_cread_dummy_cycle = 0、
.xspi_nor_cread_dum_cycle_lc = 0x00、
.xspi_nor_cum_DDR_RDSR_dum_cycle = 0、
.xSPI_NOR_Octal DDR_RDREG_ADDR_Bytes = 0、
.xSPI_NOR_Octal DDR_WRREG_ADDR_Bytes = 0、
.xSPI_NOR_Octal DDR_RDVREG_Dummy_cycle = 0、
.xSPI_NOR_Octal DDR_RDNVREG_Dummy_cycle = 0、
.xspi_nor_cum_RDSFDP_dum_cycle = 0、
.xSPI_NOR_Octal RDSFDP_ADDR_TYPE = 0、
.xSPI_NOR_WRR_WRITE_TIMEOUT = 2000、
.xSPI_NOR_BULK_ERASE_TIMEOUT = 2048000、
.xSPI_NOR_PAGE_PROG_TIMEOUT = 200、
.xSPI_NOR_VREG_OFFSET = 0x0、
.xSPI_NOR_NVREG_OFFSET = 0x0、
.xSPI_NOR_Quad_MODE_CFG_ADDR = 0x0、
.xSPI_NOR_Quad_MODE_CFG_BIT_LO位位= 0x0、
.xSPI_NOR_DDR_八 进制_MODE_CFG_ADDR = 0x0、
.xSPI_NOR_DDR_八 进制_MODE_CFG_BIT_LO位位= 0x0、
.xspi_nor_dum_cycle_CFG_ADDR = 0x0、
.xSPI_NOR_FLASH_SIZE = 1048576、
.xSPI_NOR_PAGE_SIZE = 256、
.xSPI_NOR_BLOCK_SIZE = 65536、
.xSPI_NOR_Sector_size = 4096、
.addrByteSupport = 0、
.dtrSupport = 0、
.qeType = 2、
seq444Enable ={0、0、1、0、0}、
seq444Disable ={0、1、0、1}、
.oeType = 0、
.cmdExtType = 0、
.byteOrder = 0、
};

步骤2:

按照步骤2中的指南操作。 我复制 了 flash_nor_ospi_quad_device_s25HL512T.c 文件,对其进行了修改, 并将其重命名为 flash_nor_ospi_quad_device_is25PL080D.c 并添加到  flash_nor_ospi_quad.h :

extern Flash_NorQspiDevDefinites gFlashNorQDevicespies_IS25PL080D;
extern Flash_Attrs gFlashNorQspiAttrs_IS25PL080D;

 并更改了 makefile 和闪存 JS 文件以包含这些更改。

完成这些步骤并构建 示例工程 ospi_flash_io 后、我收到了此错误:

未定义的首次引用
符号
------ --------
gFlashNorQspiAttrs_IS25PL080D ./syscfg/ti_board_open_close.o
gFlashNorQspiDeviceDefinites_IS25PL080D ./syscfg/ti_board_open_close.o


因此、我修改了文件  flash_nor_ospi_quad_device_s25HL512T.c 以匹配我的闪存类型。 使用这种方法、项目完全构建。

步骤3:

SFDP 表用于修改文件 FLASH_NOR_ospi_quad_device_S25HL512T.c

步骤4:

运行示例 OSPI 闪存 I/O 示例时、程序卡在"无限"循环中、无法退出。

因为它在这种情况下会失败  

我的问题是:  

在尝试添加自定义闪存驱动程序时、我是否错过了一些内容? (步骤2中的描述)

您可以编辑现有的闪存驱动程序吗? (例如 FLASH_NOR_ospi_quad_device_S25HL512T.c)  

如果是、为什么闪存 I/O 示例卡在 while 环路中?

非常感谢你的帮助。

Dominik Ondra

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

    尊敬的 Dominik:

    您是否执行 了文件 AM243x MCU+ SDK:为定制闪存器件编写闪存驱动程序中列出的所有步骤?  

    需要更改多个文件:

    makefile.{soc}.{core}.ti-arm-clang under FILES_common

    还应更新闪存 SysConfig、以便在稍后的示例中适当选择闪存。 为此、打开/source/board/.meta/flash/flash_{soc}.syscfg.js文件。 该对象flash_devices将有多个对应于当前支持的闪存的条目。 添加一个与新闪存对应的新条目。

    You will also need to re-build all the libraries by executing "gmake -f makefile.am243x libs" at the top level of the MCU+ SDK

    例如: C:\ti\mcu_plus_sdk_am243x_08_02_00_31

    确认文件构建和新闪存器件在 SysConfig 中是可选的。 我们现在可以根据新的闪存器件更新文件。  

    使用 ospi_flash_io    SysConfig GUI 更新示例 OSPI 闪存 IO 的 example.syscfg、以选择您添加的新闪存器件。

    构建并运行示例

    此致、

    Ming

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

    Ming、您好!

    很棒的建议 问题出在未重建库。 我已成功运行闪存诊断 I/O 示例。
    我仅更改了 SysConfig 中的闪存类型。


    在 ospi_flash.io 中、我已将偏移基址更改为:

      #define APP_OSPI_FLASH_OFFSET_BASE (512*1024U)

    通过这种更改、程序能够以不间断方式运行、而不会令人沮丧。 不过、OSPI 事务似乎没有完成、
    导致程序产生此错误的原因:

      OSPI 读取数据不匹配!!

      OSPI 读取数据不匹配!!

    我调试了程序、Rx 缓冲区"gOspiRxBuf[]"保持为零、所有索引都保持为零、这最终导致了提到的错误  
    以上内容。 "status"变量保持为成功执行整个运行。 此外、当 位于 ospi_flash_io.c 的第74行时

      status |= ospi_flash_io_compare_buffers ();  

    被调用。 这会导致状态变为失败。

    接下来要采取哪些措施来消除可能的错误?

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

    尊敬的 Dominik:

     当 ospi_flash_io_compare_buffers 失败时、这意味着写入操作失败 或读取操作失败、或者两者都失败。

    1.首先、确保偏移仍然在闪存范围内(< 1MB)。

    2.注释掉 Flash_write。 在 Flash_read 之后 、gOspiRxBuf 应全部为1。 如果是这种情况、Flash_write 将不起作用。

    此致、

    Ming

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

    您好!

    我可以问您此 问题是否已解决? 因为在我的项目中、将使用非常相似的 QSPI 和闪存。

    如果您能分享调试结果、我将不胜感激。

    此致、

    Moonil

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

    尊敬的 Dominik:

    有任何进展吗?

    此致、

    Ming

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

    Ming 和 Moonil 大家好、
    我复制 了 flash_nor_ospi_quad.c、添加 了 flash_nor_ospi_quad_device_is25LP080D.c 文件。  
    并按照 SDK 中的指南激活114和444模式。 由于闪存 来自不同的系列、
    FLASH_NOR_OPSPI_quad.c 中需要进行更多更改、则指南建议 反映 FLASH 数据表。
    通过查看 SFDP 表可以发现其中的大多数更改、以查看哪些值为零。 但确实有
    需要进行大量的试验、错误 和调试。

    但是、114和444模式 在相同的 OSPI 频率下无法工作、我仍然面临问题。 是否可行/建议使用
    更改 SysConfig 中运行值?

    感谢您抽出宝贵的时间、祝您愉快。

    Dominik

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

    尊敬的 Dominic:

    我不确定我是否理解您在这里提出的问题:"  是否可以/建议在运行时更改 SysConfig 值?"

    由于您正在使用自己的自定义闪存驱动程序、因此 SysConfig 仅用于选择(选择)正确的闪存驱动程序并重建取决于闪存驱动程序的示例、如 SBL_JTAG_uniflash 或 SBL_ospi 等

    此致、

    Ming

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

    Ming、您好!  

    让我澄清我的问题。 我在 SysConfig 中进行设置、以便 OSPI 以25MHz 运行。
    是否可以在程序运行期间将其更改为50MHz?

    感谢你能抽出时间、

    Dominik  

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

    尊敬的 Dominik:

    从下面的 syscfg 屏幕截图中可以看到这一点。 OSPI 设置为50MHz (200MHz/4):

    当然、您可以在运行时更改 OSPI 频率、但必须取消初始化 OSPI、并使用新的频率设置重新初始化 OSPI。 SYSCFG 的作用是根据您的选择生成 OSPI 初始化代码:

    此致、

    Ming

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

    非常感谢 Mucjh Ming、祝您愉快。

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

    尊敬的 Dominik 和 Ming:

    您能告诉我  IS25PL080D 闪存的 BOOTMODE[15:0]设置值吗?

    尤其是、您的引导模式[9]设置是什么? 0还是1?

    在数据表中、此引脚与启用/禁用 SFDP 相关、似乎仅适用于 xSPI 引导。

    当 我们使用 IS25PL080D 或 IS25LP064A 等 no-xSPI 闪存时、我想确保引导模式[9]可以为0。

    如果您只是共享设备中配置的设置值、我将不胜感激。

    此致、

    Moonil  

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

    您好 Moonil、

    我不知道 Dominik 最终在他的板上使用了什么模式。 要为 AM243x GP EVM 设置 SPI 闪存引导模式、请参阅 TRM 中的"4.3.1引导模式引脚映射"(表4-2至表4-5)。 请注意、SW-2引脚1-8对应于 B0 - B7、SW-3引脚1-8对应于 B8-15。  

    您可以相应地尝试 OSPI/QSPI/SPI 或 xSPI。

    引导模式[9]之日、它应该与 B8相对应。

    对于 QSPI 和 QSPI、它应该为"Iclk"、因此应该为"on"。

    对于 SPI、SPI 模式0为"模式"、SPI 模式0为"关闭"、SPI 模式3为"打开"。  

    对于 xSPI、 它为"SFDP"、对于 SFDP 为"关闭"、对于 SPDF 为"打开"。

    此致、

    Ming

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

    大家好、Moonil、我一直在使用 UART 引导模式、因为没有驱动程序、我就无法使用 SBL_NULL/SBL_OSPI。
    完成驱动程序和 SBL_NULL 编程后、我必须使用  SPI  引导模式(引导引脚1和2打开、3-9关闭)
    因为根据我的理解、ROM 引导加载程序无法在 QSPI 模式下读取 SBL。

    祝您愉快并取得很大的成功、

    Dominik