您的位置 首页 技术

I2C接口进入busy状况不能退出

问题:该问题发生在STM32F103VDT6器件上。在其产品设计中,使用了STM32的一个I2C接口与一个EEPROM通信。在系统靠性测试中…

问题:该问题发生在 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 两颗器材。

定论:EEPROM 驱动 I2C 总线进入了非闲暇状况,使得 STM32 在接收总线时发生总线裁定失利,从而失掉对总 线的操控,无法发动数据的传输。EEPROM 的这种状况可能是通讯被意外中止形成的。经过对 STM32 进行复位而重现这一现象,在必定程度上契合了这种猜想。但没有试验和理论依据证明必定是该原因 导致了这一问题,是否还有其它原因在起作用,不得而知。

处理:修正软件,参加对 I2C 总线修正的功用。在每次发送开始条件之前首要检测 SR2 中 Busy 位,假如为 ‘1’,则阐明总线上有反常。此时,可由 GPIO 的 OD 形式替代 I2C 通讯口接收 SCL 及 SDA 两个管 脚。经过翻转 GPIO,向 SCL 信号线上发高电平脉冲,脉冲宽度及距离匀为 10uS。每宣布一个脉冲之 后,检测 SDA 信号是否为高电平。若 SDA 信号为已高电平,则将 SCL 拉高,然后向 SDA 信号线发 出一个 10uS 宽的低电平脉冲。然后将 SCL 及 SDA 两个管脚交还给 I2C 接口,并经过将 CR1 中的 SWRST 方位‘1’后再清‘0’来复位 I2C 接口,使其退出 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 标志回到闲暇状况意图。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/236020.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部