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

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

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
5 I1 U* I4 w' B8 x1 d( V. k5 U 
# |+ ^5 H' T8 v1 q: Z问题详细描述以及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库时
  ]0 h7 w& J1 Y9 B9 [) Fvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
' l1 q( [+ Y7 T% K# |+ `# G{: l6 Z) u' e1 Q8 D( U; t  o' |+ V

' [9 E, Y# |, e" F  GPIO_InitTypeDef GPIO_InitStruct;) s1 m0 T5 T6 H3 m
  if(hi2c->Instance==I2C1)
. [2 Z* _8 L9 i) Q  {6 i& N9 {9 g7 j* r6 I9 @
  /* USER CODE BEGIN I2C1_MspInit 0 */
7 i' f8 t9 c# B5 \
+ ~1 Y, v5 I2 |/ ?! ^  /* USER CODE END I2C1_MspInit 0 */
; p, X! v9 \! e- d' |" `- A  
0 b$ s! v$ M& k4 x5 F    /**I2C1 GPIO Configuration   
3 S; I2 k; Y, i  L! h6 I9 c6 f    PB6     ------> I2C1_SCL
4 E1 {$ T" t( i% ~    PB7     ------> I2C1_SDA % N7 u$ \% o* j
    */) ^" s9 S: [# [5 Y1 h
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;5 W# ]/ v, a' p- i
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
7 c5 X% A* J( a7 a- l    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;3 Q: j; X' [* M1 Z
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/ V+ V* B" t1 j$ S  ]9 x' p# L& u) K3 {. N3 f% S7 \6 N; J
    /* Peripheral clock enable */
0 b1 q* W  C; Y. D* H! F& C    __I2C1_CLK_ENABLE();
# T: F8 ?; x, P8 |
; ?* _2 j/ q( O% U6 `6 @+ i7 W2 Q4 A    /* Peripheral interrupt init*/6 R+ @8 B/ f0 y/ R- e
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
5 h" V- `2 `) l( b" S    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
) _: e- V# p& t+ A    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
5 v3 B9 V0 b) {  R    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);  G3 f$ E" T. Y7 ^4 F- }) ^0 E4 n1 k1 {( g
  /* USER CODE BEGIN I2C1_MspInit 1 */
; X$ C2 l8 _4 l0 a# K$ n) i' c  /* USER CODE END I2C1_MspInit 1 */
0 Z5 d9 \$ _( ^1 n- U  }" E3 W8 \, p+ y- ]
}
7 _! {1 S* q/ h, ~6 c2 v1 x这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
# t" c' r$ d$ ~' g__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
& N9 S: _4 ?0 b8 G) F# E+ Ovoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)( N0 j" @- b5 V* l# B$ f$ J
{; ~- [* p2 G2 q% F7 {

$ O; K/ b6 F" ?  GPIO_InitTypeDef GPIO_InitStruct;
) O7 N4 y/ b3 q  if(hi2c->Instance==I2C1)
. w/ L$ n" A4 e# a5 s7 A  {/ k# W, w1 X$ ~# B
  /* USER CODE BEGIN I2C1_MspInit 0 */" g6 C( A1 o2 `$ V
% M8 T+ {3 ]& K( J9 F, x
  /* USER CODE END I2C1_MspInit 0 */
4 r7 x# i! O/ r% F  # ]" Q8 D9 P  H. m. i+ ~5 b
    /**I2C1 GPIO Configuration   
9 r) t8 L8 |; \; [% b' s6 i' h    PB6     ------> I2C1_SCL/ q% b1 ?% p7 _  y
    PB7     ------> I2C1_SDA
4 C8 M9 Z1 e- w7 L. ?2 j    */
) a) g: h2 K' a# w  a; G0 E) [! g7 |    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
( B9 I2 ?3 ?8 C$ B5 s& }    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;' W0 F5 n# _. S% o7 |  i: T! M
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;% v% p6 M9 F2 q' s
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ y% W& R# Q! r* b4 i' m7 F+ D* d' ~
    /* Peripheral clock enable */
. Q1 `( w, N. \+ }    __I2C1_CLK_ENABLE();
, [/ Z! S: D+ U" J( Q) [9 V" @$ Q5 n( n6 m0 Q% s
    /* Peripheral interrupt init*/" ]5 L5 F+ V+ D! d( d. ~
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
" u6 o% o! I2 H: n% k    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);) a# O* X! b* _
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
5 m; [0 z: ?- O8 x    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
+ v; e6 j/ b: v; ?  /* USER CODE BEGIN I2C1_MspInit 1 */% {9 U/ V" v0 F! N) i' T% ?1 \0 m! U
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
0 k( [7 \) |% `3 Z- P  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
$ |& k9 }( V' Y, G* O' }
  /* USER CODE END I2C1_MspInit 1 */
# E4 G7 r$ C3 a7 y: E, r  }
* `  i5 k6 @$ J' V" p}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
& M1 k* Y( c0 M' u0 a9 Y这个问题是存在的用cube库时
" b0 M: ~( C7 D: p: l4 Mvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)2 o6 _4 {+ e1 {* {" e9 v
{
' x: U) q) r# O4 C
试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?
; }2 S; ?, S2 U# N1 u9 e有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟; P( T1 _2 Y( |$ K( }
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! Q, T: E, T8 B, Z5 H
这个问题是存在的用cube库时+ S$ Q1 e$ y& L( L
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
" W, t  f* Q8 h4 H% ~" ~' d{
' |. N) n4 C+ G: m/ u4 r
这样真的好了吗?参考一下
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 手机版