初级会员

- 积分
- 132
- 金钱
- 132
- 注册时间
- 2018-8-25
- 在线时间
- 33 小时
|
本帖最后由 LevenC 于 2018-9-29 18:17 编辑
[mw_shl_code=c,true]/**
* SPDX-License-Identifier: MIT
* @brief 修复I2C总线,将I2C总线从BUSY状态转换到空闲状态
* @param None.
* @retval None.
*/
static void i2c_busy_to_idle(I2C_TypeDef* I2Cx)
{
I2C_GPIO_INIT(GPIOB, I2C_OUT_OD); /* 通用开漏输出 */
I2C_CSL_SET(); /* I2C SCL = 1 */
i2c_timeout = I2C_LONG_TIMEOUT;
/* 检测I2C SDA为高电平 */
while((!GPIO_ReadOutputDataBit(GPIOB, I2C_PIN_SDA)) && (i2c_timeout != 0)) {
I2C_CSL_RESET(); /* I2C SCL = 0 */
delay_us(10); /* 10us delye */
I2C_CSL_SET(); /* I2C SCL = 1 */
delay_us(10); /* 10us delye */
/* 修复总线超时处理 */
if((--i2c_timeout) == 0) {
i2c_timeout_callback(err_i2c_busy_to_idle);
}
}
I2C_SDA_RESET(); /* I2C SDA = 0 */
I2C_GPIO_INIT(GPIOB, I2C_AF_OD); /* 复用开漏输出 */
I2C_SoftwareResetCmd(I2Cx, ENABLE); /* 开启对I2C进行软件复位 */
I2C_SoftwareResetCmd(I2Cx, DISABLE); /* 停止对I2C进行软件复位 */
}[/mw_shl_code]
|
|