|
该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。 7 \, F1 @7 d$ P" T 问题详细描述以及ST官方解答见文档:
I2C æ¥å£è¿å
¥ Busy ç¶æä¸è½éåº.pdf
(118.83 KB, 下载次数: 719)
|
微信公众号
手机版
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{% 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)
{
/* USER CODE BEGIN I2C1_MspInit 0 */# t! q8 K$ q8 m i' \2 _" a
/* USER CODE END I2C1_MspInit 0 */. ?* j' K9 C+ d. T% O
5 J8 O, l5 m- s5 W
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA 2 [; w3 U+ h4 I& e* \
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;" d1 U% f- D: k3 L" q4 ~/ I
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
2 @; P( b" b1 {, Y$ z$ ?+ H* U
/* Peripheral clock enable */
__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);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}9 _, M+ }% j! U( E. K
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
__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
{
GPIO_InitTypeDef GPIO_InitStruct;' D" t, o0 f8 b- R- E
if(hi2c->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */
- ?. o. s$ ?5 c
/* USER CODE END I2C1_MspInit 0 */
+ W; Y' W6 Y2 c4 r
/**I2C1 GPIO Configuration 7 w, l( d) F3 A1 x( O
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/- z8 ?" t V$ j4 T$ g" c
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
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);
/* 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);
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 */
}. l% M; b$ ^7 A- @ `+ T8 x4 {% G
}
试了一下果然可以解决这个问题,感谢!
RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出
有个问题请教下。
这样真的好了吗?参考一下