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.

[参考译文] AM62P:AM62P:如何禁用 PMIC 看门狗(PMIC TPS65224)?

Guru**** 2461330 points
Other Parts Discussed in Thread: SYSCONFIG, TPS65224-Q1

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1468854/am62p-am62p-how-to-disable-pmic-watchdog-pmic-tps65224

器件型号:AM62P
主题中讨论的其他器件:SysConfigTPS65224-Q1

工具与软件:

我要使用的 SDK 是 mcu_plus_sdk_am62px_10_00_00_14


我们使用的是一个定制电路板、其中我们连接了2个 I2C、一个是 MCU_I2C0、另一个是 WKUP_I2C0。

请参阅下图以供参考:

我使用的示例是 "PMIC_QA_WATCHDOG_RESET"。

我已修改 PMICApp_wdogQAModeReset。

static int32_t PMICApp_wdogQAModeReset(PMIC_Config pmicConfig)
{
    int32_t        status = PMIC_ST_SUCCESS;
    int32_t        retVal = SystemP_FAILURE;
    uint16_t      numSeqeunces = 0;
    uint8_t       answerCnt = 0;
    bool    wdgEnabled = false;
    Pmic_CoreHandle_t *coreHandle = pmicConfig.pmicCoreHandle;
    Pmic_WdgCfg_t tmpWdgCfg;

    status = Pmic_wdgGetEnableState(coreHandle, &wdgEnabled);

    status = Pmic_wdgDisable(coreHandle);
    if(SystemP_SUCCESS == status)
    {
	DebugP_log("Watchdog disabled successfully!!\r\n");
    }
    else
    {
	DebugP_logError ("Watchdog disable failed!!\r\n");
    }
 
    status = Pmic_wdgGetEnableState(coreHandle, &wdgEnabled);

   /* if (status == PMIC_ST_SUCCESS && !wdgEnabled)
    {
       // status = Pmic_wdgEnable(coreHandle);
       // DebugP_log("Watchdog enabled successfully!!\r\n");
    }*/

    if(status == PMIC_ST_SUCCESS)
    {
        /* Configure watchdog for Q&A mode */
        status = Pmic_wdgSetCfg(coreHandle, &gPmicWdgCfg[CONFIG_PMIC0]);
        /* Clear all interrupts */
        status += Pmic_irqClrErrStatus(coreHandle, PMIC_IRQ_ALL);
    }

    if(status == PMIC_ST_SUCCESS)
    {
        DebugP_log("Configure PMIC watchdog in Q&A mode... DONE \r\n");
        /* Begin watchdog Q&A sequence */
        status = Pmic_wdgBeginSequences(coreHandle, pmicConfig.wdogMode);
        if(status == PMIC_ST_SUCCESS)
        {
            /* Exit Long Window */
            for (answerCnt = 4; answerCnt != 0; answerCnt--)
            {
                status = Pmic_wdgQaSequenceWriteAnswer(coreHandle);
                if(status != PMIC_ST_SUCCESS)
                {
                    break;
                }

                /* This check is not required in the actual application. This is to detect
                 * watchdog errors if any, when changing the sysconfig watchdog configuration
                 * during development.
                 */
                PMICApp_checkForWdgErrors(coreHandle);
            }

            if(status == PMIC_ST_SUCCESS)
            {
                DebugP_log("Started watchdog sequence... Sending answers to the PMIC... \r\n");
                /* Send watchdog answers for some iterations */
                for (numSeqeunces = 40; numSeqeunces != 0; numSeqeunces--)
                {
                    /* Enter Window-1 to write Answer-3, Answer-2, and Answer-1 */
                    for (answerCnt = 3; answerCnt >= 1; answerCnt--)
                    {
                        status = Pmic_wdgQaSequenceWriteAnswer(coreHandle);
                        if(status != PMIC_ST_SUCCESS)
                        {
                            break;
                        }

                        /* This check is not required in the actual application. This is to detect
                         * watchdog errors, if any when changing the sysconfig watchdog configuration
                         * during development.
                         */
                        PMICApp_checkForWdgErrors(coreHandle);
                    }

                    if(status == PMIC_ST_SUCCESS)
                    {
                        /* Wait until Window-1 time elapses */
                        ClockP_usleep(gPmicWdgCfg[CONFIG_PMIC0].win1Duration_us + ClockP_ticksToUsec(1));
                        /* Enter Window-2; calculate and send last answer byte */
                        status = Pmic_wdgQaSequenceWriteAnswer(coreHandle);

                        /* This check is not required in the actual application. This is to detect
                         * watchdog errors, if any when changing the sysconfig watchdog configuration
                         * during development.
                         */
                        PMICApp_checkForWdgErrors(coreHandle);
                    }

                    if(status != PMIC_ST_SUCCESS)
                    {
                        break;
                    }
                }
            }
        }
    }

    if(status == PMIC_ST_SUCCESS)
    {
        DebugP_log("Stopped sending watchdog answers... Waiting for the warm reset to occur... \r\n");
        /* Warm reset trigger time depends on threshold value configured in the sysconfig. Waiting for
         * watchdog failure to exceed fail and reset threshold values for the warm reset to occur.
         */
        ClockP_usleep((gPmicWdgCfg[CONFIG_PMIC0].failThreshold + gPmicWdgCfg[CONFIG_PMIC0].rstThreshold + 1U) * \
                      (gPmicWdgCfg[CONFIG_PMIC0].win1Duration_us + \
                       gPmicWdgCfg[CONFIG_PMIC0].win2Duration_us + \
                       ClockP_ticksToUsec(1)));
        /* Warm reset should occur and program should not reach this point. */
        DebugP_log("Warm reset is not triggered.. Watchdog reset failed !! \r\n");
        /* Set return to long window */
        tmpWdgCfg.validParams = PMIC_CFG_WDG_RETLONGWIN_VALID_SHIFT;
        tmpWdgCfg.retLongWin = true;
        status = Pmic_wdgSetCfg(coreHandle, &tmpWdgCfg);
        if(status == PMIC_ST_SUCCESS)
        {
            /* Wait for current watchdog sequence to end and enter long window */
            ClockP_usleep(gPmicWdgCfg[CONFIG_PMIC0].win1Duration_us + \
                          gPmicWdgCfg[CONFIG_PMIC0].win2Duration_us + \
                          ClockP_ticksToUsec(1));
            /* Set the PWRHOLD, so watchdog remains in long window */
            tmpWdgCfg.validParams = PMIC_CFG_WDG_PWRHOLD_VALID_SHIFT;
            tmpWdgCfg.pwrHold = true;
            status = Pmic_wdgSetCfg(coreHandle, &tmpWdgCfg);
        }
    }

    DebugP_logError("PMIC Q&A watchdog reset mode test... Failed !!\r\n");

    return retVal;
}

 编译并运行代码后、我将得到以下输出。

