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.

[参考译文] AM3352:热复位/EMIF 热初始化后出现 DDR3问题

Guru**** 2535150 points
Other Parts Discussed in Thread: AM3352

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1180333/am3352-ddr3-issue-after-warm-reset-emif-warm-initialization

器件型号:AM3352

我们在产品中使用具有单个512MB Micron DDR3 RAM 芯片的 AM3352处理器几年了。 在制造过程中、少量电路板测试失败(大约为2000年的5个)、因为它们在热复位(由 Linux OS 的 reboot 命令引起)后不会引导。 在这种情况下、会加载 MLO、初始化 EMIF、然后在对 DDR3进行特定数量的访问后崩溃。 冷复位后、所有这些板在运行深度 RAM 测试时均稳定运行、不会产生错误。

引导加载程序(barebox 2022.08、但 u-boot 相同)始终以相同的方式初始化 EMIF (完全初始化)。 通过使用示波器研究信号 DDR_RESET 和 DDR_CKE、我可以看出、即使使用相同的初始化代码、硬件在两种复位情况下的行为也不同:

在冷复位时、DDR_RESET 的上升沿和 DDR_CKE 的上升沿之间存在适当的延迟(~500us)、热复位情况并非如此(上升沿之间仅存在~30us 的延迟)。

根据我在相关主题中阅读的内容(TI 员工 JJD 的评论)、如果发生热复位、则应使用不同的初始化序列。

