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

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

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。6 [5 r+ v) ~, U, ?/ H9 [
 , R# E) O( w' O( z/ \/ e
问题详细描述以及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库时' m9 x" V8 N- p' A
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)7 C5 U) c. J& q: M5 o% u" [
{" \" D0 T1 @8 E

. R- A# r3 N' m  GPIO_InitTypeDef GPIO_InitStruct;
- q( C  a" F. i# [: z0 b9 O& W& b  if(hi2c->Instance==I2C1)
& k3 o  ~, q5 h" m" w$ M1 {  {
# ?4 T4 q0 ~' y9 a( k  /* USER CODE BEGIN I2C1_MspInit 0 */+ q" p: @+ G" g' S9 U
: n  @: s( d6 G& O! F" u2 X- g
  /* USER CODE END I2C1_MspInit 0 */; z5 o% x, e( `5 Q/ n
  
2 _" u/ E2 B. Z: A0 B5 b3 _+ e    /**I2C1 GPIO Configuration    2 Z& F- f+ u, d3 C" Z. @1 z
    PB6     ------> I2C1_SCL
+ X( _1 m; C5 o/ b    PB7     ------> I2C1_SDA
3 x* H! V9 Q) n- t    */
. Q8 ?) \* ?" }; g: e1 d+ x' L    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
& {3 O. C6 W7 `9 l9 n0 `4 |    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;/ I: I( W, B- O. G
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
$ }) q, P) U0 z! }. Y% m    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);% c2 P6 f  l  _1 P6 @, Q6 F3 h
& C( c# n7 W/ A, N# `4 b- z
    /* Peripheral clock enable *// s# K$ A$ [6 p5 S
    __I2C1_CLK_ENABLE();
; D* t$ y2 L8 }3 U/ z  j8 f/ T$ U  Q. p
    /* Peripheral interrupt init*/# K& p& v, Q) q9 ]& K( B4 K
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
5 ~) `# z. H- \. F2 a. M" r. l    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
' L& j# F' S- m    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);0 C# i3 }: K) ^6 \% C
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
+ A( L* `6 h8 n5 E4 g" p  /* USER CODE BEGIN I2C1_MspInit 1 */7 b0 Q/ r+ @: N$ x) A% V
  /* USER CODE END I2C1_MspInit 1 */- E: v3 h. q% h2 m$ R
  }
  }# o  D1 @9 @}
8 a  H5 S) p3 v( O9 m6 G0 r8 x. y这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的! x/ F5 {( b6 x
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
; |; U" P6 @6 ?' h8 T4 [1 Rvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
  F* C$ b) V- m1 J! {! N) i{
, J- r2 e" t% R4 O5 E- v: q$ \
, z+ H$ c1 Z, z% j8 R8 I! j  \' R% D  GPIO_InitTypeDef GPIO_InitStruct;
$ K5 r; {0 m7 I5 u  h* U  d  if(hi2c->Instance==I2C1)4 F/ q5 p9 O; n" z
  {  X6 ]& x5 v7 f2 H3 \1 a
  /* USER CODE BEGIN I2C1_MspInit 0 */( f& o3 P; k3 f- E3 y, R$ z

" C, z0 o8 m) p. c  /* USER CODE END I2C1_MspInit 0 */( k8 a7 M4 {4 r3 W% f9 o0 P, O
  $ M! d- ^" F4 [% V, p  U; v
    /**I2C1 GPIO Configuration   
/ |8 ]2 I: E/ h0 L8 m& Q    PB6     ------> I2C1_SCL5 n% ~! F/ i" X& G" @- v
    PB7     ------> I2C1_SDA
% N$ e) G1 w% o* R: J6 ^    */# f# P/ I* {# k/ j
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;2 n' y5 z, z$ `" t0 f9 o
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
" A. K# P$ J# o4 z8 ~" y3 x    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;  @% M! s7 r8 a- i* t  u+ h
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
" U3 w+ X5 ]7 V$ _) }! A* I: ]6 V3 ?0 ^
    /* Peripheral clock enable */! G% }0 Z, |) l6 ?3 V" Z
    __I2C1_CLK_ENABLE();
5 b) X4 {( ?% N& Z7 k8 N/ d/ v6 N+ d5 y; y% P
    /* Peripheral interrupt init*/
, g$ f, D" b3 w8 f    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
$ _2 o, o, J- `    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
  X# b# w4 s; l- e    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);1 R/ t; U$ J' X9 R/ v5 f+ g$ M
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);& p7 O* H4 F% k
  /* USER CODE BEGIN I2C1_MspInit 1 */. L0 T0 Z( s0 c- T) i  |( G: |
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
; \& F. ^2 X9 [; f7 b  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);

) \& ]& Y! u2 d  /* USER CODE END I2C1_MspInit 1 */
# @1 D1 e8 J' O  }. S1 M) P# r4 c
}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
$ Q9 ^: F3 I& P( K这个问题是存在的用cube库时8 [" W* t8 q* b2 y& H; _
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
* v6 v% B" K* f3 T{
) X5 b* [5 a+ H
试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?; t6 V1 }0 Q" N) }7 E
有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟- H& ^$ U- o8 n3 ~9 S0 N
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) u( ~3 ~: A% ]/ |) k
这个问题是存在的用cube库时
$ s9 ?  Q; @& s. Z' Tvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)- [0 T% h. C; }$ J/ L
{

) q) a: ~& s' [, j$ S这样真的好了吗?参考一下
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 手机版