嵌入式学习小组
直播中

李舒桀

7年用户 1323经验值
私信 关注

求助,求M0系列单片机作为PMbus从机的例程

如题,我在用Nano100做PMbus从机时,与BMC通信连接上了,但是数据一直传输不对,我在想是不是自己的从机程序出了问题。BMC做主机与长城服务器电源进行PMbus通信时,BMC老是发送FFh,而且电源还会识别这个FFh,并回复自己的从机地址给主机,我在想这是不是PMbus协议里面的某种握手方式,但是在PMbus协议中也没找到相关的介绍,来问问大家,求大神帮忙分析分析,谢谢!

回帖(1)

李斌

2024-1-15 15:21:31
PMbus协议是一种基于I2C总线的数字电源管理总线协议,其通信采用带有ACK的I2C通信。在通信建立过程中有几个握手步骤需要通过。

首先,从机需要向主机发送其从机地址,主机在收到从机地址后才能向从机发送数据。其次,在每次主机向从机发送数据帧时,从机都需要向主机发送ACK确认帧来确认收到主机发来的数据帧。如果从机一直没有发送ACK确认帧,主机就会认为通信失败,并进行重试。

对于您所描述的情况,BMC持续发送FFh可能是在尝试发起PMbus通信握手,但是由于从机没有发送ACK确认帧,所以BMC一直在重试。建议您对从机程序进行调试,确保从机能够正常地发送ACK确认帧,以及正常地接收和处理来自BMC的数据帧。

以下是一个M0系列单片机作为PMbus从机的例程,供您参考:

```
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "HT32F5xxxx_01.h"
#include "PMbus.h"

#define SLAVE_ADDRESS 0x5A

// Declare PMbus global variable
PMBus_t PMBus;

void Pmbus_Init(void)
{
    // Initialize PMBus
    PMBus.PM_I2C = PMBUS_I2C;
    PMBus.SlaveAddress = SLAVE_ADDRESS;

    PMBus.I2C_Configuration.Device_Mode = I2C_DEVICE_MODE_SLAVE;
    PMBus.I2C_Configuration.General_Call_EN = I2C_GENERAL_CALL_DISABLE;
    PMBus.I2C_Configuration.Speed = I2C_STANDARD_SPEED;
    PMBus.I2C_Configuration.Address_Mode = I2C_ADDRESS_MODE_7BIT;
    PMBus.I2C_Configuration.Own_Address = SLAVE_ADDRESS;
    PMBus.I2C_Configuration.Monitor_Mode = I2C_MONITOR_MODE_DISABLE;
    PMBus.I2C_Configuration.Acknowledge = I2C_ACK_ENABLE;
    PMBus.I2C_Configuration.General_Call_Callback = NULL;
    PMBus.I2C_Configuration.I2C_Callback = PMBus_I2C_Callback;

    PMBus.I2C_Status = PMBUS_I2C_Configuration(&PMBus.I2C_Configuration);

    // Enable PMBus
    PMBus_Enable(&PMBus);
}

void PMBus_I2C_Callback(I2C_TypeDef* I2Cx, uint32_t Event)
{
    if (Event & I2C_EV_ACK_FAILURE)
    {
        // Handle ACK failure
    }
    else if (Event & I2C_EV_MONITOR_ALERT)
    {
        // Handle monitor alert
    }
    else if (Event & I2C_EV_GENERAL_CALL)
    {
        // Handle general call
    }
}

int main(void)
{
    // Initialize system clock
    SystemCoreClockUpdate();

    // Initialize PMBus
    Pmbus_Init();

    while (1)
    {
        // Handle PMBus commands
        PMBus_Handle_Command(&PMBus);
    }
}
```

注意,在上述程序中,您需要根据您的具体硬件平台和要求进行适当的修改和调试。同时,您还需要在程序中实现从机的PMbus命令处理函数,以便正确响应来自BMC的PMbus命令。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分