大佬们,有没有用STM32的HAL库做过PMBus通信的,一个32做主机,另一个做从机。

我用CubeMX配置SMBus,添加X_CUBE_SMBUS包,我看文件夹Middlewares中有stm32_PMBUS_stack以及stm32_SMBUS_stack,但是下一步不知道应该做什么,我不会使用

别去硬啃Middleware里面的底层源码,容易看晕。ST的套路都一样,你既然下好了X_CUBE_SMBUS包,直接去这个包的安装目录(一般在STM32Cube\Repository下)找Projects文件夹。里面肯定有对应某些开发板(比如NUCLEO或EVAL)的现成Example。 找到PMBus相关的工程,直接打开看它的main.cstm32_xx_it.c。重点看两样东西:第一,主循环里调用的那个Stack Process处理函数;第二,从机收到Command之后的Callback回调是怎么写的。把它的应用层代码抄过来改改就能跑了。

兄弟别急,这包确实文档写得有点散,我第一次用的时候也懵了半天。

你现在的状态是:硬件层(CubeMX)配好了,但协议层(stack)不知道怎么接业务代码。

我按我的理解给你理一下主线,你跟着走:

第一步:确认你生成了正确的工程结构 在CubeMX的Software Packs里添加X-CUBE-SMBUS时,Mode窗口有两个checkbox:SMBus stackPMBus extension,两个都要勾上。生成代码后,你的工程里应该有:

  • Middlewares/ST/STM32_SMBus_Stack/ —— 这是核心协议栈
  • Drivers/BSP/ —— 板级支持(如果你选了的话)

第二步:理解stack的工作方式 这个stack不是给你调HAL_I2C_xxx用的,它封装了一层状态机。你的代码主要和三个函数打交道:

  • STACK_SMBUS_Init() —— 初始化,绑定I2C句柄
  • STACK_SMBUS_HostCommand() —— 主机用,发起一次通信
  • STACK_SMBUS_ExecuteCommand() —— 从机用,收到命令后的回调

第三步:从机怎么写 从机最关键的是CMD_Table,这是一个数组,告诉stack:“当我收到命令码0x01时,我去读哪个寄存器;收到0x02时,我去写哪个寄存器”。

const tSMBUS_CMD_Table MyCmdTable[] = {
    {0x01, MyReadHandler, MyWriteHandler, 1},  // 命令码, 读回调, 写回调, 数据长度
    {0x02, MyReadHandler2, NULL, 2},
};

然后在STACK_SMBUS_ExecuteCommand()里根据stackhandle.CurrentCommand去分发。

第四步:主机怎么写 主机简单很多,构造好命令结构体,调STACK_SMBUS_HostCommand(&stackhandle, &cmd)就行。注意这个函数是非阻塞的,结果在中断回调里看stackhandle.State

特别提醒:

  • 官方例程在Projects目录下,找跟你板子最接近的,比如NUCLEO-G431RB或者F072的Discovery。
  • 一定要看AN4502,这是官方应用笔记,虽然厚但第8章"Configuration"和第9章"Project example"是救命稻草。
  • 两块32之间连线时SDA和SCL都要上拉,哪怕板子内部有上拉,外部再加个4.7k更稳,PMBus对信号完整性比I2C敏感。

有问题再贴具体报错,大家帮你看。

你看待這些資料夾的角度可能不太對。stm32_SMBUS_stack 是底層的通訊層,而 stm32_PMBUS_stack 則位於上層,負責 PMBus 命令的處理。
接下來你通常需要做的是:啟用 HAL SMBus 周邊裝置、將中介軟體的原始碼檔案加入專案、在 main() 中初始化堆疊,以及實作函式庫所需的回呼函式。如果沒有回呼函式,堆疊將無處發送接收到的訊框。

感谢各位大佬的回答,我先去尝试一下

尝试结果怎样?

我把这部分丢给队友做了,精力不够 :sweat_smile: