我用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.c和stm32_xx_it.c。重点看两样东西:第一,主循环里调用的那个Stack Process处理函数;第二,从机收到Command之后的Callback回调是怎么写的。把它的应用层代码抄过来改改就能跑了。
兄弟别急,这包确实文档写得有点散,我第一次用的时候也懵了半天。
你现在的状态是:硬件层(CubeMX)配好了,但协议层(stack)不知道怎么接业务代码。
我按我的理解给你理一下主线,你跟着走:
第一步:确认你生成了正确的工程结构 在CubeMX的Software Packs里添加X-CUBE-SMBUS时,Mode窗口有两个checkbox:SMBus stack和PMBus 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() 中初始化堆疊,以及實作函式庫所需的回呼函式。如果沒有回呼函式,堆疊將無處發送接收到的訊框。
感谢各位大佬的回答,我先去尝试一下
尝试结果怎样?
我把这部分丢给队友做了,精力不够 ![]()