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

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

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。) e2 `( H2 [2 T0 G7 L! W
 
7 R1 K/ v3 }) D- L( x9 D& t: o问题详细描述以及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库时
+ V8 a# I! w  x0 L3 Q( S+ hvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
( B3 G; H) C2 S( f; x{
4 |8 @) E, T' E
) n9 ]# i+ |) w2 Q, A4 i7 R, S  GPIO_InitTypeDef GPIO_InitStruct;
' B+ A! ?, m7 L! U0 [& F  if(hi2c->Instance==I2C1)5 O8 d2 N: U* W5 N# O* v. H$ w# b2 ^
  {( ~4 O1 x( {0 b- R# i' R  b9 ~/ K
  /* USER CODE BEGIN I2C1_MspInit 0 */
, U8 j. n( S, v( e$ L" D- I& \
) Z0 s  G7 g) _. s, `- E9 \  /* USER CODE END I2C1_MspInit 0 */
0 n. `2 l  I6 v$ |3 D  + d9 X9 y: W' N+ s5 u9 G0 P
    /**I2C1 GPIO Configuration    + i# g- i' I$ J) p6 P
    PB6     ------> I2C1_SCL
5 y- D( M9 g$ Y  O' y' D1 P  C6 P    PB7     ------> I2C1_SDA
& }' e1 U0 [% |/ c    */; ?7 \1 ~1 {( q( b/ _1 y5 h
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
6 \: T9 L' `5 ^    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
3 a# s# {" x) Z5 M) d: q- N3 H    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;' X4 F1 [9 _+ Q% h2 _
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);& h5 ^* i# c/ @# b  O6 x/ v5 b

0 d: d- C; Q) f+ t    /* Peripheral clock enable */3 H3 L) n% r4 B( [$ Y
    __I2C1_CLK_ENABLE();9 t: e2 j6 u, `' I" O7 Y& ]5 t4 J1 P

- f! _4 p, g# n- ~    /* Peripheral interrupt init*/
: T8 j- r) I# P) \1 D    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);6 |/ h  u- ?1 B$ j! i: F
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
$ l9 G2 ^8 z! L) ^/ V# R- }    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
! r7 U! i- {# @+ ]" I, ~; T    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
- `& A# q' w' u1 B  /* USER CODE BEGIN I2C1_MspInit 1 */
0 F/ a+ K4 J! I. L" N  /* USER CODE END I2C1_MspInit 1 */" N2 F" M4 p: p' E
  }
6 Q9 x  l  C+ x, d6 v9 U}/ u8 x" b2 {( |( Q, z/ A
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
$ h7 I& c6 @* }__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
5 K. `6 b6 Q; e2 u! x* [9 \void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
" v! i5 x, Q- u5 F{
' V8 i3 _9 \0 r' x8 v; ~$ A7 m+ A' b$ E' U3 k
  GPIO_InitTypeDef GPIO_InitStruct;
: k# L+ N  d( c7 i  if(hi2c->Instance==I2C1)8 H( c. e* ~4 ?8 W# ?+ ^8 Y7 B
  {
+ l" d8 L$ U7 c: m  /* USER CODE BEGIN I2C1_MspInit 0 */
5 y+ I. l" ?( @; \9 A' Q. Z0 v
3 ^4 ^) Q/ h  s+ e( q  /* USER CODE END I2C1_MspInit 0 */
' g7 ^( f6 ?/ d9 ~+ I8 i6 O  , ~2 p: f' [. E* Y5 T) p
    /**I2C1 GPIO Configuration    , A+ r5 V6 U# X
    PB6     ------> I2C1_SCL. C: C6 u8 }3 {
    PB7     ------> I2C1_SDA 3 a8 g$ I1 p1 T, v9 w7 H
    */
# o9 C% Q+ \6 w: @    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
$ N; q  F! f6 H2 M0 y; H" O    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
/ b- {& U8 K* ?5 @9 F! o    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
2 u- a: x, o, k4 O1 R    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
; r6 L/ Y7 C  A5 z5 g6 C. r, T" ^: Z/ u$ I) g6 M) m2 S' Z. R
    /* Peripheral clock enable */
% S4 w, e( j# J+ o& c    __I2C1_CLK_ENABLE();
( l' I1 i9 p, |1 J, p# O1 S0 {3 ]2 H, n7 j
    /* Peripheral interrupt init*/6 [/ A# g- I6 }' C. S
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
* P8 c- `6 M% l6 b! M5 [: x    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);) s* t- D- c% [# v5 O2 c
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);4 {4 z& [& y2 Z( F7 A8 r
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);, K6 y4 Y  }, _# a! [3 }
  /* USER CODE BEGIN I2C1_MspInit 1 */, W- m0 z; m' k
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
- U- }2 H) @" n6 k7 K  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);

% V; O4 F* x) D* H$ y+ z  /* USER CODE END I2C1_MspInit 1 */( ~( k: f. I4 I* v
  }* w( G0 \0 Y1 \/ E! v# C8 X
}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
* f. Q6 A- i1 j+ C这个问题是存在的用cube库时# b/ C2 G/ Y, {7 j
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)9 d* n5 N- y7 V
{
, x  S. Z! d3 W7 k1 [  M
试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?
, Z% q  g' ~$ k3 a( W有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟
# x, D+ a7 R. r8 J6 h% o
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; b" q8 w" i9 k( v4 c
这个问题是存在的用cube库时
/ T$ U6 n0 r) n( B$ t) Bvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)0 l( _; C% G- C! n/ f  R
{

  t" D8 C5 C/ b0 i+ M这样真的好了吗?参考一下
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 手机版