新闻详情

新闻详情

首页 / 资讯中心 / 详情

TMP102温度读取实战:IIC时序、寄存器与驱动代码全解析

发布时间:2026/9/12 13:00:08来源:尧图网络
TMP102温度读取实战:IIC时序、寄存器与驱动代码全解析
简介面向嵌入式与物联网开发者这是一份基于CC430单片机通过IICI2C总线读取TMP102数字温度传感器的完整工程代码。TMP102具有低功耗、分辨率可达0.0625°C等特点适合环境监测、智能家居与无线传感节点资源内已实现TMP102驱动、CC430 USCI模块初始化、IIC读写时序以及UART输出等关键模块可直接导入IAR等IDE进行编译调试也可作为学习IIC协议和低功耗温度采集的参考模板。压缩包为zip格式共30个文件以C源文件与H头文件为主辅以EWP/EWD工程文件、WSDT工作区文件、R43配置文件及LST/MAP等编译调试输出整体仅95KB结构精炼。从内容预览看项目按模块划分了TMP102、Uart、主程序等单元便于定位与移植。目前已有699人学习下载适合需要快速实现CC430TMP102温度测量或自行移植IIC代码的开发者。1. 解读 TMP102 读取温度先搞清楚 IIC 这条总线在替谁干活TMP102 读取温度在很多工程贴里被描述成一句“读两个字节右移四位乘 0.0625”但真正把它放到 IIC 总线上时问题清单会迅速变长从地址为什么是 0x48写寄存器指针和读数据之间要不要 STOP连续读回的两个字节到底哪个是高位。把这几个点理清比背一串代码有用得多尤其是手里只有附带的 .zip 里的同名 .c 文件而没有注释时。这类包IIC_TMP102.zip_tmp102_tmp102 程序_tmp102读取温度中通常包含软件 IIC 的延时实现、TMP102 寄存器定义和一个读取函数。面向的是 STM32、51、ESP32 这类常见平台代码能不能跑通取决于你链路里的总线时序、上拉电阻和寄存器指针是否按 TMP102 的数据手册对齐。下面从时序、寄存器、驱动、排错到显示把这套流程完整拆开。2. IIC 通信协议与 tmp102 的寄存器读温度前先把时序图翻译成代码2.1 从波形读 IIC 时序START、ADDR、寄存器指针、DATA、STOPIIC 只在 SCL 和 SDA 两根线上做主机与从机的半双工通信。先把最常用的帧结构写出来。主机发 START 后先发一个字节7 位从机地址加 1 位读写标志然后等待从机 ACK如果是写后面跟要访问的寄存器指针如果是读重新发 START或走重复起始后从机把寄存器里的数据打到 SDA 上。最后主机发 STOP 或发 NACK 结束。主机: S | 0x90(W) |ACK| 0x00(寄存器指针) | S | 0x91(R) |ACK| DATA_H |NACK| P 从机: ACK ACK DATA这个流程里最容易写错的是第 5 步。如果只是写寄存器指针后直接读而没有在中间补一个重复起始Repeated START不少从机会把数据指针保持在原处造成读出的数据错位。TMP102 允许在写完指针后连续读两个字节但前提是主机在写指针和读数据之间保持总线不 STOP。很多“读回 0xFF 0xFF”的现场问题往往出在这里。TMP102 地址的低 3 位由管脚决定。当 ADDR0 接地时7 位从机地址是 0x48接 VCC 时是 0x49SDA、SCL 分别接时对应 0x4A 和 0x4B。所以代码里如果把地址写死成 0x48但板子上 ADDR 接 3.3VIIC 时序再标准也不会收到 ACK。2.1.1 地址字节里那一位读写标志写代码时经常看到WriteByte(0x90)、ReadByte(0x91)这是把 0x48 左移一位后拼上 R/W 位。软件 IIC 与硬件 IIC 的差异点在发送方向软件模拟时地址字节必须自己拼硬件外设如 STM32 的 I2C_Start 会要求传入 7 位地址自动帮你在总线上补上 R/W 位。读代码时先分清这一层否则移植到另一个平台时会重复移位一遍。2.2 tmp102 寄存器映射和 12 位/13 位分辨率TMP102 内部寄存器不多读温度务必先认识 0x00。温度寄存器占 16 位其中 D15:D4 是 12 位温度数据D3:D0 是状态位或空位如果把配置寄存器 0x01 的扩展模式Extended Modebit 7置 1则有效数据变成 13 位落位在 D15:D3。大多数日常读数按 12 位处理就够了但想要 0.0625°C 的精度需要在配置寄存器里主动打开扩展模式。寄存器地址默认值用途温度寄存器0x000000h当前温度只读配置寄存器0x010x60扩展模式、转换模式、极性低阈值0x020x4B00低于此温度触发 ALERT高阈值0x030x3200高于此温度触发 ALERT需要注意 0x00 的读取指针在写完配置寄存器后会变化。同一颗 TMP102 在各种例程里表现得“时而正常时而读错”大多是因为初始化时先写了 0x01然后直接去读 0x00 却没有重新把指针指回 0x00。显式写一次指针不会多花多少时间但能省下大量的总线时间。2.3 为什么 0.0625 系数是换算的基准温度寄存器的原始值是 12 位有符号数每个 LSB 代表 0.0625°C。读到的两个字节一个高一个低先把高低字节拼成一个 16 位数再右移 4 位去掉低 4 位状态位得到一个 12 位整数。如果是负数寄存器以二进制补码存储右移时必须用算术右移或先转换为 float 再乘以 0.0625。补码带来的实际问题很多 C 代码用temp (data_h 8) | data_l; temp 4; float t temp * 0.0625;。在 MDK 或 IAR 里temp如果声明为int16_t右移是算术移位没问题如果声明为uint16_t负数会被当成很大的正数放大 0.0625 后变成“室温 2750°C”。这就是为什么在各种 tmp102 程序里反复出现(int16_t)强转。要动手改写这部分代码时先检查原始值的数据类型优先用有符号类型接收原始温度数据。3. tmp102 程序的最小可运行写法从 IIC 驱动到读取温度3.1 用宏展开的软件 IICGPIO 模拟读温度手头没有硬件 IIC 外设时常见的做法是用两只 GPIO 直接模拟 SCL 和 SDA。这样的 tmp102 程序好处是平台无关51、STM8、ESP32 的任意两根引脚都能用代价是对时序敏感后续接入更多 IIC 设备时需自行处理 ACK 拉低。以下是一段精简的 C 模板#define SCL_H HAL_GPIO_WritePin(SCL_GPIO, SCL_PIN, 1) #define SCL_L HAL_GPIO_WritePin(SCL_GPIO, SCL_PIN, 0) #define SDA_H HAL_GPIO_WritePin(SDA_GPIO, SDA_PIN, 1) #define SDA_L HAL_GPIO_WritePin(SDA_GPIO, SDA_PIN, 0) #define SDA_IN HAL_GPIO_ReadPin(SDA_GPIO, SDA_PIN) void IIC_Delay(void) { /* 半周期延时约2.5us对应100kHz */ } void IIC_Start(void) { SDA_H; SCL_H; IIC_Delay(); SDA_L; IIC_Delay(); // SCL高电平时SDA拉低START SCL_L; IIC_Delay(); } void IIC_Stop(void) { SCL_L; SDA_L; IIC_Delay(); SCL_H; IIC_Delay(); SDA_H; IIC_Delay(); // SCL高电平时SDA拉高STOP } uint8_t IIC_WriteByte(uint8_t data) { for (int i 0; i 8; i) { (data 0x80) ? SDA_H : SDA_L; data 1; SCL_H; IIC_Delay(); SCL_L; IIC_Delay(); } SDA_IN; // 释放SDA等待从机ACK SCL_H; IIC_Delay(); uint8_t ack SDA_IN; // 低电平表示ACK SCL_L; IIC_Delay(); return ack; }这段代码的关键在高电平时锁存SDA 只能在 SCL 为低时变化SCL 高电平期间 SDA 必须稳定。IIC_Start就是利用 SCL 高、SDA 由高到低的边沿产生起始条件IIC_Stop则相反。写地址或数据后读 ACK 之前必须把 SDA 引脚从输出切到输入否则引脚自拉电平会掩盖从机的 ACK导致软件误判总线故障。许多移植失败的 tmp102 程序问题出在 GPIO 初始化模式上没有在每字节末尾切换方向或 SCL 高电平保持时间太短。3.2 硬件 IIC 怎么接入以 STM32 和 ESP32 为例硬件外设接管了起始、停止和 ACK 生成程序负担更小。STM32 使用 HAL 时初始化 I2C 外设后读 2 个字节uint8_t reg 0x00; uint8_t buf[2]; HAL_I2C_Master_Transmit(hi2c1, (0x48 1), reg, 1, 100); HAL_I2C_Master_Receive(hi2c1, (0x48 1), buf, 2, 100); int16_t raw (buf[0] 8) | buf[1]; raw 4; float t raw * 0.0625;这里两个 HAL 调用之间没有 STOP因为 HAL_I2C_Master_Transmit 结束后会释放总线第二次调用的 START 本质上是重复起始条件满足 TMP102 的顺序要求。地址参数要写(0x48 1)有的 HAL 封装要求 7 位地址左移后再传入有的要求直接传 0x48。换平台时看一眼 i2c 驱动源代码里地址是否被二次左移避免地址对不上。ESP32 使用 ESP-IDF 时先在i2c_param_config里把时钟频率设为 100000 或 400000再i2c_driver_install。读取函数通常提供i2c_master_write_to_device和i2c_master_read_from_device指针寄存器的写入操作会自动拼成一条 IIC 事务。值得注意的是 ESP32 的内部上拉较弱接多设备时建议在 SCL/SDA 外部加上拉电阻。3.3 读取流程一次连续读取还是两次单字节读TMP102 自动递增功能使寄存器指针在读取完 0x00 后自动移到 0x01。连续读两个字节是常态因为一次事务既拿到高字节也拿到低字节分两次单字节读则需要每次都回写指针 0x00否则第二次读出的数据会落到配置寄存器上。连续读带来的另一个好处是减少总线冲突窗口但代价是必须在数据校验时对齐字节序TMP102 先发高字节再发低字节读回数组buf[0]是高 8 位。// 连续读两个字节之后buf[0]高字节, buf[1]低字节 status IIC_ReadBytes(TMP102_ADDR, 0x00, buf, 2); uint16_t raw (buf[0] 8) | buf[1];主设备读完后要不要返回 NACK取决于你读多少字节。如果只读 1 字节主机在第 8 个时钟发出 NACK从机便知道要停止发送读 2 字节时第 1 字节后主机要发 ACK第 2 字节后才发 NACK。这个细节在软件模拟 IIC 时很容易省略如果每个字节都强制拉低 ACKTMP102 会认为主机还想继续接收在连续读场景下多吞一个字节拖慢整条总线的同时占用 I2C 的状态机。4. 上拉电阻、速率和 ACKtmp102 读取温度失败时的 5 个排查点4.1 IIC 上拉电阻选多大4.7kΩ 是起点但不是所有总线都适用IIC 总线是开漏结构SCL、SDA 需要上拉电阻把线拉高。TMP102 数据手册要求上拉电流不超过 3 mA快速模式 400kHz 下的上升沿时间有上限这直接约束了上拉电阻的上限和下限。总线上拉电阻适用场景备注1kΩ高速或长线、多从机电流较大功耗偏高4.7kΩ100kHz/400kHz 短距离开发板最常见的初始值10kΩ低速、低功耗、单从机上升沿变慢读数据易失真选多大的判断方法先看 SCL 高电平时间是否足够。普通 GPIO 模拟 IIC 的延时函数在-O0和-O2编译优化下差异很大开启优化后代码快 3~5 倍原本 4.7kΩ 能跑通的总线可能在新固件上出现帧丢失。这时要么降低 IIC 速率要么把电阻换成 2.2kΩ二者选其一不要两手都改。4.2 速率与 TMP102 实际能承受的上限常见误区是老代码清一色跑 100kHz。TMP102 本身支持 400kHz但总线信号的质量由最慢的一颗从机决定。把 OLED 和 TMP102 挂在同一条 IIC 总线上时OLED 控制芯片对时钟延时的要求通常比 TMP102 宽松真正的瓶颈不一定在温度传感器。以下三条检查顺序能快速排查速率问题SCL 频率设成 400kHz 后无法稳定读出降回 100kHz 测试排除时序余量不足。用逻辑分析仪抓 SCL 高电平宽度若小于 0.6us接近快速模式最低要求延长 IIC_Delay。软件模拟时先把编译器优化等级统一到 0写出基准波形再开优化对比波形是否有数据竞争。如果总线速率的余量实在紧张可以只对 TMP102 单独初始化一条 IIC 总线让 OLED 走另一条。多总线方案虽然多占用一组引脚但能隔离不同设备之间的速率和上拉需求调试起来更省时间。4.3 ACK 缺失与从机地址引脚总线正常但没有 ACK最先怀疑的是地址引脚。TMP102 的 ADDR0 必须明确接到 GND 或 VCC不能悬空。悬空状态下引脚电平不确定0x48 与 0x49 都不一定应答。其次示波器探头接入时要注意 SDA 在 ACK 位上的动作从机回应 ACK 会把 SDA 拉低一个时钟如果主机在同一个时钟把自己的 SDA 输出拉高会产生总线冲突在波形上表现为毛刺。抓波形时把 SDA 方向切换看成一个状态变量有助于定位是谁在抢总线。4.4 用 i2c-tools 验证 tmp102 读取是否正常在 Linux 开发板上可以先用 i2c-tools 查出从机是否应答再决定是否进驱动层排查i2cdetect -y 1 i2cget -y 1 0x48 0x00 w第一条命令扫描总线 1 上的所有地址正常时 TMP102 的 0x48 会被显示出来。第二条命令用 word 方式读温度寄存器返回的 16 位数据在下发寄存器指针后连续读回。如果i2cget显示错误先把 SDA、SCL 再接一次很多“程序没问题但不读温度”的现场只是杜邦线接触不良。如果 i2cdetect 列表里出现 0x49 而不是 0x48说明 ADDR0 默认为高电平不是配置错误只要把地址改成 0x49 就行。5. 把 tmp102 读到的温度变现OLED 显示、轮询间隔和负温度补偿5.1 与 OLED 共用 IIC 总线时的时序规划常见派生产物是给 tmp102 加一个 SSD1306 的 OLED。两块芯片同时挂在总线上时从机地址 0x48 和 0x3C 不会冲突但时序上不要让 OLED 的初始化指令串到温度读取事务里去否则 OLED 控制器的时序约束会把本来正常的 400kHz 总线拖慢。做法是上电后先把 OLED 初始化完成再进入温度读取循环后续刷新 OLED 时使用独立的 IIC 句柄或预留 1ms 间隔避免在同一个事务中途切换。5.2 温度计算用整数运算代替浮点除法乘 0.0625 本身没有精度问题但在没有 FPU 的小单片机上浮点运算可能拖慢读取频率。可以用整数方式换算温度原始值乘以 625 再除以 10000。更实用的技巧是保留一位小数作为点温度值处理。int16_t raw (int16_t)((buf[0] 8) | buf[1]); int16_t val raw 4; int temp_x10 (val * 625) / 100; // val*0.0625 - *625/10000, 放大10倍这个乘法在 12 位温度最大值 2047 下积为 1,279,375int32 足够。要注意 val 已经是有符号数冰冷环境下读回 -40°C 时raw 4得到负值直接参与整数乘法不会出错但如果先转成无符号就反而需要补码转换。5.3 验证读回的数值用冰水混合物做温度校准拿一支体温计做交叉验证只能看个大概更可靠的校准点在 0°C。用保温杯装入碎冰加水把 TMP102 探头完全浸泡正确接线后读数应稳定在 0.00±0.5°C。如果读出 256°C 之类的怪值优先查看数据右移前的寄存器和状态位而不是去改 0.0625 系数。验证完在temp_x10上做两级台阶校准先测 0°C 得到 offset再测室温得到斜率把偏移量直接叠加在temp_x10上即可。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Diffusers 远程推理(Remote Inference)实战:用 Inference Endpoints 把 VAE 编码/解码卸载到云端 2026/9/12 13:33:13

