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

分享
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 脉冲宽度调制。

继续阅读

嵌入式开发面试知识手册

嵌入式开发工程师面试知识手册 适用对象:零基础起步、目标是通过嵌入式软件/驱动/BSP 方向面试的读者 编写依据:赵哲简历全部知识点 + 智能车 AGV 控制平台完整项目代码(i.MX6ULL Linux 端 + STM32F407 固件)+ Linux 驱动练习代码包 + embedded-agent 嵌入式开发智能体仓库 + 真实面试手撕代码与追问记录 使用方法:每篇按"通俗解释 → 原理细节 → 命令/API → 代码实例 → 项目结合 → 记忆口诀 → 面试问答"组织;口诀用于快速记忆,问答用于自测。第9篇是讲项目的演练场,第10篇是手撕代码实战题库。 总目录 * 第1篇 C语言与数据结构 * 1.1 编译链接全过程 * 1.2 数据类型与内存

作者:azhezhezhe

正点原子 I.MX6ULL MINI 开发板学习笔记:Linux 驱动架构详解——编译、树内树外与运行时效果

这是 Linux 驱动小系列的总结篇。前三篇把 LED 驱动从内核模块写到 misc 设备,属于“会用”;这篇把背后的架构讲透:驱动到底怎么编译、内核树内和树外两种方式的区别、以及驱动里每个操作在系统跑起来之后到底产生了什么效果。内容整理自我的学习笔记(note.pdf)和实际工程 code/2026/20260803。 1. 驱动代码到底怎么编译的? 不管哪种方式,最终都靠内核的 kbuild 系统。核心就三个文件的关系: * Kconfig:定义 menuconfig 里的选项(如 CONFIG_MYMODULE),三态 y/m/n——y 编进内核,m 编成模块,n 不编; * .config:menuconfig 的选择结果,保存在源码顶层; * Makefile:

作者:azhezhezhe

正点原子 I.MX6ULL MINI 开发板学习笔记:misc 设备——字符设备驱动的快捷方式

上两篇分别用手动 mknod 和 class_create+device_create 注册字符设备,调用链一长串。这篇用 misc(混杂)设备 一步搞定。代码来自实际工程 code/2026/20260803/05_misc_led,已验证可用。 1. 完成什么实验? 用 misc_register 重写 LED 驱动:一步完成设备号分配、字符设备注册、/dev/myled0 节点创建,同时保留上一篇的 sysfs 属性 led_status。 2. 什么是 misc 设备? misc(混杂)设备是 Linux 给“不好归类的小字符设备”

作者:azhezhezhe