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

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

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

举报

17个回答
szgaos 回答时间:2016-1-14 09:20:43
这个问题是存在的用cube库时
2 g7 M6 B: ~; r( avoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
, V$ W- D# F; P# V" T2 f. V- ?{# E. P" C6 i! g" P

% d- ]7 C; L% r- W2 f" o5 U& _) e  GPIO_InitTypeDef GPIO_InitStruct;, B0 O; i4 [' d& h3 t- A
  if(hi2c->Instance==I2C1)
- D# t9 I: }0 d  {% h& E+ I% G) M4 P; @
  /* USER CODE BEGIN I2C1_MspInit 0 */3 Z! ]- q3 F7 D$ J% C# x6 F9 m
# M2 S' i4 d9 n$ [2 {$ n0 R5 y+ B
  /* USER CODE END I2C1_MspInit 0 */
& Q8 M6 Y2 _5 n& z' T  j  8 _4 t. l; u/ U$ m
    /**I2C1 GPIO Configuration    1 l8 o  q" c+ J
    PB6     ------> I2C1_SCL3 H2 S+ ?) h$ V1 e3 A
    PB7     ------> I2C1_SDA
( S% }2 G/ X( {- m9 f    */; M! @# z! _+ u! |
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
! r- G3 a0 m' q; y) V    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;( B3 R$ P& f) n3 U
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
4 B# f* h; Z* C- g$ b; z/ ?# _    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/ d9 T) h2 l( y! V- J6 _$ `
6 d$ ]( k/ I, d+ f2 V7 |
    /* Peripheral clock enable */1 }. O/ `  G2 p6 _5 v$ B
    __I2C1_CLK_ENABLE();0 B6 l' |( I1 {( F; n7 [

4 G, a2 P/ o/ ~) w, h8 X, E- c: ]    /* Peripheral interrupt init*/7 N# h! e/ U* s  a
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);8 t, F9 |! j/ ^* d6 [
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);- c. I0 D. G, \) H
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);8 v, p9 Q- ~" K7 h6 k9 P5 S
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);* n0 ~1 b$ B8 `* h
  /* USER CODE BEGIN I2C1_MspInit 1 */
( L9 Q% w- T4 h0 ~. _+ y/ D7 ^  /* USER CODE END I2C1_MspInit 1 */
' W3 @1 u+ v5 w. y# R  }$ b) @5 m/ h6 r0 N
}0 Z; |9 M, z/ ^5 Q
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
7 t$ h' D2 g. K% G0 F# k! z__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决1 w1 f: \7 f7 r6 E/ }& R! a) s5 [$ {
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c). @3 {3 C/ a! b3 V, O8 [! O9 i# Q
{
6 @+ }) |/ H, S, M  y7 F( v) m0 k" X$ |3 z' {# ~& v9 l
  GPIO_InitTypeDef GPIO_InitStruct;
. D% Z7 r! z$ l  if(hi2c->Instance==I2C1)
) U6 S8 ?; S8 C5 g6 @) z2 i! z  {
' a1 H+ O8 ^$ o  p2 e' h5 G# w  /* USER CODE BEGIN I2C1_MspInit 0 */
0 `9 C% W! j6 T/ h5 \- \6 b
! x$ g7 g# P- o* ~& z  /* USER CODE END I2C1_MspInit 0 */' Y' H/ Y( x) g
  0 n( i* J$ ~2 S/ P* G2 Z1 a! A  \
    /**I2C1 GPIO Configuration   
7 M3 U: O& ~" k6 h: x) l    PB6     ------> I2C1_SCL
8 m* G7 y- H, T4 E2 ?; O    PB7     ------> I2C1_SDA " f0 J) U+ t# K
    */+ a9 c7 g" q' J7 w3 d; a1 a; r- l
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
) c; c  D( t# v9 T9 c; I    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;# k9 S% a* O! }7 m
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;3 g" F: P( X4 W' S( [
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);; d# f3 b4 b4 B

- W7 H$ c4 n! x& G% P    /* Peripheral clock enable */
) {9 W8 U4 g$ d- n# T  |& E    __I2C1_CLK_ENABLE();, r7 C- x3 g. A/ C5 S' m

/ b* Z$ t! [5 e. i/ m% l1 Z    /* Peripheral interrupt init*/
6 k% H4 r& k- N7 e3 m    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
7 i% _0 U  i" i    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
7 T2 X" G+ y6 d+ z0 y    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
& y! @# q: X' Q) p! [9 V, P    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);$ X2 z1 G1 d5 l" C5 F
  /* USER CODE BEGIN I2C1_MspInit 1 */2 L- b9 E1 V. C& l
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);" @+ L5 {( {2 C! U. V
  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
7 U! i1 @. }8 I0 R  s
  /* USER CODE END I2C1_MspInit 1 */& \8 L( Q. N7 k& B; q* ~, I
  }# h) a4 I& i/ o0 M* T
}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20. h4 u4 F- [0 A2 k. \* e' P
这个问题是存在的用cube库时' i2 u2 T, G! q0 D# m) m
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
' b! R  s4 S9 O0 \. m{

+ t" ]. ]: u; V  d试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?
1 S' G$ ^6 k+ T" G( X! c/ g: t有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟  f) w2 k1 ^! o! B. C: A
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
% g& O2 v6 ?* M" |- `/ y' y这个问题是存在的用cube库时
  m1 o3 ^. p. Y$ f. jvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)6 o' R! x- e2 {8 }+ G: B1 B
{
: f+ z! U/ t0 V+ |" e8 |- G7 `
这样真的好了吗?参考一下
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版