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

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

[复制链接]
fanyao-367090 发布时间:2014-6-6 16:59
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
* \- q" o6 E6 \- { 7 \, F1 @7 d$ P" T
问题详细描述以及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库时
" Y& o$ k* N- z0 C9 N4 u9 \# `void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
0 v& T+ |0 x, o{% I( i0 M* _) a+ A; c* Q2 E' D
% a8 M4 i0 D  R" q( U. i
  GPIO_InitTypeDef GPIO_InitStruct;+ i/ g8 X7 U5 J$ Q8 Q0 Z; E  Z
  if(hi2c->Instance==I2C1)
& W1 i. D2 Q9 W# R+ k  {
5 W: C% T! r( B( q  /* USER CODE BEGIN I2C1_MspInit 0 */# t! q8 K$ q8 m  i' \2 _" a

# B' [8 i( z( I  /* USER CODE END I2C1_MspInit 0 */. ?* j' K9 C+ d. T% O
  5 J8 O, l5 m- s5 W
    /**I2C1 GPIO Configuration   
/ O- Z% U7 F9 Q  z( o% i    PB6     ------> I2C1_SCL
7 [  z4 v0 o3 ?) i7 l5 \9 w    PB7     ------> I2C1_SDA 2 [; w3 U+ h4 I& e* \
    */
, L- ~6 |" o8 T9 \! L0 r    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;" d1 U% f- D: k3 L" q4 ~/ I
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
$ V5 V3 L, R: ?- I% k7 b1 @( F    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
, Q6 Q/ R& z. I% A/ K& W    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  ~& L; S& r) t2 @; P( b" b1 {, Y$ z$ ?+ H* U
    /* Peripheral clock enable */
9 [, N: t5 w0 \% [- i    __I2C1_CLK_ENABLE();$ a6 ]# g5 {# w# ~$ k9 Z
+ @8 e" |6 X8 g& x& ]- }5 g$ l  |
    /* Peripheral interrupt init*/( \8 m. Q7 H! ^6 p! k. J
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);4 d' c* z8 m& T$ X* ~1 _3 g/ B
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);: F  j* ^  [) \
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
" J  E9 d- U& N. T) r    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
* g8 e, @# a6 m- s3 C" }  /* USER CODE BEGIN I2C1_MspInit 1 */
/ H: I6 h$ S6 o) e$ x  /* USER CODE END I2C1_MspInit 1 */
3 _* [( x- y+ O/ B% d  }
" F3 O3 d6 P* O) R! |: {}9 _, M+ }% j! U( E. K
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
. a+ k/ N: s1 r8 K- ~/ c1 F__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决  \  G9 W, H8 e, a, o1 K, X
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)- `6 O  F" X$ b' v6 e
{
& Z* y4 ]6 H, |5 {6 `
2 }8 D9 k' T% L3 l. k* Y  GPIO_InitTypeDef GPIO_InitStruct;' D" t, o0 f8 b- R- E
  if(hi2c->Instance==I2C1)
0 J$ Z' ], L4 i- S; M  {
; T3 D& s" i  c5 y! _4 b8 A6 u  /* USER CODE BEGIN I2C1_MspInit 0 */
. u, i% h+ i' Q- ?. o. s$ ?5 c
  /* USER CODE END I2C1_MspInit 0 */
6 o5 m6 O0 N9 g  + W; Y' W6 Y2 c4 r
    /**I2C1 GPIO Configuration    7 w, l( d) F3 A1 x( O
    PB6     ------> I2C1_SCL
% w) \% b  P0 J5 z; [% R  `    PB7     ------> I2C1_SDA
; ]$ Y' N: w( |    */- z8 ?" t  V$ j4 T$ g" c
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
' L/ A0 n+ v9 n; U4 z1 S* ~    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;) i, ^1 H( `/ d4 e5 `, R9 y% ?
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;) D7 v7 r( Y& k7 ^& {; N. q
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
5 F; Q- q: T5 z9 ~) w" M+ H
; w- j4 a7 r* I! I    /* Peripheral clock enable */& x# t* {5 N" c) s
    __I2C1_CLK_ENABLE();* Q! S/ a/ {4 r& g4 @! n0 \: v) z
( W& g  R; z! ]( R* ^: T% [
    /* Peripheral interrupt init*/  f% l8 O9 o+ O/ b% q
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);+ j% q" Q+ j' E# c3 j
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
% {; R# |5 _, X8 y+ B; h! ^, o    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);4 r3 }: w: j$ x
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);) v1 @* [" j9 N7 U4 n& t; c# m0 U
  /* USER CODE BEGIN I2C1_MspInit 1 */. l0 o& n" w8 o9 ^7 a0 a: Q
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);5 X+ c7 T  q2 `5 ?: H: v6 Z# f
  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
& ~; K; b1 n! @1 |  T/ y
  /* USER CODE END I2C1_MspInit 1 */
! o, Y/ J2 _$ J; u$ L6 X  }. l% M; b$ ^7 A- @  `+ T8 x4 {% G
}
slong127 回答时间:2018-6-5 14:26:11
szgaos 发表于 2016-1-14 09:20
0 p, `3 `) K% W这个问题是存在的用cube库时/ Y& A$ n. ]5 Z$ p( [
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)" K1 Z$ N& |6 L. W
{

5 G1 G* ^5 d! R( I8 h5 S3 \7 }试了一下果然可以解决这个问题,感谢!
侯燚 回答时间:2014-6-6 17:25:58

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

大哥对I2C熟悉吗?5 f9 }+ s& S: M7 W4 z& w$ O! l
有个问题请教下。
stary666 回答时间:2015-3-20 14:08:54
学习。。。。。。。。。。。。。
紫宸 回答时间:2015-9-6 16:03:24
学习一下,以前一直用软件模拟9 t. u: `, d5 o% X; g$ `5 V! [4 u
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
0 X% Z9 O! h% y5 A3 F0 q3 x这个问题是存在的用cube库时6 p! b, }$ U1 b$ x
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)6 @* `8 z# n- @1 B/ U* T+ Y$ e
{
- z- U: P3 w& ?. L7 Q
这样真的好了吗?参考一下
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 手机版