完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
问题: 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对 STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。 调研: 修改软件,通过打印监控 I2C 通信程序的流程,及 I2C 接口的各个寄存器的状态。当出 现上述现象时,I2C接口的状态寄存器 SR2 中的 Busy 位置‘1’,状态寄存器 SR1 中的 ARLO位置‘1’。用示波器观察 I2C总线,发现其 SCL 为高电平,SDA 为低电平。将 STM32 的复位脚拉到地,SCL 及 SDA 的状态不变。检查原理图,确认 I2C总线上只有 STM32 和 EEPROM两颗器件。 导致了这一问题,是否还有其它原因在起作用,不得而知。 处理: 修改软件,加入对 I2C总线修复的功能。在每次发送起始条件之前首先检测 SR2 中 Busy 位,如果为‘1’,则说明总线上有异常。此时,可由 GPIO 的 OD 模式代替I2C通信口接管 SCL 及 SDA 两个管脚。通过翻转 GPIO,向 SCL 信号线上发高电平脉冲,脉冲宽度及间隔匀为 10uS。每发出一个脉冲之后,检测 SDA 信号是否为高电平。若 SDA 信号为已高电平,则将 SCL 拉高,然后向 SDA 信号线发出一个 10uS 宽的低电平脉冲。然后将 SCL 及 SDA 两个管脚交还给 I2C接口,并通过将 CR1 中的 SWRST 位置‘1’后再清‘0’来复位 I C接口,使其退出 Busy 状态。如图(一)所示:
A:将 SCL 和 SDA 切换成 GPIO 的 OD 模式; B:发送时钟脉冲并等待 SDA 跳变到高电平; C:在 SDA 上发出一个低电平脉冲; D:在 SDA 拉高后,将 SCL 的 SDA 切换回 I2C接口; E:通过 CR1 中的 SWRST 位复位I2C接口; 建议: STM32 中的I2C接口被设计成为主从自适应接口,并充许多个主机共享一条 I2C总线。I2C接口在被使能之后,会不断的检测 SCL 及 SDA 的电平与跳变。当发现有低脉冲出现在 SCL 或 SDA 上时,则认为总线进入了 Busy 状态,其 Busy 标志会置‘1’,直到在总线上检测到一个符合要的停止条件之后,才认为总线回到了空闲状态,这时由硬件清除 Busy 标志。当 I2C接口认为总处于Busy状态且不是由自己占用时,会拒绝向总线上发送信号,因为它认为此刻I2C总线正在被其它的主机所使用。这时向I2C接口发命令,要求产生起始条件,会导致总线仲裁失败。要从这种状态退出,首先要保证总线是处于空闲状态,即 SCL 和 SDA 都为高电平。然后,通过将 CR1 的 SWRST 置‘1’然后清‘0’来复位I2C接口,以达到清除 Busy 标志回到空闲状态目的。 |
|
相关推荐
|
|
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
/7
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:38 , Processed in 0.660213 second(s), Total 41, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
6931