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命令。
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命令。
举报