STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?

主要问题:
1,使用STM32F103C8T6,模拟IIC,SCL和SDA口配置为推挽输出上拉,主要是SDA脚,每次都要输出输入模式重新配置,虽然也能通信,但不稳定,出错率大;
2,后将SCL和SDA口配置为开漏输出上拉,仍是IO模拟IIC,开漏的特点是写1时,是使用上拉电阻将总线拉高,总线处于“释放”状态,其他器件2可以拉低,写0是总线接地,总线此时是不能被其他器件拉高的,所示总线处于被写0一方的的占用或者强制。而我的stm32无外接上拉电阻,SHT20的SCL和SDA也无外接上拉电阻,这时使用HAH库的写高,是无法拉高的,后将SCL和SDA脚都加了10K上拉电阻后,通信正常;
3,也可以使用STM32CubeMX配置为硬件IIC进行通信,也要外接上拉电阻,但此方法还未尝试,发现网上说STM32F103系列的IIC使用HAH库发送函数返回BUSY,存在BUSY锁死问题,暂时未用。

下图是SCL和SDA脚配置为推挽上拉输出方式通信,的宏定义,SDA每次操作都要重新配置输入或输出,此方法在IIC通信中不可取:
请添加图片描述
再来说说SHT20的驱动,我使用非主机模式,默认温度测量需要等待80几ms,如果使用裸机,只有阻塞延迟,太浪费时间了,还是要加实时操作系统的,像FREERTOS。
如下模拟IIC读测值代码,仅供参考!!

void SHT2x_MeasureHM(etSHT2xMeasureType eSHT2xMeasureType)
{  
	uint8_t checksum; 
	uint16_t i = 0; 
	uint8_t back_flag = 1; 
	I2c_StartCondition();
	back_flag = I2c_WriteByte(I2C_ADR_W);
	if(back_flag == ACK)
	{ 
		sensor_warning_flag = 0;
		switch(eSHT2xMeasureType)
		{ 
			case HUMIDITY: back_flag = I2c_WriteByte(TRIG_RH_MEASUREMENT_POLL); break;
			case TEMP :    back_flag = I2c_WriteByte(TRIG_T_MEASUREMENT_POLL); break;
			default: break;
		}
		if(back_flag == ACK)
		//-- wait until hold master is released --
		{
			 I2c_StopCondition();
			 back_flag = I2c_WriteByte(I2C_ADR_R);
			while(back_flag== NACK)
			{
				I2c_StopCondition();
				delayUs(10*(++i));
			  I2c_StartCondition();
				back_flag = I2c_WriteByte(I2C_ADR_R);
				if (i>=100) 
				{
					error |= TIME_OUT_ERROR;
					return;
				}
			};
			//-- read two data bytes and one checksum byte --
			dat[0] = I2c_ReadByte(ACK);  //高8位数据
			dat[1] = I2c_ReadByte(ACK);  //低8位数据
			checksum= I2c_ReadByte(NACK);  //8位校验位数据
			//-- verify checksum --
			error = SHT2x_CheckCrc(dat,2,checksum);
			I2c_StopCondition();
		}
		else
			error |= ACK_ERROR;
	}
	else
		error |= ACK_ERROR;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值