请直接帮我定位并修复当前 STM32G431 工程中 I2C1 读取 BMI270 IMU 失败的问题。
你可以读取和修改当前工程代码,执行编译,烧录到目标板,并通过调试会话、寄存器观察、UART 或 RTT 日志验证结果。若已有 I2C 抓包文件或逻辑分析仪,请用它验证启动、地址、ACK、重复起始和停止条件;没有真实波形时不要伪造波形结论。
I2C 总线:I2C1,PB8=SCL,PB9=SDA,400kHz。
当前预期:上电后读取 CHIP_ID,并以 100Hz 输出加速度和陀螺仪数据。
I2C 初始化返回成功,但读取 CHIP_ID 时出现 HAL_TIMEOUT 或 HAL_ERROR。逻辑上怀疑是 GPIO 复用、上拉、电气时序、时钟树、DMA/中断优先级,或设备地址处理不一致造成的问题。
- 找到时钟树、GPIO、I2C1、DMA、NVIC 和 BMI270 驱动相关代码;
- 核对 APB 时钟、I2C timing 寄存器、开漏复用、上拉和 7 位/8 位地址传参;
- 检查 START、重复 START、地址 ACK/NACK、寄存器地址长度、读写方向、STOP 和错误恢复路径;
- 在失败路径增加有限、可关闭的诊断日志,至少记录 HAL 状态、错误码、I2C ISR 标志和实际访问地址;
- 优先用断点和寄存器观察确认总线状态;如现场有 UART/RTT 日志,采集一次失败与一次成功初始化的对比;
- 如果有真实波形,对比正常与失败事务的地址、ACK、时钟频率、上升沿与停止条件;
- 验证连续 100 次 CHIP_ID 读取成功,并确认 100Hz 数据输出不丢帧。
最终请列出:修改文件、根因、关键寄存器或日志/波形证据、编译/烧录结果,以及仍需由硬件确认的事项。