Diffusers 远程推理(Remote Inference)实战:用 Inference Endpoints 把 VAE 编码/解码卸载到云端

Diffusers 远程推理(Remote Inference)实战:用 Inference Endpoints 把 VAE 编码/解码卸载到云端 【免费下载链接】diffusers 🤗 Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTor…

阅读更多 →
Karakeep 如何用列表和智能列表把书签组织成动态视图 2026/9/12 13:33:13

Karakeep 如何用列表和智能列表把书签组织成动态视图

Karakeep 如何用列表和智能列表把书签组织成动态视图 【免费下载链接】hoarder A self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search 项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder …

阅读更多 →
RetroArch 界面怎么改成中文?菜单一键切换与配置文件双路线 2026/9/12 13:33:13

RetroArch 界面怎么改成中文?菜单一键切换与配置文件双路线

RetroArch 界面怎么改成中文?菜单一键切换与配置文件双路线 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch RetroArch 默认英文界…

阅读更多 →
三款免安装Web ER图工具实战指南 2026/9/12 13:33:13

三款免安装Web ER图工具实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
TMP102温度读取实战:IIC时序、寄存器配置与排错全解析 2026/9/12 13:33:13

TMP102温度读取实战:IIC时序、寄存器配置与排错全解析

简介:这是一份基于CC430单片机的TMP102温度传感器IIC读取工程源码包,面向嵌入式开发入门者与物联网项目开发者,适合学习低功耗数字温度采集、IIC总线协议及CC430混合信号控制器的工程实践。压缩包共30个文件,大小仅95KB&#xff0…

阅读更多 →
大金重工冲刺港股:62亿营收与11亿利润背后的风电装备资本棋局 2026/9/12 13:30:13

大金重工冲刺港股:62亿营收与11亿利润背后的风电装备资本棋局

看到这条消息的时候,我第一反应是:风电装备这个赛道,终于又有企业要去港股讲故事了。大金重工冲刺港股,年营收62亿,利润11亿,金鑫控制40%股权,几个关键词摆在一起,信息量其实不小。这…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