你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
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 {
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{
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)" E. _5 q2 ?3 K4 A8 q
{: \) k# z( T' f* G% @
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */4 V7 L( [- i, z
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL7 X0 W9 j! ~! w
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
7 {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);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);& C" ?$ }9 C; i. U$ e" _' W' k
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
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
{
/* USER CODE BEGIN I2C1_MspInit 0 */
% S z7 h0 ], z: x1 e* L4 u
/* USER CODE END I2C1_MspInit 0 */
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);+ {! r1 c! d0 b0 d
; x$ v3 j+ T9 Q8 H5 z, O1 O
/* Peripheral clock enable */
__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);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
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);
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
/* USER CODE END I2C1_MspInit 1 */
}3 _8 X \) @- U6 i
}
试了一下果然可以解决这个问题,感谢!
RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出
有个问题请教下。
这样真的好了吗?参考一下