You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32编写MB85RC16 FRAM驱动:I2C读取异常问题求助

MB85RC16 FRAM读取问题分析

MB85RC16读取指定内存地址的I2C时序要求是连续的:发送设备写地址→发送内存地址→发送重复起始信号→切换到设备读地址→接收数据。

你用HAL_I2C_Master_Transmit发送内存地址后,这个函数会自动发送停止信号,直接结束了当前I2C传输。后续调用HAL_I2C_Master_Receive是发起一次全新的读操作,FRAM此时没有关联你之前发送的内存地址,所以返回的是无效数据(0)。

而HAL_I2C_Mem_Read内部已经封装了完整的时序流程:发送内存地址后自动发送重复起始信号,再切换到读方向,因此能正确读取目标地址的数据。

如果要手动实现读流程,不能分开调用Master_Transmit和Master_Receive,需要使用HAL的低阶操作来避免发送停止信号,或者直接复用HAL_I2C_Mem_Read的逻辑。比如可以参考HAL库中HAL_I2C_Mem_Read的源码,自己实现带重复起始的读操作。

另外你可以用示波器对比两种方式的时序差异:

  • 你的代码时序:发送写地址→内存地址→停止→起始→读地址→接收数据
  • HAL_I2C_Mem_Read时序:发送写地址→内存地址→重复起始→读地址→接收数据

核心差异就是前者多了一次停止+重新起始,而后者用重复起始连贯了整个流程,这正是FRAM要求的正确读时序。

内容的提问来源于stack exchange,提问作者Iamverystuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:15:24