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

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

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

举报

17个回答
szgaos 回答时间:2016-1-14 09:20:43
这个问题是存在的用cube库时
$ B& r9 ]5 S! G1 H; [void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
; u9 J" v7 m1 _{5 a$ F$ C( ^; t! C( ]' C% P. J

  e3 e7 u6 ?: z* z  h9 ?+ Q  GPIO_InitTypeDef GPIO_InitStruct;! P( {3 n2 ~4 v1 C1 |% K
  if(hi2c->Instance==I2C1)
, J6 y& `5 T) w  {/ g0 F0 a& I. M& u( l7 s# ?
  /* USER CODE BEGIN I2C1_MspInit 0 */
4 f5 O1 A8 u* k- r3 I. }# F
0 p5 `6 P* c  M/ K3 K  /* USER CODE END I2C1_MspInit 0 */; v1 J" R2 V& f7 r
  8 b' |+ Y+ F* e% [( a
    /**I2C1 GPIO Configuration   
9 S' C& H# F% ~! j; K    PB6     ------> I2C1_SCL; y# B9 u  z+ m
    PB7     ------> I2C1_SDA
* S' Q6 N4 {/ {6 j2 o    */& R- Z2 C& @) z5 ?/ X- T3 L
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;1 ~( m$ L8 B$ x, }$ F, [
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
! h) w: M' \6 d9 F3 A* o4 \    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;$ k& l# u2 Y# s4 L* \
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);8 E! f+ N/ h! `' n8 W
, J8 `* \  k" O( t
    /* Peripheral clock enable */
  r! X* j5 S9 _4 b) O! |: \    __I2C1_CLK_ENABLE();' Q( p4 a: h; T. X
* P2 l1 c" p% v. @9 b" E4 b
    /* Peripheral interrupt init*/: n8 E9 H# t8 r5 W9 J7 _
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);2 f+ g) R: A2 d' Z- P5 e# W+ L
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);6 ?" h' r4 M; n2 E: E
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);8 M" ~/ O: L4 ^
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);, B: _) i: O6 J+ D) V$ |
  /* USER CODE BEGIN I2C1_MspInit 1 */- N% Q. Z. v! {  f& L
  /* USER CODE END I2C1_MspInit 1 */5 M0 }3 D4 s! P( Y# \
  }
  ^* I: i- Z2 i}
5 [% U# N% _9 O% `这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的/ h6 z: a! L1 U8 f) a6 D
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
4 B/ H3 M+ M+ Y# ~& |void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
: W3 f& j: J5 R/ E% U. A$ \2 s4 q{
- ]& z4 b; X9 w  U. S7 S$ M( O+ D+ p5 R, C
  GPIO_InitTypeDef GPIO_InitStruct;! k1 m8 q+ p# q' Z( l' M4 e- I
  if(hi2c->Instance==I2C1)' p/ k6 X* @0 g1 ~( X
  {# ^3 S4 B# k& [4 g+ z
  /* USER CODE BEGIN I2C1_MspInit 0 */
/ k* e& t! e6 K. ^9 q% z  i+ c6 D  U8 e' t* d+ e0 ?
  /* USER CODE END I2C1_MspInit 0 */8 e2 N- o1 ^8 q- o$ X1 k& ~
  5 s' ~) k) _1 e4 d9 B; R0 B
    /**I2C1 GPIO Configuration   
+ A" Q- s/ O- |; C# `    PB6     ------> I2C1_SCL$ r7 e( c# k& Q* T+ ]
    PB7     ------> I2C1_SDA 0 e% g: J3 [7 e* D% ^: L, N
    */
) u: t$ N8 ?2 L$ c" d! U: {    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;) _% v% D4 n  _4 g: r: m% j
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
& Y6 [, X3 y- R    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
0 n) q' Z" M0 \2 k; L7 `$ [( M& a5 m    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);* `! }" y# p8 T' `% H

- F( Z- S: u6 p  E( b, k    /* Peripheral clock enable */: }& I3 O5 t; D, `: I. L
    __I2C1_CLK_ENABLE();
' H) m" i0 i2 F+ c% k! i3 n. X, v
- E3 f' K0 u7 `: O    /* Peripheral interrupt init*/2 u( O* r2 D! w/ t: s/ ?# o
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
; _' L' Z( d  m# H    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);  G& `! N& R  ~4 [; \! u8 z
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
4 c5 ~/ q7 L, c/ {; o* e& Z    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);* p5 t3 N. Q: y2 s+ U* S
  /* USER CODE BEGIN I2C1_MspInit 1 */6 s" ?+ T0 f- l. v
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
. {% [+ K# K3 u/ v* [3 k  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
- q% E6 N; l, U( T
  /* USER CODE END I2C1_MspInit 1 */* _+ [7 [& q0 N; Y: s; |/ `
  }
. x, R0 d7 T. N, \! u1 g/ i2 i}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
3 O* i- Y8 C. j% O' J0 |这个问题是存在的用cube库时( R" s, ?6 j5 Y1 M+ Q* R
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)- j7 u* D( h! z2 F2 Z
{

. J0 E; V* p$ }; y$ r( z2 N试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?
# U$ {/ Y! j7 D5 y- m有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟
: c) U; s: R: [7 @$ Z; `7 S0 z
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
% N) S1 T4 q9 J% ?( c! G5 D这个问题是存在的用cube库时
* G& A- W1 g+ z$ v" n7 f, mvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
& l% t6 \" Z# R. x2 Z7 f" ^* ]* Z{
9 l# P3 I; _' @( 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版