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

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

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
/ ^* S6 f3 t2 j. m# V 
' D+ S+ `' M, p5 N" c8 T4 @* X) 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库时
9 N& Q( v. g+ |+ V5 Nvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
" a) k( _. R# p$ A9 w9 E/ W4 T1 N) g- z! O{
: o% r: N2 w8 i5 P
: V$ I* g6 c9 X) n( ^1 l  GPIO_InitTypeDef GPIO_InitStruct;
* v; T+ F& c3 b0 ]  if(hi2c->Instance==I2C1)" E. _5 q2 ?3 K4 A8 q
  {: \) k# z( T' f* G% @
  /* USER CODE BEGIN I2C1_MspInit 0 */
% W8 s2 R$ Y# s2 C9 ?6 ]
/ Z; \% t( M, E1 k6 ~  /* USER CODE END I2C1_MspInit 0 */4 V7 L( [- i, z
  
. Z8 U2 z  W$ q1 K9 w% l/ z    /**I2C1 GPIO Configuration   
7 m: v* o' ^7 \/ b    PB6     ------> I2C1_SCL7 X0 W9 j! ~! w
    PB7     ------> I2C1_SDA
" b$ @+ \# e3 O% S4 ^1 c1 U    */
$ E0 |# l7 `- b& J2 w7 x    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
. c0 J5 S9 m/ `$ D2 G) e; `, u    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
, A" f( v% b' F2 g, t  N; g9 Q    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
: ]. P$ q1 }5 |- P    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  _' x  G4 n3 P3 G/ ?( f2 x. S
3 i3 y4 s" R, P, P2 h    /* Peripheral clock enable */
* I6 b: g7 a4 R/ E4 ~    __I2C1_CLK_ENABLE();
2 n, ~( u& n9 a4 q4 f- q7 {5 o/ ?$ e  _& K: V4 G4 i4 b& s
    /* Peripheral interrupt init*/8 s) B+ t; ~( Z/ p5 I/ G. e7 A
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
' r! h: c$ R$ }8 J    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
/ S) y# E, W0 z# N    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);& C" ?$ }9 C; i. U$ e" _' W' k
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
0 t9 i) T  F& i3 J" e  /* USER CODE BEGIN I2C1_MspInit 1 */
. a& a" ]; O5 V) U5 e( y5 v6 R1 m  /* USER CODE END I2C1_MspInit 1 */
1 `6 M' a6 r& y) |/ y  }
0 S5 @7 A: [2 v& N3 Y$ g1 t( S}
, e7 _1 M6 ?7 }这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
5 w* h) a' M' G, N__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
4 ?1 i' F$ i) O# h8 i6 svoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
/ Z! `! {( m3 x$ t* U{
3 w1 S% r! T7 l2 m1 g0 t0 L
, O+ `+ k9 f1 C/ y, d' z  GPIO_InitTypeDef GPIO_InitStruct;9 m3 Z' F  @7 B) v' K9 T
  if(hi2c->Instance==I2C1)2 q- k' _* Z5 N# H& o0 D" g
  {
0 U* r! z) \: c! s; D  /* USER CODE BEGIN I2C1_MspInit 0 */
/ h7 j: W% X* c& _  L$ W% S  z7 h0 ], z: x1 e* L4 u
  /* USER CODE END I2C1_MspInit 0 */
* X' Z8 \% N/ R! H. A; f& e  
/ [. V) j. ?& p: U$ B    /**I2C1 GPIO Configuration   
' X0 i/ I& i( i    PB6     ------> I2C1_SCL
$ T9 A. R5 G3 f/ |. X    PB7     ------> I2C1_SDA
0 Q/ O9 |. h# C. I& {, J    */
1 a- @) d7 P  v    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
0 y3 Z! p! |0 @3 l( i: z  ^    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
. ^) @: O6 ^  l; e) D* Z    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
' q3 b9 p+ L% B! c. r    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);+ {! r1 c! d0 b0 d
; x$ v3 j+ T9 Q8 H5 z, O1 O
    /* Peripheral clock enable */
& s2 Y3 g9 z5 ]1 K/ Q2 `4 p    __I2C1_CLK_ENABLE();8 m3 R8 M) ~5 s7 N
+ Y1 N7 |: R# g" G, w9 D$ B
    /* Peripheral interrupt init*/& }* k9 l1 }! k; L2 E1 }* d8 |+ o
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);1 _% H0 J. W1 z0 y4 S, [
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
0 x, H$ M( j& J% H' U    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
  K+ E& B$ J4 B6 m1 ?: _% f$ E    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);$ ?% v  B8 o0 C1 t
  /* USER CODE BEGIN I2C1_MspInit 1 */9 H8 c0 @- s, n- b; e: y/ a  h3 M
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
$ P4 S6 V4 z# w+ Y2 b% }  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);

9 d* t$ ?/ G  ^- @) b5 Y  /* USER CODE END I2C1_MspInit 1 */
$ ^0 N; R8 e- w' O0 `* k  }3 _8 X  \) @- U6 i
}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
7 e/ U) m& a) T& Z8 i2 j1 ?这个问题是存在的用cube库时2 i" Z; @' X) L% b- J" G- R
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)9 C- m. g! ?' ~$ [; w7 e
{

: C; d5 }$ J+ @- P, Y! K4 I# E试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?
; {6 A) s& A/ w有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟/ L$ M. ?& a& u1 X' S4 n' L
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% c; L. C6 o5 N: D- J
这个问题是存在的用cube库时
0 ?8 [/ z5 ]( z) y8 z! Avoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
8 |2 \5 ]5 N/ l, R4 E% Y8 f! ?6 }  b{
6 h; g$ L3 S( L5 r& D% b
这样真的好了吗?参考一下
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 手机版