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.

[FAQ] [参考译文] [常见问题解答] PROCESSOR-SDK-AM64X:Macronix OSPI NOR 闪存集成指南

Guru**** 2457760 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1483336/faq-processor-sdk-am64x-macronix-ospi-nor-flash-integration-guide

器件型号:PROCESSOR-SDK-AM64X
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

在集成 Macronix 的 OSPI NOR 闪存时、客户会遇到闪存错误。

以下是面临的两个主要问题:

  1. 最常见的错误是:OSPI 控制器无法读取闪存的制造商和器件 ID。
  2. 第二个问题是在步骤1问题解决后无法在8D-8D-8D 下运行以及从闪存读取/写入闪存。

让我们详细了解如何对此进行调试。

注意:

从软件的角度来看、我们不支持 TI EVM 上的 Macronix 闪存器件、但它可以集成。 以下是一些客户调试的结果、如果您计划使用 Macronix 闪存部件、这些调试可以帮助您向前发展。

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

    背景:

    Macronix 是大端字节序、我们的系统是小端字节序。 控制器不提供交换此信号的方法。 如果我们针对所有数据操作始终坚持使用8d-8d-8d 模式、则这不是问题。 但是,当你尝试混合模式的时候,这将是伤害。

    例如、如果我们写入1S-1S-1S 并尝试在8D-8D-8D 中读回、则这是我们观察到的行为。

    最大不模糊速度 10、11、12、13 在1S-1S-1S 模式下、并尝试在8D-8D-8D 模式下读回、然后会发生字节交换、并且获取的数据基本上是这样的 11、10、13、12 . 这不是 我们的控制器的故障,而是 Macronix 闪存部件(大端字节序)和我们的系统(小端字节序)的属性,导致这种冷漠。

    为了消除这种情况、我们必须确保所有操作都仅在一个单模式下发生、因此、例如、在1S-1S-1S 模式下执行来自 ROM->Bootloader->Application 的所有操作、或者所有操作都在8D-8D-8D 模式下执行。

    仅供参考、 我想重点介绍 AM64x TRM (或我们 Sitara SoC 的 TRM 之一)的一部分:

    这允许 ROM 在1S-1S-1S 中启动、然后在启用 SFDP 位时切换到8D-8D-8D。 这可确保引导加载程序和应用程序级别的其余闪存操作都处于8D-8D-8D 模式、比所有操作仅保持1S-1S-1S 模式快得多。

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

    例外情况:

    在8D-8D-8D-8D 中回读时,几乎没有 Macronix 闪存部件可以自行交换字节。 例如:  MX66UW2G345G 是新款 Macronix 八进制闪存 EPN、可以在八进制 DDR 模式下读取时交换字节。

    在这种情况下、控制器无需交换字节、可以在混合模式下运行、例如、ROM 以1S-1S-1S 模式引导、然后引导加载程序和应用程序具有8D-8D-8D 操作模式。  

    但是、如果他们要使用的闪存器件是否支持这种字节交换逻辑、应与闪存供应商联系。 如果没有、那么我们必须在所有级别坚持采用一种运行模式、否则我们可以采用混合运行模式。

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

    假设使用在 SysConfig 中正确设置了闪存配置 遵循指南 、我们可以进一步进行。

    Unknown 说:
    最常见的错误是:OSPI 控制器无法读取闪存的制造和设备 ID。

    出现这种情况的原因如下。

    如果您通读 Macronix 的闪存器件数据表、最常用的命令是0x9Fh、以便读取制造 ID 和器件 ID。

    在这个表中、有时提到在发送这个命令0x9Fh、0x60h (0x9Fh 的倒数)时、从闪存读取的值将在 STR 模式中输出。

    注释6下通常提到它、如下所示。

    这意味着、如果制造商和器件 ID 分别为0xC2和0x8138、那么理想情况下、它将已在接收缓冲区中读回[0xC2、0x81、0x38]、但由于数据字节是在 STR 模式下输出、因此在接收缓冲区中、我们得到以下格式的数据:[0xC2、0xC2、0x81、0x38、 0x38]


    这就要求我们对传入数据的解释方式有所改变。

    在文件 flash_nor_ospi.c 中、有一个 API 可读回数据。 名称为: flash_norOspiReadId()

    我已粘贴以下 API 中的代码片段:

        status = Flash_norOspiCmdRead(config, idCfg->cmd, cmdAddr, numAddrBytes, dummyBits, idCode, idNumBytes);
    
        /* Verify ID with filled data */
        if (status == SystemP_SUCCESS)
        {
            uint32_t manfID, devID;
    
            manfID = (uint32_t)idCode[0];
            devID = ((uint32_t)idCode[1] << 8) | ((uint32_t)idCode[2]);

    因此、在这里我们需要更改一些内容、例如参数 idNumBytes 和我们解释数据的方式、因为我们将收到上面提到的6个值: [0xC2、0xC2、0x81、0x81、0x38、 0x38]

    因此、新片段将如下所示:

        idNumBytes = 6; // because we read back 6 bytes for Macronix Flash part since Data is output in STR mode
        
        status = Flash_norOspiCmdRead(config, idCfg->cmd, cmdAddr, numAddrBytes, dummyBits, idCode, idNumBytes);
    
        /* Verify ID with filled data */
        if (status == SystemP_SUCCESS)
        {
            uint32_t manfID, devID;
            
            // indexes change here as 0xC2 comes on 0th index, 0x81 comes on 2nd index and 0x38 comes on 4th index
            
            manfID = (uint32_t)idCode[0];
            devID = ((uint32_t)idCode[2] << 8) | ((uint32_t)idCode[4]);

    这些更改应该足以读取闪存制造商和器件 ID。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    第二个问题无法在8D-8D-8D 下操作、在第1步问题解决后无法读取/写入闪存。

    中介绍了其中的原因 背景 首选。