什么是热复位的正确 EMIF 初始化序列(必须写入哪些寄存器)? 遗憾的是,参考手册中没有关于这一主题的指导,因此我恳请大家提供支持。

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

    在 AM335x 上进行热复位时、处理器应将 DDR 置于自刷新状态(CKE 低电平表示、复位在整个过程中保持高电平)。  这不是发生的吗?  从热复位开始、初始引导加载程序应检测到复位原因是热复位(在 PRM_RSTST 中)并跳过 DDR 初始化

    现在、如果您打算在每次热复位后初始化 DDR、您指出的 CKE 和复位之间的时序不正确。  您应该能够通过确保在初始化所有 EMIF 寄存器时、REF_CTRL.REG_REFRESH_RATE 应该被设定为0x3100来解决这个问题。  然后、初始化后、可以将其设置回器件刷新率的最佳值。  0x3100应产生所需的500us 延迟、但必须在初始化开始前对其进行设置

    此致、

    James

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

    DDR 处于自刷新状态,但在 VTP 初始化期间,热复位后会被拉低一段时间。 我不明白芯片为什么这么做,因为从我的理解来看,VTP 与重置无关。

    由于某种原因、光框引导加载程序仅将0x2800配置为 REG_REFRESH 速率、这实际上会使延迟略低于500us、但仍大于400us。 但这只是冷复位的情况! 即使在热复位时进行此配置、也无法确保复位和 CKE 上升沿之间的延迟。

    在我看来、EMIF 不打算在热复位后重新配置。 但是、根据我在调试器中观察到的情况、热复位后、EMIF 时钟被禁用、CKE 为低电平。 因此、至少必须启用时钟、CKE 必须以某种方式变为高电平、并且可能需要写入其他寄存器。 TRM 未解释 EMIF 在软复位后的确切行为。 EMIF 如何知道 DDR 在复位期间已经被置于自刷新状态并且必须退出自刷新? 执行自刷新退出序列是为了对哪个寄存器进行访问? 您能告诉我哪些寄存器在热复位后必须写入、顺序是什么?  

    我还发现、当启用自动自刷新功能(PWR_Mgmt_CTRL 设置为0x2A0、正如 EMIF 配置工具所建议的那样)时、在热复位启动期间失败的电路板将在冷启动时崩溃。 在其他电路板上、此配置没有热复位问题、运行正常。 我们不想使用此功能、因此该寄存器通常具有其默认值0。  

    对我来说、所有这些都可能归结为某些处理器/DDR 组合的自刷新退出问题、例如导致 DDR 命令时序超出规格、但不幸的是、我没有测量设备来证明这一点。

    在 TRM 的第7.3.3.12.2章中、提到了在自刷新退出后、EMIF 执行增量调平/训练。 据我从勘误表中知道、不支持 DDR 调平。 这可能是自刷新退出(也是热复位初始化之后)后失败的解释吗?

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

    还需要在热复位后检查 VTP 宏。  如果启用了 VTP 初始化,并且发生了热复位,则应跳过 VTP 初始化。  重新初始化 VTP 将影响所有信号,包括复位信号。  这就是您在短时间内看到复位低电平的原因。

    修复后、我认为由热复位启动的自刷新应该起作用。  CKE 应变为低电平、表示存储器处于自刷新状态、而返回高电平则表示正常运行。  复位应在整个过程中保持高电平。  

    由于 VTP 重新初始化,EMIF 时钟很可能也会被短暂禁用。  

    自刷新进入和退出由硬件触发。  EMIF 负责自刷新进入和退出序列(有几个与自刷新进入/退出相关联的时序寄存器位字段)。  您不必向 EMIF 寄存器写入任何内容、它们的值应在热复位期间保持不变。  

    如果 PWR_Mgmt_CTRL=0、您应该能够正常运行。  这意味着您在正常操作期间、仅在热复位期间、任何时候都不会进行自刷新。   

    AM335x 上的 EMIF 不支持增量调平/训练。  如果您认为在热复位后需要重新训练(例如、如果热复位期间的时间很长、并且温度等环境因素在热复位期间会发生很大变化)、那么我建议在每次热复位后进行完全初始化。  但是、如果热复位时间很短、则应进行自刷新。

    尝试从热复位代码路径中删除 VTP 初始化,检查信令以确保 RESET 保持高电平,并查看您是否获得了正确的功能。  请告诉我结果。   

    此致、

    James

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

    感谢您的答复、我将在1月的第二周休假。 我将尽快对其进行测试。

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

    好的、这里也一样。

    James

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

    大家好、James、希望您在新年的开始。

    我已尝试过您在热复位后跳过 VTP 重新初始化的建议。 我可以确认 DDR_RESET 上的短路脉冲不再发生、但遗憾的是、引导加载程序在热复位后仍会崩溃。

    由于几乎所有电路板都可以正常运行、即使 DDR_RESET 上的脉冲较短、我认为初始化代码也不是根本原因。

    你有其他想法吗?

    我唯一可能的解释是、在保留自刷新时、AM335x 和 Micron DDR 的某些组合中存在某种计时不兼容性。 为了确认这一点、我们需要交换这些电路板上的处理器或 RAM。

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

    热复位后启动时的代码路径(相对于 EMIF)是什么?  热复位后、在引导期间是否修改了 EMIF 中的任何寄存器?  EMIF 中配置了一些自刷新退出时序、但应使用 EMIF 配置工具正确设置该时序。  这是否用于您的电路板?  如果是、您能否发送电子表格和 Micron 器件型号?  我可以检查设置。

    此致、

    James

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

    我尝试了完整的 EMIF 寄存器配置(所有寄存器都被写入)和所需的最小配置(时钟使能和 DDR_cke_ctrl)、唯一的区别是缺少复位脉冲。

    我们使用的 Micron RAM 是 MT41K256M16HA-125 IT 或 MT41K256M16TW-107 IT

    请在附件中找到寄存器配置工具(旧版本、因为项目已有6年历史)。

    e2e.ti.com/.../AM335x_5F00_DDR_5F00_register_5F00_calc_5F00_tool_5F00_SUB3.xls

    这些是我们将使用的 EMIF 寄存器值:

    DDR_PHY_CTRL_1:0x100007

    SDRAM_TIM_1:0x0AAAD4DB

    SDRAM_TIM_2:0x266B7FDA

    SDRAM_TIM_3:0x501F867F

    zq_config:0x50074BE4

    SDRAM_CONFIG:0x61C05332

    SDRAM_CONFIG2:0x0

    SDRAM_REF_CTRL:0xC30

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

    您能解释更多有关"最低所需配置(时钟启用和 DDR_cke_ctrl)"的信息。  您要写入哪些寄存器?   

    我认为、在热复位失效后、DDR 应该自动退出自刷新状态。  您可以通过在热复位变为高电平后监控 CKE 信号来检查此情况。  您不必写入 EMIF 中的任何寄存器。  这将确保正确的自刷新退出序列。  这不是发生的吗?

    此致、

    James

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

    光框的初始化代码如下所示:

    am33xx_enable_ddr_clocks();
    
    am33xx_config_vtp();
    
    am33xx_ddr_phydata_cmd_macro(cmd_ctrl);
    am33xx_config_ddr_data(ddr_data, 0);
    am33xx_config_ddr_data(ddr_data, 1);
    
    am33xx_config_io_ctrl(ioctrl);
    
    val = readl(AM33XX_DDR_IO_CTRL);
    val &= 0xefffffff;
    writel(val, AM33XX_DDR_IO_CTRL);
    
    val = readl(AM33XX_DDR_CKE_CTRL);
    val |= 0x00000001;
    writel(val, AM33XX_DDR_CKE_CTRL);
    
    am33xx_config_sdram(emif_regs);

    如果在热复位后没有 EMIF 寄存器被写入、则 CKE 将保持低电平并且看不到时钟。 要使 DDR 接口正常工作、至少必须启用时钟、并且必须设置 DDR_cke_ctrl 位(以禁用 CKE 门控)。 仅当执行该 CKE 变为高电平且时钟被启用时。

    am33xx_enable_ddr_clocks();
    
    val = readl(AM33XX_DDR_CKE_CTRL);
    val |= 0x00000001;
    writel(val, AM33XX_DDR_CKE_CTRL);

    您是否能够检查我的 DDR 设置? 我认为他们是可以的,但对独立的核查却非常感兴趣。

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

    好的、这对于 DDR_CKE_CTRL 是可以的。  这实际上是控制模块中的一个寄存器、而不是 EMIF、并且用作 CKE 信号的覆盖。  一旦将其设置为1、它将禁用覆盖、这就是您看到时钟的原因。  

    因此、我认为您确实需要在  热复位之前将 PWR_Mgmt_CTRL 设置为0x2A0。  我认为正在发生的情况是、您已禁用 PWR_Mgmt_CTRL = 0的自刷新、因此不会执行自刷新退出命令。

    因此、从热复位开始 、启用  EMIF 时钟并  设置 DDR_CKE_CTRL = 1。  在 PWR_Mgmt_CTRL 设置为0x2A0时、当 EMIF 不空闲时、将出现正确的自刷新退出命令。

    如果热复位是确定性的、则可以为正常操作将 PWR_Mgmt_CTRL 设置回0、然后在启动热复位之前将其设置为0x2A0。  如果您不知道何时发出热复位、则需要保持 PWR_Mgmt_CTRL=0x2A0、以便将正确的自刷新进入/退出命令发送到存储器。

    此致、

    James

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

    PWR_Mgmt_CTRL=0x2A0的情况下、即使是冷启动也会在电路板上进行一定数量的 DDR 访问后失败、而以前在热复位期间失败的 DDR 访问也会失败。 这些电路板上的自刷新入口或出口出了问题。

    你有其他建议吗? 请告诉我检查 DDR 设置的结果、可能有些时间已经过了。

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

    我不确定自刷新进入/退出会出现什么问题。  我查看了您的时序、与 DDR 数据表相比、这些时序看起来不错。   

    由于您已将该产品投入生产一段时间、因此您可能需要返回到最初的状态、即每次热复位时重新初始化 DDR。  这似乎可以为您提供最稳定的操作、因为冷复位没有给您带来任何问题。  我想、最初您在复位和 CKE 时序方面遇到了一些小问题、这只是导致少数电路板出现故障的原因。  一旦使其更加稳健、您应该能够使热复位退出更加稳健。

    因此、我的建议是返回到原始代码、然后再返回

    -keep PWR_Mgmt_CTRL=0始终保持不变

    -在热复位后跳过 VTP 重新初始化

    -确保在 首次 EMIF 寄存器写入时发生对 REF_CTRL.REG_REFRESH_RATE = 0x3100的写入。  然后像在冷启动时一样写入所有其他寄存器、然后确保最后一次寄存器写入 SDRAM_CONFIG 寄存器(这将启动硬件初始化序列)。  

    -最终写入 EMIF 将为 REF_CTRL.REG_REFRESH_RATE = 0xC30、这将为存储器提供适当的刷新率。

    当观察示波器上的 CLK、RESET 和 CKE 时、在热复位后、您应该会看到首先重新启用 CLK、RESET 应该至少为低电平200us。  一旦复位变为高电平、CKE 应在至少500us 延迟后变为高电平。   如果没有发生这种情况、则热复位后的初始化不正确。

    此致、

    James