NXP

LM75a

2019-07-12 14:01发布

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