正点原子 I.MX6ULL MINI 开发板学习笔记:LM75 温度传感器采集

这篇笔记继续正点原子 I.MX6ULL MINI 开发板裸机学习,主题是LM75 温度传感器采集。这是 I2C 总线的第一个实际应用。代码来自实际工程 /home/zhao/code/2026/touch_screen。
1. 完成什么实验?
通过 I2C1 读取 LM75 温度传感器的温度寄存器,把原始数据换算成摄氏度并通过串口打印。注意:正点原子 MINI 开发板 I2C1 上板载的是 AP3216C,并没有板载 LM75——本实验用的是外接 LM75 模块,SDA/SCL 接 I2C1 的复用引脚(UART4_RX/UART4_TX),地址 0x48。
2. LM75 是什么?
LM75 是一款数字温度传感器,通过 I2C 接口输出温度值。它的温度分辨率是 9 位(0.5°C/LSB),测量范围 -55°C ~ +125°C,工作电压 3.0V~5.5V(以 TI/Maxim LM75 datasheet 为准,部分兼容型号略有差异)。
3. LM75 的 I2C 地址是多少?
LM75 的 7 位 I2C 地址由 A2、A1、A0 三个引脚电平决定。开发板上这三个引脚通常都接地,所以地址是 0x48。
4. 温度数据怎么换算?
读取温度寄存器会得到 2 个字节。高字节是整数部分的低 8 位,低字节的高 1 位是 0.5°C 位。把两字节拼成 16 位有符号数后右移 7 位,得到 9 位温度值,再乘以 0.5 就是摄氏度。

5. 真实可用的 LM75 代码
下面是工程中验证过的 lm75.c 核心代码。
#include "i2c.h"
float get_temputare(void)
{
unsigned char buffer[2];
short s;
struct I2C_Msg msg = {
.dev_addr = 0x48, /* LM75 设备地址 */
.reg_addr = 0, /* 温度寄存器地址 */
.reg_len = 1,
.data = buffer,
.len = 2,
.direction = I2C_Read
};
transfer(I2C1, &msg);
s = buffer[0] << 8;
s |= buffer[1];
s >>= 7; /* 得到 9 位有符号温度值 */
return s * 0.5; /* 每 LSB 0.5°C */
}
#include "stdio.h"
#include "i2c.h"
#include "lm75.h"
int main(void)
{
init_clock();
system_interrupt_init();
init_uart1();
init_i2c1();
while (1)
{
float t = get_temputare();
printf("temperature: %.1f C\n", t);
delay_ms(1000);
}
return 0;
}
6. 关键点说明
- 设备地址:LM75 为 0x48(A2=A1=A0=0)。
- 温度寄存器地址:0x00,读 2 字节。
- 分辨率:9 位,最小刻度 0.5°C。
- 有符号数:温度值用补码表示,右移时要用 signed short 保持符号。
- 测量误差:LM75 最大误差 ±2°C(datasheet 给的是最大值而非典型值),适合环境温度监测,不适合高精度测温。
- 函数名:代码里的 get_temputare 是工程中的历史拼写(正确拼写 temperature),为与工程保持一致未做修改。
7. 实验现象
程序运行后,串口每隔 1 秒打印一次当前温度,例如 "temperature: 26.5 C"。用手按住传感器,温度会缓慢上升。
总结
| 问题 | 答案 |
|---|---|
| LM75 是什么? | I2C 数字温度传感器 |
| I2C 地址? | 0x48(A2=A1=A0=0) |
| 分辨率? | 9 位,0.5°C/LSB |
| 温度寄存器地址? | 0x00 |
| 怎么换算成摄氏度? | (short)(buffer[0]<<8|buffer[1]) >> 7,再 ×0.5 |
LM75 实验验证了 I2C 读写流程。下一篇回到控制类外设:PWM 脉冲宽度调制。