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.

[参考译文] TMS320F28386D:从未设置 PMBus 外设中 PMBSTS 寄存器的 PEC_VALID 位

Guru**** 612015 points
Other Parts Discussed in Thread: UCD9090-Q1, TMS320F28388D, UCD9090, TMS320F28386D
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1215111/tms320f28386d-pec_valid-bit-of-pmbsts-register-in-pmbus-peripheral-is-never-set

器件型号:TMS320F28386D
主题中讨论的其他器件:TMS320F28388DUCD9090、、UCD9090-Q1

您好!

我们使用 TMS320F28388D 评估板通过 PMBus 与 UCD9090通信。

我们向 UCD 发送一条启用了 PEC 的写入字节命令(UCD 的命令页、数据字节设置为1)。

我们通过发送启用 PEC 的读取字节命令来读回 UCD 的当前页。 我们希望通过读取 PMBSTS 寄存器的 PEC_VALID 位来检查 PEC 代码、但从未设置该位。

接收到的数据字节如预期的那样为1。

在示波器上观察该信号时、我们可以看到 UCD 发回的 PEC 字节为0x93 (这是我们先前计算出的预期 CRC)。

PMBus 外设的使用方式如下:

  • 未使用警报和控制引脚
  • 寄存器初始值:
  • 我们按照 TRM 中的说明启动读取字节命令(UCD 的命令页面)
  • 我们通过轮询状态寄存器、然后检查 PEC_VALID 位(不重新读取状态寄存器)来等待 EOM。

我们应该能够检查 PEC_VALID 位。  我们做了什么错吗?

此致、

