|
该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。 0 O" Y0 e* q; r+ Q3 m 问题详细描述以及ST官方解答见文档:
I2C æ¥å£è¿å
¥ Busy ç¶æä¸è½éåº.pdf
(118.83 KB, 下载次数: 719)
|
微信公众号
手机版
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{5 a$ F$ C( ^; t! C( ]' C% P. J
GPIO_InitTypeDef GPIO_InitStruct;! P( {3 n2 ~4 v1 C1 |% K
if(hi2c->Instance==I2C1)
{/ g0 F0 a& I. M& u( l7 s# ?
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */; v1 J" R2 V& f7 r
8 b' |+ Y+ F* e% [( a
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL; y# B9 u z+ m
PB7 ------> I2C1_SDA
*/& 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;
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 */
__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# \
}
}
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的/ h6 z: a! L1 U8 f) a6 D
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
$ 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 */
+ 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
PB6 ------> I2C1_SCL$ r7 e( c# k& Q* T+ ]
PB7 ------> I2C1_SDA 0 e% g: J3 [7 e* D% ^: L, N
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;) _% v% D4 n _4 g: r: m% j
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);* `! }" y# p8 T' `% H
/* Peripheral clock enable */: }& I3 O5 t; D, `: I. L
__I2C1_CLK_ENABLE();
/* Peripheral interrupt init*/2 u( O* r2 D! w/ t: s/ ?# o
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); G& `! N& R ~4 [; \! u8 z
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
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);
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; |/ `
}
}
试了一下果然可以解决这个问题,感谢!
RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出
有个问题请教下。
这样真的好了吗?参考一下