完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
情况说明
在自己写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, 即使重新上电复位. 也就影响了下一次复位的情况. |
|
|
|
只有小组成员才能发言,加入小组>>
3135 浏览 9 评论
2831 浏览 16 评论
3341 浏览 1 评论
8718 浏览 16 评论
3935 浏览 18 评论
9550浏览 3评论
889浏览 3评论
462浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
459浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2181浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-21 19:21 , Processed in 1.000200 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号