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