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
相关产品推荐
相关产品推荐

