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

【实战经验】I2C配置顺序引发的异常案例

[复制链接]
zero99 发布时间:2017-5-31 11:06
I2C配置顺序引发的异常案例

% Q+ U9 m9 a: m# P; |前言
. G" r! s9 |7 u; g% i' P        在参考Cube软件包中I2C例程后, 根据应用需要新增了一路I2C接口,结果新增I2C无法收发数据。本文主要对问题进行描述,分析产生原因,提供解决方法。- Q' o( W. Q7 o3 C$ q0 _
' R) z5 M* ?6 O) O& ^6 m, r5 {
一 问题描述# k/ T# H6 t& A; a& q+ B/ K) u
       如前言所述,现象表现为I2C无法收发数据。得无法理解之处,在于之前已经完成了I2C的移植工作,并且运行正常。现在遵照正确的方式,新添一路I2C接口,只是更改了对应的I2C接口及引脚,为什么无法收发数据。简化测试程序如下。 5 Y( U" L2 w, t: x, y& N
11.jpg
8 u0 v" {' p" Y
12.jpg ; \& C- D8 W3 ?. k4 Q$ n" D

2 K& b% V& i9 H+ Q$ A) V' T二 现象分析
* S; T8 y5 w5 J     将上述程序在STM32F469i-Disco板上实现,复现现象并寻找规律。发现规律如下:7 a! e4 ?' |% Z; g" K1 m3 u! z/ Z
13.jpg
; L, b4 v& Z6 o) ~. N! P; e9 ]+ S; |      分析上表可以发现问题的产生与硬件设计有一定关系。观察发现,如果I2C没有外部上拉时,会导致问题产生。
' [; v7 J- b; [* u      通过单步调试,定位于HAL_I2C_Master_Transmit(),在这个函数中调用的I2C_WaitOnFlagUntilTimeout()无法执行异常,返回HAL_BUSY,导致了I2C写功能失败。在I2C_WaitOnFlagUntilTimeout函数内部,是对忙标志位BUSY@I2Cx_SR2的检测。通过对参考手册的阅读(如下截图所述),如果在未占用I2C总线时,SDA或SCL引脚存在低电平,则意味着总线处于忙状态。这种检测机制在I2C接口失能时依然工作。' G% y; F8 e( w/ S
14.jpg ' i- I& {) u$ y
      结合程序中调用顺序,在I2C3时钟使能时,虽然I2C3没有使能,但是忙状态检测已经开始。由于对应的SCL引脚上无上拉电阻,并且由于还未对I2C3的SCL引脚进行配置。此时SCL引脚为浮空输入状态,实际测量发现为低电平, BUSY标志被置位。
) ~, @) ?  K/ a/ h4 ]) V
- e8 A6 K0 w7 g) l8 `( d6 r6 `* G三 解决方法
# \$ u8 p" [+ Z0 V0 D5 U     通过现象及分析,可了解到问题可通过硬件或者软件解决。" o, v& t. R: _7 p- ]! [
     硬件上,为SDA、SCL引脚提供外部的I2C上拉电阻,问题不在出现。) ^) W$ r( k2 I" ]- k- j4 c0 \
     软件上,能够发现对于SCL、SDA引脚配置中,会启用内部上拉。通过将I2C时钟使能放于I2C引脚配置语句后面,问题不再出现。
9 d5 T4 Z; w5 }     需要注意, I2C的SDA、SCL引脚内部上拉电阻,为弱上拉。使用者可以通过对应型号STM32的数据手册,查看对应引脚的上拉电阻,以便判断是否能够满足应用需要。如下为STM32F469 上拉电阻信息截图。
( P( t; c  Q1 u/ W5 y 15.jpg   c3 |7 l+ J% Q5 x5 ^% H

4 W" d0 s9 ~$ f, t
# N" q+ ^3 p  r% n+ Q/ ~5 }
I2C配置顺序引发的异常案例.pdf (261.25 KB, 下载次数: 135)
收藏 1 评论12 发布时间:2017-5-31 11:06

举报

12个回答
moyanming2013 回答时间:2017-5-31 12:24:30
学习了。
arenas 回答时间:2017-6-1 10:23:42
感谢分享经验,学习了
samhong 回答时间:2017-6-6 15:24:02
谢谢分享经验.
supermiao123 回答时间:2017-6-7 15:04:14
谢谢分享经验
epochal 回答时间:2017-6-15 23:06:34
谢谢分享!!!
HenryChen 回答时间:2017-9-13 14:36:46
谢谢分享!!!
waiman 回答时间:2018-1-25 09:16:08
我发现很奇怪的问题,% ^: \0 R1 K. u/ u8 Y: c# ^- e
STM32L053C8T6   / p- x1 }4 Y- W
Cubmex 4.23  
' w+ k0 o' ]3 X+ D. {% q* G% e" {L0包 1.10
! a: z& @/ c/ O3 \- M4 h9 ~/ t+ {$ E  j5 z
新配置Cubmex工程,只生成I2C,MSI 2MHz主频,在低功耗配置,能正常读写I2C设备。
0 k" _5 v7 r. \, o( s- y$ {; V1 y9 r" C  X/ a
但一打开LCD+RTC+I2C,MSI 2MHz主频,在低功耗配置的情况下,I2C_WaitOnFlagUntilTimeout()返回TimeOUT1 A% {0 E3 j9 \1 W" o7 K) ^

8 o* N3 d  G* g, h% y0 q, z
+ S# W, Y3 c+ T( _" l
waiman 回答时间:2018-1-25 09:17:34
没用打开LCD RTC的情况下,用逻辑分析仪可以读出I2C有数据通信。
- `+ R5 [2 V; Y7 r一旦打开LCD RTC之后,I2C就没用数据输出了
天眼tianyan 回答时间:2018-11-26 16:13:07
受教了
VRichard 回答时间:2018-11-30 16:28:09
这方法,确实可以,但是我们的I2C设计,外面接有上拉电阻,有时候也会出现卡在 I2C_WaitOnFlagUntilTimeout() 这个地方,将I2C时钟放后面测试就没有问题,不知道为什么。。。
xujiantj 回答时间:2019-1-11 11:05:01
学习了
适苦欲死 回答时间:2019-1-11 11:11:46
经验之谈,新手多多聆听                                          

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版