你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】I2C 接口进入 Busy 状态不能退出

[复制链接]
STMCU小助手 发布时间:2022-2-19 17:09
问题:
% l5 `3 e7 x3 R' u该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对 STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
  v: S, k6 y1 d# Z1 T& ?调研:0 ^* J5 f# i& i. L. C) D
修改软件,通过打印监控 I2C 通信程序的流程,及 I2C 接口的各个寄存器的状态。当出现上述现象时,I2C 接口的状态寄存器 SR2 中的 Busy 位置‘1’,状态寄存器 SR1 中的ARLO 位置‘1’。用示波器观察 I2C 总线,发现其 SCL 为高电平,SDA 为低电平。将 STM32
/ V; s0 s# c2 ?的复位脚拉到地,SCL 及 SDA 的状态不变。检查原理图,确认 I2C 总线上只有 STM32 和EEPROM 两颗器件。
" F+ v" T" b% u% Y2 N/ o" ~' t& x
0 x& \3 z6 U0 b3 }: I# O& H" P结论:3 Y7 S* N7 I/ ]0 \
EEPROM 驱动 I2C 总线进入了非空闲状态,使得 STM32 在接管总线时发生总线仲裁失败,进而失去对总线的控制,无法启动数据的传输。EEPROM 的这种状态可能是通信被意外中断造成的。通过对 STM32进行复位而重现这一现象,在一定程度上吻合了这种猜测。但没有实验和理论依据证实一定是该原因导致了这一问题,是否还有其它原因在起作用,不得而知。+ Z8 @  h8 f+ g6 n$ X
5 G5 @) ]+ H0 [& F+ _% o# {
处理:
2 U; A: n9 d6 a: z9 t% W. K修改软件,加入对 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 状态。如图(一)所示:
1 E! {4 t; L" M  B; ~2 T& B) }# e
7 V% D( P) c4 x6 O- { I9197GSD}]I5UWGRUV62.png 6 A* o, o# a+ i  ]7 t( H/ p
1 C8 B8 h! h- O" G0 a4 b
A:将 SCL 和 SDA 切换成 GPIO 的 OD 模式;
- i9 x+ B6 J+ _- M1 k8 V! K9 }B:发送时钟脉冲并等待 SDA 跳变到高电平;
0 [7 O# H1 s4 m' R9 L2 ?C:在 SDA 上发出一个低电平脉冲;
2 n& Q; T, g* D3 D+ U7 TD:在 SDA 拉高后,将 SCL 的 SDA 切换回 I2C 接口;3 p8 y, E. m2 M9 J& T4 j; o
E:通过 CR1 中的 SWRST 位复位 I2C 接口;
1 s1 z( e# ]1 o5 u0 Q
5 F5 {3 r( d# x5 e: q: Y7 z建议:8 ~: }7 p$ D# @; L* N5 A/ U1 M3 O
STM32 中的 I2C 接口被设计成为主从自适应接口,并充许多个主机共享一条 I2C 总线。I2C 接口在被使能之后,会不断的检测 SCL 及 SDA 的电平与跳变。当发现有低脉冲出现在 SCL 或 SDA 上时,则认为总线进入了 Busy 状态,其 Busy 标志会置‘1’,直到在总线上检测到一个符合要的停止条件之后,才认为总线回到了空闲状态,这时由硬件清除 Busy 标志。当 I2C 接口认为总处于 Busy 状态且不是由自己占用时,会拒绝向总线上发送信号,因为它认为此刻 I2C 总线正在被其它的主机所使用。这时向 I2C 接口发命令,要求产生起始条件,会导致总线仲裁失败。要从这种状态退出,首先要保证总线是处于空闲状态,即 SCL 和 SDA 都为高电平。然后,通过将 CR1 的 SWRST 置‘1’然后清‘0’来复位 I2C 接口,以达到清除 Busy 标志回到空闲状态目的。+ Z/ l" X- \" C; P" e  r* X5 E. O

( h& n1 A2 J" `) A# I$ o$ w9 S) S
赞 收藏 评论0 发布时间:2022-2-19 17:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版