克莱门特

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

    是 UCD9090主设备吗? PMBRXBUF 似乎没有任何接收器。 PMBus 是确认还是发送 NACK?

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

    是 UCD9090主设备吗?  您在 PMBus 从器件中收到了任何消息吗? 您的 PMBRXBUF 为何为空? 从器件是 ACK 还是 NACK?

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

    Manoj,

    UCD9090-Q1不是主器件、而是从器件、TMS320F28386D 是主器件。

    如我们所述、寄存器值的屏幕截图是从交换之前开始的、即初始值。

    我们有 ACK。

    这是 PMBus 交换的屏幕截图。

    下面是我们的 C 代码:

    void APP_exec()
    {
        uint32_t status;
        uint16_t txBuffer[4U] = {0};
        uint16_t rxBuffer[4U] = {0};
        uint32_t computedFrequency;
        uint16_t nbBytesReceived;
    
        /* Initialize PMBUS pins */
        GPIO_setPinConfig(GPIO_24_PMBUSA_SCL);
        GPIO_setPadConfig(24, GPIO_PIN_TYPE_PULLUP);
        GPIO_setQualificationMode(24, GPIO_QUAL_ASYNC);
    
        GPIO_setPinConfig(GPIO_25_PMBUSA_SDA);
        GPIO_setPadConfig(25, GPIO_PIN_TYPE_PULLUP);
        GPIO_setQualificationMode(25, GPIO_QUAL_ASYNC);
    
        // Reset module
        PMBus_disableModule(PMBUSA_BASE);
        PMBus_enableModule(PMBUSA_BASE);
    
        PMBus_initMasterMode(PMBUSA_BASE);
    
        // Set module frequency
        computedFrequency = PMBus_configModuleClock(PMBUSA_BASE, 10000000U, DEVICE_SYSCLK_FREQ);
    
        if (computedFrequency != 10000000U)
        {
            // Error while configuring module clock
            ESTOP0;
        }
    
        /* Select page 1 with command PAGE */
    
        txBuffer[0] = PMBUS_CMD_PAGE;
        txBuffer[1] = 1;
    
        // 1 command byte + 1 data byte
        PMBus_putMasterData(PMBUSA_BASE, txBuffer, 2U);
    
        PMBus_configMaster(PMBUSA_BASE, 0x41U, 1U, PMBUS_MASTER_ENABLE_CMD | PMBUS_MASTER_ENABLE_PEC);
    
        do
        {
            status = PMBus_getStatus(PMBUSA_BASE);
        } while ((status & PMBUS_PMBSTS_EOM) == 0);
    
        DEVICE_DELAY_US(1000000);
    
        /* Read current selected page */
    
        txBuffer[0] = PMBUS_CMD_PAGE;
    
        // 1 command byte
        PMBus_putMasterData(PMBUSA_BASE, txBuffer, 1U);
    
        PMBus_configMaster(PMBUSA_BASE, 0x41U, 1U, PMBUS_MASTER_ENABLE_CMD | PMBUS_MASTER_ENABLE_READ|  PMBUS_MASTER_ENABLE_PEC);
    
        do
        {
            status = PMBus_getStatus(PMBUSA_BASE);
        } while ((status & PMBUS_PMBSTS_EOM) == 0);
    
        if (status & PMBUS_PMBSTS_EOM)
        {
            nbBytesReceived = PMBus_getData(PMBUSA_BASE, rxBuffer, status);
        }
    
        if ((status & PMBUS_PMBSTS_PEC_VALID) == 0)
        {
            ESTOP0; // PEC Invalid
        }
        else
        {
            ESTOP0; // PEC Valid
        }
    }
    

    我们的代码位于  ESTOP0中;// PEC 无效,这不是我们预期的,因为我们已启用 PEC。

    希望它有助于您缩小问题范围。

    克莱门特

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

    Clement,

    在 PMBus 主器件写入字节配置中、主器件传输命令字节、数据字节#0和 PEC。 PEC_VALID 仅在 PMBus 处于接收模式时适用。 在这里、您将发送数据。 因此、不会设置 PEC_VALID 位。

    此致、

    Manoj

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

    Manoj,

    如果您仔细查看、我们是在读取时检查 PEC_VALID、而不是在写入时检查 PEC_VALID、第一次写入的目的是配置我们的读取目标。

    今天、我们对某个位进行了调查并发现我们无法检测到 PEC 位设置、因为该设置无疑在我们的 while 环路中被清除、在该环路中、我们会等待 PMBSTS 寄存器中的 EOM 位设置、因为它在读取时被清除。

    我们添加了一项检查来记录 PEC 位设置状态并将其触发:

    isPECValid = false;
    
    do
    {
    status = PMBus_getStatus(PMBUSA_BASE);
    
    if (status & PMBUS_PMBSTS_PEC_VALID)
    {
    isPECValid = true;
    }
    
    } while ((status & PMBUS_PMBSTS_EOM) == 0);
    
    if (status & PMBUS_PMBSTS_EOM)
    {
    nbBytesReceived = PMBus_getData(PMBUSA_BASE, rxBuffer, status);
    }
    
    if (isPECValid == false)
    {
    ESTOP0; // PEC Invalid
    }
    else
    {
    ESTOP0; // PEC Valid
    }

    但是、这与 TRM 不一致、其中指出了 PMBSTS 寄存器的 PEC_VALID 位:

    0 =接收到的 PEC 无效(如果 EOM 有效)
    1 =接收到的 PEC 有效
    注意:消息期间 PEC_VALID 状态无关。 这将会
    只在 EOM 之后才具有有效值。
    复位类型:SYSRSn

    似乎没有在正确的时刻设置 PEC_VALID。

    请注意、我们确实在某个时刻检查了状态变量最后一个值中 PEC_VALID 是否为1、这使得我们离开等待循环。

    克莱门特

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

    Clement,

    是的、读取 PEC_VALID 位以清除位。

    我想您的重点是 PEC_VALID 位应仅在 EOM 位之后进行设置、但似乎是在 EOM 之前进行设置。 我需要检查设计有关该 PEC_VALID 和 EOM 位的时序。PEC_VALID 可能是在 EOM 位之前设置的。

    但是、请尝试在下面对代码进行更改

    操作

    状态= PMBUS_getStatus (PMBUSA_BASE);

    如果(STATUS 和 PMBUS_PMBSTS_PEC_VALID)

    isPECValid = true;
    }

    }while (((STATUS 和 PMBUS_PMBSTS_PEC_VALID))=0);

    此致、

    Manoj

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

    Manoj,

    是的、似乎在 EOM 位之前设置了 PEC_VALID、这与 TRM 中记录的情况不同、因为在 EOM 置1之前、我们不应该关注 PEC_VALID 位、并且这两个位都位于同一个寄存器中。

    我们没有尝试这样做、因为 EOM 是消息位的末尾、所以在检查有效性前等待似乎更合乎逻辑。

    克莱门特

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

    正如我之前所说的、我需要从时序角度检查设计。 我无法立即回答这个问题。 通常、我希望在2周的时间范围内收到设计回复。 我将在获得这些信息后向您提供最新信息。

    我对前一个线程的响应是为您的问题提供一个解决方案。

    此致、

    Manoj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 您在执行写入字节事务之后是读取字节吗?
    • F28386D PMBus 发送写入字节事务时、UCD909.PMBus 中是否设置了 PEC_VALID 位?
    • 当您读取字节事务时、您是否在 C2000 PMBus 中看到了问题? 您是否从 UCD9090接收到正确的 PEC 字节?
    • 您使用的似乎是轮询方法而不是中断? 对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Manoj,

    • 您在执行写入字节事务之后是读取字节吗?
    是:我们  通过执行地址= 0x41、命令= 0x00和数据= 0x01的写入字节事务来选择 UCD9090当前页、然后通过执行地址= 0x41、命令= 0x00的读取字节事务来读回当前所选页。 接收到的数据如预期的那样为0x01。
    • 当 F28386D PMBus 发送写入字节事务时、UCD909.PMBus 中是否设置了 PEC_VALID 位?
    "那你打算怎么办?"  
    • 当您读取字节事务时、您是否在 C2000 PMBus 中看到了问题? 您是否从 UCD9090接收到正确的 PEC 字节?
    如上所述、如果我们在 EOM 之前对其进行轮询、我们会这样做(这不是我所说的 TRM 应该做的事情)。
    • 您使用的似乎是轮询方法而不是中断? 对吧?
    是的、我们轮询  PMBSTS 寄存器以处理事务、所有中断传播都被禁用。
     
    克莱门特
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如上所述,如果我们在 EOM 之前进行轮询(这不是我所说的 TRM 应该做的事情),我们就会这样做。

    仅需确认、以下陈述是正确的:

    1) C2000 PMBus 确实从 UCD9090接收到了正确的 PEC 字节

    2) 2)您能够看到 PEC_VALID 位设置了、但它被清除

    3) 3)您的主要问题是、TRM 告诉您 PEC_VALID 位应该在 EOM 后进行设置。 但是、您在这里看到的是在 EOM 之前设置的 PEC_VALID 位。

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

    Manoj,

    1)是

    2) 2)是的、我们一开始没有看到它、因为当 EOM 达到1时、先前的读取已清除 PEC_VALID、等待 EOM 进行设置。

    3) 3) TRM 指示 PEC_VALID 的状态在 EOM 设置为"是"之前不相关。

    克莱门特

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

    Cl é ment,

    我已提交 JIRA 请求单来跟踪此商品。 我已经 Ping 设计团队来研究 PEC_VALID 位和 EOM 位的时序。 我希望在10个工作日内收到设计团队的回复。 我会继续向您发布消息。

    此致、

    Manoj

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

    尊敬的 Manoj:

    这件事有什么新闻吗?

    此致、

    克莱门特

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

    设计团队已解决此问题、正在运行仿真。

    我希望下周同一时间再见。

    此致、

    Manoj

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

    Clement,

    这是从设计中收到的反馈。 从计时角度来看、在 EOM 位被设置之前、会设置一(或)两个 PMBus CLK 周期的 PEC_VALID 位。 当对 EOM 位使用轮询方法时、仅当 PEC_VALID 位已设置但 EOM 位仍未设置时、CPU 才可能读取 PMBSTS。 这将像您报告的那样清除 PEC_VALID 位。

    下面是建议的权变措施:

    在外设级别从 PMBus 启用 EOM 中断。 这允许您轮询 PIEIFR9。 INTx13位(以了解是否发生 EOM)而不依靠 PMBSTS 寄存器。

    注意:请确保您未启用 PIEIER9.INTx13 (PMBus 中断)。 这将确保您不会中断 CPU。

    //PMBus 中断(EOM)在 INT9.13中报告。 那么、轮询该标志

    #define WAIT_FOR_EOM_INTERRUPT_FLAG!(HWREGH (PIECTRL_BASE + PIE_O_IFR9)& 0x1000)= 0x1000)

    PMBus_enableInterrupt (PMBUSA_BASE、PMBus_INT_EOM);

    while (wait_for_eom_interrupt_flag );

    现在、当您读取 PMBSTS 寄存器时、当您收到有效的 PEC_VALID 字节时、您应该看到 PEC_VALID 和 EOM 位均已设置

    状态= PMBUS_getStatus (PMBUSA_BASE);

    如果(STATUS 和 PMBUS_PMBSTS_PEC_VALID)

    isPECValid = true;
    }

    IF (STATUS 和 PMBus_PMBSTS_EOM)

    nbBytesReceived = PMBus_getData (PMBUSA_BASE、rxBuffer、status);
    }

    如果(isPECValid == false)

    ESTOP0;// PEC 无效
    }
    方案

    ESTOP0;// PEC 有效
    }

    此致、

    Manoj

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

    Manoj,

    感谢您的答复。

     在设置 EOM 之前、是否会更新 TRM 来校正错误指示 PEC_VALID 无关?

    此致、

    克莱门特

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

    是的、我提交了一个 TT。 我将更新 TRM。 您应该会在下一个 TRM 版本中看到此更新