LM75a

1.器件介绍

LM75a是一种数字接口(i2c)的温度传感器,各大半导体生产厂家都有生产,如德州仪器(TI)、恩智浦(NXP)、意法半导体(ST)等,各个厂家的命名稍有差别,但硬件上、程序上是完全兼容的。下面介绍LM75a器件,及使用之前的i2c封装代码驱动该器件。

1.1器件特点

1)精度:0.125℃

2)范围:-55℃——+125℃

3)i2c数字控制接口

4)3个地址选择引脚,同一根i2c总线上最多挂8个LM75a

1.2引脚图

2.LM75a使用(软件)

2.1 LM75寄存器

1)温度寄存器

LM75a温度寄存器是一个只读寄存器,包含2个8位的数据字节,由一个高数据字节(MS)和一个低数据字节(LS)组成。这两个字节中只有11位用来存放分辨率为0.125℃的温度数据(以二进制补码数据的形式),如下表所示。对于8位的I2C总线来说,只需从LM75A的温度计寄存器地址(0x00)连续读两个字节即可(温度的高8位在前)。

2)其他配置寄存器则查阅数据手册。

2.2驱动代码

以stm32f1为例,以“i2c抽象/模拟i2c”文章中i2c总线抽象代码为基础,驱动LM75a。

#ifndef	_LM75A_H_
#define	_LM75A_H_
	
#define		LM75A_ADDR		0X48   //i2c slave address
#define		REG_TEMP		0X00		
#define		REG_CONF		0X01		
#define		REG_THYST		0X02		
#define		REG_TOS			0X03		

extern void lm75a_init(void);
extern float lm75a_get_temp(void);

#endif

 

#include "i2c_core.h"
#include "i2c_hw.h"
#include "lm75a.h"

//read lm75a register
static char lm75a_read_reg(u8 read_addr,u8 *read_buff,u8 read_size)
{
	struct i2c_dev_message lm75a_msg[2];
	char ret;
	
	lm75a_msg[0].addr  = LM75A_ADDR;
	lm75a_msg[0].flags = I2C_BUS_WR;
	lm75a_msg[0].buff  = &read_addr;
	lm75a_msg[0].size  = 1;
	lm75a_msg[1].addr  = LM75A_ADDR;
	lm75a_msg[1].flags = I2C_BUS_RD;
	lm75a_msg[1].buff  = read_buff;
	lm75a_msg[1].size  = read_size;
	ret = i2c_bus_xfer(&i2c1_dev,lm75a_msg,2);
	
	return ret;
}

//write lm75a register
static char lm75a_write_reg(u8 write_addr,u8 *write_buff,u8	write_size)
{
	struct i2c_dev_message lm75a_msg[2];
	char ret;

	lm75a_msg[0].addr  = LM75A_ADDR;
	lm75a_msg[0].flags = I2C_BUS_WR;
	lm75a_msg[0].buff  = &write_addr;
	lm75a_msg[0].size  = 1;
	lm75a_msg[1].addr  = LM75A_ADDR;
	lm75a_msg[1].flags = I2C_BUS_WR | I2C_BUS_NO_START;	
	lm75a_msg[1].buff  = write_buff;
	lm75a_msg[1].size  = write_size;
	ret = i2c_bus_xfer(&i2c1_dev,lm75a_msg,2);
	
	return ret;
}	

//get temp from lm75a
float lm75a_get_temp(void)
{
	u8 temp_buff[2];
	short temp_data;
	float temp_out;
		
	lm75a_read_reg(REG_TEMP,temp_buff,2);
	temp_data = (temp_buff[0] << 3) | (temp_buff[1] >> 5);
	if(temp_data & 0x400)
	{//负温度
		temp_data = ~temp_data + 1;
		temp_data &= 0x7ff;
		temp_data = -temp_data;
	}
		
	temp_out = temp_data * 0.125f;
		
	return temp_out;
}

代码简要分析:

a)一个为写LM75a寄存器函数,另一个为读LM75啊寄存器函数;

b)已经初始的i2c指针为“i2c1_dev”,通过此地址,调用模拟i2c1,详细看附件源码或者“i2c抽象/模拟i2c”文章;

c)i2c_bus_xfer为i2c封装的对外接口(API);

d)从temp_buff返回的数据中提取有效的温度数据。

3.数据手册

[1]  http://www.ic37.com/TI/LM75A_datasheet_13115261/

4.参考源码

[2]  https://github.com/Prry/drivers-for-mcu

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页