[STM32G0] STM32G070 I2C 从机问题修复

[复制链接]
207|22
才没有脸红 发表于 2026-9-5 14:14 | 显示全部楼层
建议你在AddrCallback开头先禁用所有I2C中断,设置好my_i2c_offset后再重新使能,否则在当前回调执行过程中新中断进来会破坏my_i2c_ram数组的内容。
没有太阳的晴天 发表于 2026-9-5 18:06 | 显示全部楼层
my_i2c_offset是uint8_t类型,你在ErrorCallback里做减1操作时如果当前值为0,会回绕到255,然后你的数组索引变成越界访问,读出的全是0x00。
甜心puppy 发表于 2026-9-5 21:15 | 显示全部楼层
从机EEPROM的标准行为是:主机写地址后,后续读从当前地址开始;你代码里写地址那次传输完成后my_i2c_offset没有增加,但读指针已经指向了该地址,读出来的实际上是该地址的内容,偏移1字节说明地址值本身被当作数据输出了。
等凌晨日出 发表于 2026-9-5 21:27 | 显示全部楼层
你需要在HAL_I2C_SlaveRxCpltCallback里判断当前接收的是第几个字节,如果是第一个(地址字节),就不做offset自增;如果是数据字节,做完自增后再存进RAM,这样才不会把地址和数据混到一起。
豌豆爹 发表于 2026-9-6 14:16 | 显示全部楼层
整个问题最简单的修法:放弃用Seq_Receive做链式接收,改成在AddrCallback里用HAL_I2C_Slave_Receive_IT一次性接收所有数据,然后在RxCpltCallback里统一解析第一个字节为地址,后续字节为数据,偏移问题自然消失。
ForgottenRealm 发表于 2026-9-4 12:58 | 显示全部楼层
地址匹配设置和HAL_I2C_Slave_Seq_Receive_IT使用有问题,确保正确处理地址和数据接收。
狄克爱老虎油 发表于 2026-9-5 13:38 | 显示全部楼层
偏移问题可能在于地址匹配设置或地址处理逻辑,先确认I2C地址匹配码设置是否正确,再检查AddrCallback中地址和数据处理的分支逻辑。
Bowclad 发表于 2026-9-6 15:02 | 显示全部楼层
看代码,你的问题出在第一次接收地址时没有自增my_i2c_offset,导致后续数据偏移。试试在HAL_I2C_Slave_Seq_Receive_IT回调里先自增my_i2c_offset。
Jacquetry 发表于 2026-9-7 15:27 | 显示全部楼层
地址匹配码设置要考虑7位和10位地址模式,检查一下你的AddrMatchCode是否正确配置。同时,确保my_i2c_offset在每次通信开始前都重置为0,避免地址偏移。
闪烁阴影 发表于 2026-9-8 13:01 | 显示全部楼层
检查my_i2c_offset在AddressCallback和ListenCpltCallback中的处理,确保地址和数据区分处理,避免地址偏移。
寂静之回响 发表于 2026-9-9 13:27 | 显示全部楼层
先检查你的my_i2c_offset处理逻辑,地址匹配和时序可能有问题,我在类似项目中遇到过这个问题。
DreamWanderer 发表于 2026-9-10 14:14 | 显示全部楼层
偏移问题是因为没有正确处理地址和数据字节,确保AddrCallback中区分地址和数据,并在传输完地址后重置first和my_i2c_offset。
班杰明 发表于 2026-9-11 16:24 | 显示全部楼层
你的问题,我之前也遇到过。主要问题在于处理I2C地址和数据接收的逻辑,要确保每次地址接收后my_i2c_offset正确增加,并且在AddrCallback中正确区分地址和数据。你可以在AddrCallback中添加对first标志的处理,确保每次接收数据时my_i2c_offset加1。同时,注意I2C的总线状态和时钟干扰,这些也会引起偏移问题。
时光迷宫 发表于 2026-9-12 20:03 | 显示全部楼层
你的问题很常见,我在之前的项目中也遇到过。主要问题在于地址匹配和数据处理逻辑。确保你的AddrCallback中正确处理地址和数据字节的接收,不要让地址字节和第一个数据字节混淆。检查你的偏移处理逻辑,确保每次接收到数据后正确更新偏移量。另外,别忘了在HAL_I2C_ListenCpltCallback中重置first和my_i2c_offset。
闪烁黎明 发表于 2026-9-14 14:27 | 显示全部楼层
你的问题可能是my_i2c_offset在接收地址字节时没有自增,导致第一个数据字节读取偏移。在AddrCallback中,你需要确保每次接收到地址后都更新my_i2c_offset,这样就不会有偏移。同时,注意检查HAL_I2C_Slave_Seq_Receive_IT的参数,确保不会错误地处理地址和数据字节。
CarterERO 发表于 2026-9-15 15:29 | 显示全部楼层
地址匹配设置没错,问题在处理数据接收逻辑上,应该将my_i2c_offset在接收到地址后重置为0,并在每个数据接收回调中自增。
Undshing 发表于 2026-9-16 19:02 | 显示全部楼层
检查AddrCallback里地址接收逻辑,确保地址字节和数据字节处理正确,别让第一个数据字节被当成了地址。
Henryko 发表于 2026-9-17 12:30 | 显示全部楼层
看了一下你的代码,感觉问题出在第一次接收地址的时候。你把地址字节存进了my_i2c_offset,但之后的处理逻辑没有正确处理地址和数据的关系。你可以在AddrCallback里加上对数据字节的接收,并正确更新my_i2c_offset。记得第一次接收到数据后要将my_i2c_offset自增。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0