STM32 I2C钳住SCL强行拉低的解决方法

问题伊始

在多机的I2C通信过程中,STM32单片机做为从机I2C设备与主机通信,以下是代码中的一部分

HAL_I2C_Slave_Receive(&hi2c2, inquire, 2, 500);
if(inquire[0] == 0xaa && inquire[1] == 0x55){	//查询到主机发送的查询码?
	inquire[0] = 0; inquire[1] = 0;	//清除查询码
	for(int i=0; i<1; i++){	//循环一次
		if(HAL_I2C_Slave_Transmit(&hi2c2, verify, 2, 3000) != HAL_OK){ //从机发送确认码
			break;
		}
			
		if(HAL_I2C_Slave_Receive(&hi2c2, u8_angle, 24, 3000) != HAL_OK){
			break;
		}
		
		for(int i=0; i<24; i+=2){ //高位在前
			angle[i / 2] = ((unsigned int)u8_angle[i] << 8) | u8_angle[i+1];
			set_Pulse(i/2, angle[i/2]);
		}
	} //for
}

在执行完if(HAL_I2C_Slave_Receive(&hi2c2, u8_angle, 24, 3000) != HAL_OK)这句代码,STM32单片机莫名钳住的SCL引脚强制拉低,导致I2C永远处于忙状态
在这里插入图片描述
在这里插入图片描述

解决过程

翻找参考手册发现I2C可以软复位,在I2C2->CR1[15]
在这里插入图片描述
但是在代码加入了I2C2->CR1 |= 1 << 15;后确实释放了SCL,但是好像整个I2C都复位后是没办法通信了,反正主机是找不到这个从机设备的存在,我相信肯定还有解决方法,但是我想偷懒一会

解决方法

继续翻手册可以发现I2C2->CR1寄存器下还有一个很重要的位,I2C2->CR1[8]

在这里插入图片描述
代码中加入I2C2->CR1 |= 1 << 9;发现可以正常运行了,可能也是碰巧

HAL_I2C_Slave_Receive(&hi2c2, inquire, 2, 500);
if(inquire[0] == 0xaa && inquire[1] == 0x55){	//查询到主机发送的查询码?
	inquire[0] = 0; inquire[1] = 0;	//清除查询码
	for(int i=0; i<1; i++){	//循环一次
		if(HAL_I2C_Slave_Transmit(&hi2c2, verify, 2, 3000) != HAL_OK){ //从机发送确认码
			break;
		}
			
		if(HAL_I2C_Slave_Receive(&hi2c2, u8_angle, 24, 3000) != HAL_OK){
			break;
		}
		
		I2C2->CR1 |= 1 << 9;	新增加的代码

		for(int i=0; i<24; i+=2){ //高位在前
			angle[i / 2] = ((unsigned int)u8_angle[i] << 8) | u8_angle[i+1];
			set_Pulse(i/2, angle[i/2]);
		}
	} //for
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值