STM32H7使用硬件I2C读取LM75温度

本文介绍如何使用STM32CubeMx配置I2C3进行LM75BD温度传感器的高速读取,通过硬件I2C和HAL库,避免了软件模拟的低效问题,演示了阻塞式和后续DMA优化的步骤。

前言

网上能搜索到关于STM32的I2C总线文章基本都是使用软件模拟的方式实现的,这应该是F1系列留下的问题,在F4、H7系列中应该已经排除了。使用软件模拟的方式实现I2C通讯的问题在于通讯的速度和效率比较低。

本文就以CubeMX+HAL库+硬件I2C的方式,去实现一个最普通的LM75BD温度IC的读取,I2C使用阻塞式通讯,日后再更改为DMA方式。


一、STM32CubeMx的配置

LM75BD的原理图如下:

 

 通讯地址根据手册的说明,在A2、A1、A0均拉高的情况下,读地址为0x9F。

 

 I2C通讯使用了第I2C3,通讯速率100K,不开中断,两个管脚均为开漏上拉。

 

二、代码实现

LM75BD的温度寄存器地址为0,数据为16位,其中低5位为无效数据,最高位为符号,所以在代码中要先右移5位,再做处理。

 

 代码如下:

/*
*********************************************************************************************************
*	函 数 名: bsp_Lm75bdReadTemp
*	功能说明: 从LM75BD中读取温度数据
*	形    参: 无
*	返 回 值: 浮点温度值
*********************************************************************************************************
*/
float bsp_Lm75bdReadTemp(void)
{
	HAL_StatusTypeDef status = HAL_OK;
	
	uint8_t RawVal[2];//元数据
	int16_t RawTemp;
	float Lm75Temp;
		
	status=HAL_I2C_Mem_Read(LM75_I2C_Handle,LM75BD_ADDRESS,0, I2C_MEMADD_SIZE_8BIT, RawVal, 2,1000);
	
	if (status!=HAL_OK)//读取失败
		return 0;
	else
	{	
		RawTemp=RawVal[0]<<8 | RawVal[1];
		RawTemp= RawTemp>>5;
		if((RawTemp & 0x0400) != 0 )//负温度
			Lm75Temp = ((float)(-((~(RawTemp & 0x03FF))+1)))*0.125;		
		else //正温度
			Lm75Temp = 0.125*(float)RawTemp;
		return Lm75Temp;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值