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

【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出  

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
% X7 ?7 Z  K9 m/ ?5 k 
; b$ J: s) |% ?问题详细描述以及ST官方解答见文档: I2C 接口进入 Busy 状态不能退出.pdf (118.83 KB, 下载次数: 713)
1 收藏 7 评论17 发布时间:2014-6-6 16:59

举报

17个回答
szgaos 回答时间:2016-1-14 09:20:43
这个问题是存在的用cube库时: A3 D! b. ^9 g
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c): D* i0 ^% H1 I5 ^0 h2 G6 r. X
{5 J# m8 m+ w/ V/ ^7 m

% l, ?9 V$ Q6 ^, @/ G  GPIO_InitTypeDef GPIO_InitStruct;$ s; }) k1 H* t5 o/ ~5 \
  if(hi2c->Instance==I2C1)
9 ?: ~% R% v5 H/ P# b+ X  {
7 I9 o0 _' L( h# c0 l3 T$ p+ h  /* USER CODE BEGIN I2C1_MspInit 0 */
! O# M0 ]3 w; K9 G# t
! B" ?5 z7 ?& X$ }6 G  /* USER CODE END I2C1_MspInit 0 */" v" \6 C7 t( ^2 p8 u
  - l0 [: A# ~; G! W9 @1 o
    /**I2C1 GPIO Configuration    # c7 T4 m" M3 r8 u: A# S
    PB6     ------> I2C1_SCL
' K  c+ P9 u. `    PB7     ------> I2C1_SDA
# f6 `3 F( R- x" E' z7 X. d    */7 Z1 V  c+ E4 K
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
! U! r, k  Y4 O" W1 Q# m    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  y8 q9 G. s# ~: k% m    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
0 ^* ?5 J- r/ e) |' d( L    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);1 k7 f4 F1 k* C7 j7 O/ U3 [/ N1 N5 R  r

) K( x* }3 P9 Q( E    /* Peripheral clock enable */7 I; A( x- T2 j
    __I2C1_CLK_ENABLE();9 U  f6 ]; r3 u/ j6 E5 J
. Y6 F4 J% d- E( {) C
    /* Peripheral interrupt init*/
! T, L% Q) w/ e+ E1 H! m1 e' {- V    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
3 @3 A5 T* h7 [* f, a0 c    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
: f/ t+ B6 N& b1 m# M1 I: E, q    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);  W+ Z9 Z$ u, l1 J  ~2 ?) s. n
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
& f7 E) _" m6 F  /* USER CODE BEGIN I2C1_MspInit 1 */
( c" Z# k8 y7 ]  C  /* USER CODE END I2C1_MspInit 1 */
0 a6 J. q: g) _! x6 ?  [  }. \8 g! A5 V! q; {' s
}0 p5 c( M: S% b' [; j9 G
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的/ k9 x3 y4 ?9 s6 f
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决. K4 Y5 C: N# S3 D+ {
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)+ j; e7 k0 @7 w5 g
{
1 u" e2 A5 w& I- Q! T5 k9 R, `' q+ q! O8 G8 ~) ?/ ^) K2 A* M/ B
  GPIO_InitTypeDef GPIO_InitStruct;0 J+ h! a3 b' W
  if(hi2c->Instance==I2C1)
$ \* N7 C# `! }3 r0 `) e  {
/ s2 X/ b! m% R8 z' W  /* USER CODE BEGIN I2C1_MspInit 0 */
# s6 S! G" U9 r' q, \+ F- G2 X
, L. o) o" E- Y: S( @. k  /* USER CODE END I2C1_MspInit 0 */4 ?, k7 F: L" B2 F$ o3 {- M
  
7 s$ H" B5 H* q1 y8 y8 c    /**I2C1 GPIO Configuration   
) X& K- v' g: a: A# L8 _    PB6     ------> I2C1_SCL
1 [5 K& z+ S, f! R/ W! p    PB7     ------> I2C1_SDA 2 w, b* s1 L( d" M
    */$ H5 c+ @) a; |4 _
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  v" ~, T5 S/ z    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;. Z- v5 w1 m  _! Q2 k- O
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ z; S' r; I! l    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);' _" M3 r, n: l3 s# h: B
& k0 M+ t( C. G. q
    /* Peripheral clock enable */
9 b% m; K5 T0 L  v$ \% D    __I2C1_CLK_ENABLE();% I7 N/ c" _+ C7 ~, t/ G
) ?# a; ?& S- c, N' g5 ]( S7 {0 {
    /* Peripheral interrupt init*/' |2 G+ M% W2 A4 F' ~% K5 C+ f! ?
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);# H. y3 L% A" g, v
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);1 E; h3 _+ v! @- E
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
: H4 S4 w, f, m: Y6 _3 x: y  F, H    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
# Y8 B6 X9 ?% o; Y  /* USER CODE BEGIN I2C1_MspInit 1 */
3 \' p5 F* W8 H8 x8 m" j- z  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
6 s+ q: S$ m  H$ P; d  H. i1 q  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
; J( S" D4 ]6 Q# w* Y
  /* USER CODE END I2C1_MspInit 1 */
  r( y. v: X$ R  m0 {  }
1 h9 [4 F! K5 p8 @8 I- w7 z}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
' O$ x# b/ K& D' v这个问题是存在的用cube库时
6 D9 C! k5 M0 mvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
' G7 A* Q, `% _) e{

) n1 t  Q8 `- c9 w: i试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出

大哥对I2C熟悉吗?) f& t8 g# f3 ^! B" m
有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟# i# {" x5 n/ H2 }( D
querliwjh 回答时间:2016-6-8 23:49:43
谢谢楼上,一直卡在这儿,终于能读写24C02了
254587896 回答时间:2016-8-8 17:02:46
支持一下。。。。。。
qingyu_lv 回答时间:2016-11-25 15:11:25
szgaos 发表于 2016-1-14 09:20
4 D3 G' g9 p2 O9 k这个问题是存在的用cube库时
$ i2 X* ?$ |5 wvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
" {7 W: }5 P, o) u0 r{

! e8 `4 d0 u3 h. r! w* H+ q这样真的好了吗?参考一下
qianqiandenian 回答时间:2018-6-7 14:16:26
谢谢分享
binghuo888 回答时间:2019-1-25 16:25:31
学习了
senlanwuyq 回答时间:2019-6-9 11:56:09
支持一下
feihangdan 回答时间:2019-6-11 22:29:09
很不错的资料,谢谢楼主!
chiefrao 回答时间:2019-8-13 08:46:17
学习中...
baobo 回答时间:2019-12-6 08:30:54
好理论,更需要实践经验,谢谢分享。积累提高。
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版