正在启动 Q&A 看门狗复位示例!!
根据通信模式为 Q&A 看门狗配置 PMIC GPIO 引脚... 停止更新的
看门狗禁用成功!!
在 Q&A 模式下配置 PMIC 看门狗... 停止更新的
错误:PMICApp_wdogQAmodeReset:337:PMIC Q&A 看门狗复位模式测试... 失败!!
错误:PMIC_QA_WATCHDOG_RESET_MAIN:143:某些测试失败!

没有手表被禁用并且 MCU 在一段时间后被复位。

您能帮助解决这个问题吗?

 

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

    您好!

    您可以确认"PMIC_wdgDisable"函数正在写入 PMIC 的正确寄存器地址吗?

    您是通过 I2C1还是 I2C2与 WD 寄存器进行通信?

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

    您好、

    您可以确认"PMIC_wdgDisable"函数正在写入 PMIC 的正确寄存器地址吗?

    -您能告诉我可以检查哪个寄存器来知道它是否写入 了 PMIC 的正确寄存器地址吗?

    函数  PMIC_wdgGetEnableState (coreHandle、& wdgEnabled) 总是让我知道它的价值 wdgEnabled 为零、即使我尝试启用看门狗也是如此。

    您是通过 I2C1还是 I2C2与 WD 寄存器进行通信?

    - I2C2.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能告诉我可以检查哪个 寄存器来知道它是否写入了 PMIC 的正确寄存器地址吗?

    由于您通过 I2C2进行通信、因此它将是 PMIC 的寄存器0x09。

    如果正确禁用、WD_EN=0。

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

    您好!

    函数  PMIC_wdgGetEnableState (coreHandle、& wdgEnabled)  总是让我知道它的价值  wdgEnabled  为0、即使我尝试使用功能启用看门狗也是如此  PMIC_wdgEnable (coreHandle)。

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

    您能否提供 I2C 事务的日志?

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

    感谢您发送编修。  

    目前、我们的 MCU 大约每12.5分钟复位一次。 因此、我们假设这是从 PMIC 发生的看门狗复位。 我们只想禁用看门狗复位。 为此、我们会尝试使用 API  PMIC_wdgEnable ()和  PMIC_wdgDisable ()。

    我们已刷写 MCU   PMIC_QA_WATCHDOG_RESET  SDK 10.00.00的示例软件。 但是、本示例的测试未通过看门狗测试。 无法从读取正确的看门狗启用状态  PMIC_wdgGetEnableState () API。  它总是显示、由于这一原因、看门狗已禁用并且看门狗序列本身没有启动。  

    所以,请告诉我们为什么会发生这种情况? 请查看上面适用于 PMIC 的定制电路板原理图剪贴。 我们是否需要在此示例的 SysConfig 中对 PMIC 页面地址进行任何修改?  

    我们如何知道要使用哪个 I2C 地址(I2C1_ID 或 I2C2_ID)来读取和写入看门狗寄存器?

    如果我们目前无法开发、请进行回复。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们如何知道使用哪个 I2C 地址(I2C1_ID 或 I2C2_ID)读取和写入看门狗寄存器?

    通过 GPIO1+GPIO2使用 QnA 模式时、请使用 I2C2_ID。 根据数据表:

    您是否能够访问更基本的 API?

    为此、我们尝试使用 API  PMIC_wdgEnable ()和  PMIC_wdgDisable ()。 [报价]

    您是否具有用于 I2C 通信的基本 API? 我想排除这些特定 API 的任何问题。

    您能否生成 I2C2通信日志?  

    您可以读回所有寄存器0x409、而不仅仅是特定的位字段吗?

    那么、请告诉我们为什么会发生这种情况? 请查看上面适用于 PMIC 的定制电路板原理图剪贴。 我们是否需要在此示例的 SysConfig 中对 PMIC 页面地址进行任何修改?  [报价]

    PMIC 还具有禁用看门狗复位的硬件方法。 对于您的设计、在 R807上放置一个上拉电阻器并移除 R805会是一个诀窍。  

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

    我根本无法读取寄存器0x409。  我正在重新读取您的 SDK 示例、我没有看到任何其他用于 I2C 通信的 API。 如果您知道任何 API 可用、则请建议相同的 API。

    我将看到是否有任何方法生成 I2C2通信日志。  

    可以、有一种方法可以通过硬件禁用看门狗。 但是、我们的所有板都是一个大规模变化。 因此、最好的方法是通过软件禁用它

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

    我们已确定正确 目标、寄存器 和从器件地址。

    I2C 事务成功、便会执行函数  I2C_TRANSFER () 也返回成功。

    请查找功能的 I2C2事务值代码片段  PMIC_i2cWrite () .

      

    我们这边还有其他可以检查的东西吗?
    此外、您能否共享的用户指南  PMIC TPS65224-Q1
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    对于 I2C2通信、它只是 slaveAddr: 0x12、regAddr: 0x09。 如果在启动后立即正确读取、我希望它返回值0xFF。  

    要将其设置为 WD_EN=0、请将0xBF 写入该寄存器。  

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

    读取看门狗寄存器时、它始终显示0x00值。 即使我们尝试通过启用看门狗也是如此  PMIC_wdgEnable ()、 不会写入寄存器、写入后也始终返回0x00值。  

    如上所示、I2C 事务显示正确的值和 PMIC 寄存器地址。 I2C_TRANSFER()始终返回成功。 请告诉我们如何解决该问题。 我们是否可以设置实时调试会话来解决此问题 ?

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

    您好、Vivek、

    您能否确认下面还讨论了通过 MCU+SDK 示例在 PMIC 上禁用 WDT 的主题?

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1442776/am62p-how-to-access-mcu_can-from-linux

    此致、

    Anil。

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

    您好、

    是的、该主题也是相同的。 但是、它不会提供任何解决方案。  

    请先说明、在复位后、看门狗寄存器读取似乎总是显示0x00值而不是默认值0xFF。 我不确定在此情况下是否实际通过 I2C 访问 PMIC 寄存器。  

    我们目前在这个问题上被阻止。 如果我们可以拨打电话来解决问题并进行调试会话、那将非常有帮助。

    谢谢!

    Vivek

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

    您好、Vivek、

    实际上、我能够对 EVM 执行 WD 禁用。

    后来,我请你在海关硬件上做同样的程序。

    然后,当你运行该示例,你最终的 SCI 客户端错误,我已经告诉了 接下来的步骤.

     A53内核已使用 MCU GPIO 中断。 因此、您无法从 R5F 内核访问它们。

    SCI 客户端会抛出错误。这是当前状态。

    您可以安排与 FAE 的会面,我们不允许在公共论坛中安排会面。

    很抱歉。

    此致、

    Anil。

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

    您好、

    是的、之前我们使用的是 PMIC_TRIGGER_WATCHDOG_INTERRUPT 示例。 使用此示例时收到 SCI 客户端错误。

    但是、我们注意到我们的电路板配置了看门狗 QnA 模式。 所以、我们现在使用这个示例。 在此示例中、没有 SCI 客户端错误。 但是、看门狗序列未启动、因为它显示看门狗始终处于禁用状态。  

    请在此论坛中查看此示例之前的评论和证据。

    此外、我已在 EVM 上尝试过、它工作正常。 但是、在我们的电路板上、虽然它具有与 EVM 相同的引脚配置、但无法正常工作。 启动的部分是 I2C 读取和写入操作、始终显示事务成功。 但是、当 registe 被读取时、它始终读取为0值。

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

    您好、Vivek、

    您能否确认 I2C 总线上连接了上拉电阻器?

    此致、

    Anil。

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

    您好、

    您可以确认上拉电阻器已连接在 I2C 总线上吗?

    是的、在 I2C 总线上连接了上拉电阻器。

    我们已尝试 读取(第0页)用户寄存器中的 GPIO 1 CONFIG 寄存器(0x31)、它 会读取 EVM 和定制电路板中的默认值0x20。 因此、至少显示了某个值、而不是值0。 这是否意味着使用 I2C_ID1访问寄存器时不会出现问题? 请确认。

      根据 TRM、GPIO 1寄存器(0x31)的复位值为0x0A。 那么、为什么它在复位后显示0x20?

    我们可以用 I2C_ID1读取第4页的看门狗寄存器吗? 如果是、请建议如何阅读。 I2C 地址将是什么?

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

    团队成员、您好!

    您能回答该问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="639805" url="~/support/processors-group/processors/f/processors-forum/1468854/am62p-am62p-how-to-disable-pmic-watchdog-pmic-tps65224/5649378 #5649378"]我们尝试 读取(第0页)用户寄存器中的 GPIO 1配置寄存器(0x31)、它 读取 EVM 和定制电路板中的默认值0x20。 因此、至少显示了某个值、而不是值0。 这是否意味着使用 I2C_ID1访问寄存器时不会出现问题? 请确认。

    正确、在访问 I2C_ID1时似乎没有任何问题。

    [报价 userid="639805" url="~/support/processors-group/processors/f/processors-forum/1468854/am62p-am62p-how-to-disable-pmic-watchdog-pmic-tps65224/5649378 #5649378"]  根据 TRM、GPIO 1寄存器(0x31)的复位值为0x0A。 那么、为什么复位后它显示0x20?

    对 OTP 进行编程之前、数据表中的值是默认值。 0x20的值与此 OTP 的预期值相匹配。  

    2.我们可以用 I2C_ID1读取看门狗寄存器第4页吗? 如果是、请建议如何阅读。 I2C 地址是什么?[/QUOT]

    要从 I2C_ID1读取第4页、必须首先将 GPIO1和 GPIO2更改为除 I2C2 SCL/SDA 以外的任何内容。 我会跟进有关的地址。

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

    您好、 

    要从 I2C_ID1读取第4页、必须首先将 GPIO1和 GPIO2更改为除 I2C2 SCL/SDA 以外的任何内容。 我会跟进该地址。

    好的、请分享地址。

    我们可以 用 I2C_ID1写入看门狗寄存器第4页吗? 如果需要、I2C 地址会是什么?

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

    团队成员、您好!

    目前、由于这个问题、我们一直处于开发阶段。 您能回答该问题吗?

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

    您好、Naman、

    我很抱歉耽误您的时间...

    我们可以 用 I2C_ID1编写看门狗寄存器第4页吗? 如果是、I2C 地址将是什么?

    在首次将 GPIO1和 GPIO2更改为除 I2C2 SCL/SDA 以外的任何内容后、看门狗寄存器将通过 I2C1位于器件地址0x4C 处。  

    要设置 WD_EN=0、请写入 DevAddr = 0x4C、RegAddr = 0x09、value= 0xBF

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

    感谢您发送编修。

    我已根据您的输入更新了 SysConfig 文件。

    您能否验证更改?

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

    您好、Naman、

    变化看起来不错。

    请记住、启动后、您必须向 PMIC 发送命令、将 GPIO1和 GPIO2更改为 I2C2 SDA/SCL 以外的任何内容  优先  主 I2C 总线与看门狗寄存器进行通信。  

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

    感谢您的确认。

    我尝试通过 I2C1访问看门狗寄存器、方法是配置  DevAddr = 0x4C、我使用的是 API  PMICApp_setGPIOPins ()  更改 GPIO1和 GPIO2作为 GPIO、但我无法访问看门狗寄存器。

    配置 DevAddr = 0x12并使用 API 后  PMICApp_setGPIOPins ()  要将 GPIO1和 GPIO2更改为 GPIO、我可以通过 I2C1访问看门狗寄存器。

    这种行为是否正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="639805" url="~/support/processors-group/processors/f/processors-forum/1468854/am62p-am62p-how-to-disable-pmic-watchdog-pmic-tps65224/5669388 #5669388"]2.在配置 DevAddr = 0x12并使用 API 后  PMICApp_setGPIOPins ()  要将 GPIO1和 GPIO2更改为 GPIO、我可以通过 I2C1访问看门狗寄存器。[/QUOT]

    是的、这种行为是正确的。