I2C与EEPROM通信 上电时SDA为0

情况说明

在自己写STM32模拟I2C中, 写到向EEPROM进行Page Write, 然后Random Read读出所写内容.
发现复位6次中, 5次会读写失败, 1次会成功.
失败的原因是: 发送起始信号前检测到SDA被拉低, 认为总线被占用.

于是我在配置SDA SCL的端口时, 并将两者端口都输出了高电平. 但是这个输出对SDA并不起作用.
于是我在线调试, 发现失败例子中, 一上电未执行任何函数时, SCL为1, SDA为0, 即SDA为低电平, 由于SCL是开漏输出, 电路中已经接好上拉电阻, 所以空闲时应该为高电平才对.

情况分析

于是我认为有2种情况:
第一种是EEPROM自己将SDA拉低;
第二种是电路接线不稳.
但是由于失败成功例子非常规律, 都是5次失败, 1次成功, 我初步认为第二种情况是不可能的.
但是我还是验证了一下, 首先配置了SDA端口的GPIO端口为输出, 一直输出高电平, 然后将这2个口短接, 让这个GPIO口充当电源的功能, 如果是接线不稳的原因, 应该就能正常通信.
但是实验结果是虽然上电后检测到SDA为1了, 但是还是不能正常通信.
由于复位产生的, 端口配置时也不能正常输出, 所以一直在检查SCK端口配置之前的代码

问题解决

但是最后发现其实是在端口配置后的Random Read函数中, 读最后一位字节数据后, 发了个应答信号, 再发结束信号, 导致EEPROM接收到应答信号后, 继续向STM32发送数据, 拉低SDA, 即使重新上电复位. 也就影响了下一次复位的情况.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值