你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
szgaos 发表于 2016-1-14 09:20 & M1 k* Y( c0 M' u0 a9 Y这个问题是存在的用cube库时 " b0 M: ~( C7 D: p: l4 Mvoid HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)2 o6 _4 {+ e1 {* {" e9 v {
szgaos 发表于 2016-1-14 09:20! Q, T: E, T8 B, Z5 H 这个问题是存在的用cube库时+ S$ Q1 e$ y& L( L void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) " W, t f* Q8 h4 H% ~" ~' d{
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{: l6 Z) u' e1 Q8 D( U; t o' |+ V
GPIO_InitTypeDef GPIO_InitStruct;) s1 m0 T5 T6 H3 m
if(hi2c->Instance==I2C1)
{6 i& N9 {9 g7 j* r6 I9 @
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA % N7 u$ \% o* j
*/) ^" s9 S: [# [5 Y1 h
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;5 W# ]/ v, a' p- i
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;3 Q: j; X' [* M1 Z
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
& u) K3 {. N3 f% S7 \6 N; J
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
/* Peripheral interrupt init*/6 R+ @8 B/ f0 y/ R- e
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); G3 f$ E" T. Y7 ^4 F- }) ^0 E4 n1 k1 {( g
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}" E3 W8 \, p+ y- ]
}
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)( N0 j" @- b5 V* l# B$ f$ J
{; ~- [* p2 G2 q% F7 {
GPIO_InitTypeDef GPIO_InitStruct;
if(hi2c->Instance==I2C1)
{/ k# W, w1 X$ ~# B
/* USER CODE BEGIN I2C1_MspInit 0 */" g6 C( A1 o2 `$ V
% M8 T+ {3 ]& K( J9 F, x
/* USER CODE END I2C1_MspInit 0 */
# ]" Q8 D9 P H. m. i+ ~5 b
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL/ q% b1 ?% p7 _ y
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;' W0 F5 n# _. S% o7 | i: T! M
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;% v% p6 M9 F2 q' s
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
' m7 F+ D* d' ~
/* Peripheral clock enable */
__I2C1_CLK_ENABLE();
) [9 V" @$ Q5 n( n6 m0 Q% s
/* Peripheral interrupt init*/" ]5 L5 F+ V+ D! d( d. ~
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);) a# O* X! b* _
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
/* USER CODE BEGIN I2C1_MspInit 1 */% {9 U/ V" v0 F! N) i' T% ?1 \0 m! U
SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);$ |& k9 }( V' Y, G* O' }
/* USER CODE END I2C1_MspInit 1 */
}
}
试了一下果然可以解决这个问题,感谢!
RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出
有个问题请教下。
这样真的好了吗?参考一下