基于IMXULL的SHT3X 温湿度传感器 I2C 驱动开发调试记录

目录

一、项目概述

[1.1 硬件平台](#1.1 硬件平台)

[1.2 软件架构](#1.2 软件架构)

二、调试过程中遇到的问题

[2.1驱动加载与 probe 问题](#2.1驱动加载与 probe 问题)

2.2数据读取成功但数值异常

三、I2C时序

利用 Linux 内核中的I2C 子系统,编写SHT3X 温度传感器驱动,实时采集温度,并使用滑动均值滤波算法(窗口大小设置为5)实现数据处理;

一、项目概述

1.1 硬件平台

开发板: IMX6ULL (ARM Cortex-A7)
内核版本: Linux 4.1.15
传感器: Sensirion SHT3X 系列(I2C 接口)
传感器 I2C 地址: 0x44

0x44 是 SHT3X 传感器的 I2C 从机地址,它挂在 I2C1 总线上;I2C1 复用了 UART4 的 TX/RX 物理引脚(UART4_TX→SCL, UART4_RX→SDA);

Linux 中 I2C1 对应 /dev/i2c-0:这是 IMX6ULL 的约定:内核编号从 0 开始,而芯片手册中的控制器编号从 1 开始。

P4(42 - SAA;43 - SCL)

1.2 软件架构

项目采用 Linux 字符设备驱动 + 用户态应用的两层架构:

二、调试过程中遇到的问题

2.1驱动加载与 probe 问题

分析过程:

probe 函数的执行流程是按顺序的:

kzalloc() 分配数据结构 ✅

sht3x_soft_reset() 发送软复位命令 ❌ → 返回 error -5 (EIO)

因为复位失败,跳转到 err_free,释放内存并返回错误

misc_register() 从未被调用 → /dev/sht3x_misc 未创建

出错原因:未将设备数文件正确拷贝到~/tftpboot目录下,而是拷贝到了nfp/roots下。

TFTP 是给 U-Boot 用的"快递服务"------专门运送内核和设备树这两种启动必需品;NFS 是给 Linux 用的"共享文件夹"------驱动、应用等所有运行时文件都走这里。设备树必须在内核启动前到位,所以只能走 TFTP,放 NFS 里 U-Boot 根本看不到。

2.2数据读取成功但数值异常

现象:驱动成功加载后(忽略软复位错误),应用读取到的温湿度值为负数。

根因分析:32 位整数溢出

解决办法:使用 64 位整数 (long long) 进行中间运算,防止溢出

三、I2C时序

I2C通信有什么特点,代码该如何编写,时序是啥?

相关推荐
sukalot11 小时前
windows 驱动实例分析系列: libusb驱动分析-应用层源码篇(三)
windows·驱动开发
智购科技无人售货机工厂16 小时前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
Jaixln_HRF3 天前
率能SS8837T 单通道1.8A/12V H桥电机驱动芯片,低功耗睡眠模式120nA,用于摄像机/玩具/机器人
驱动开发·嵌入式硬件·机器人·硬件工程
bingcheby3 天前
PS通过AXI总线控制PL的LED灯实验之四---编程下载调试
驱动开发·fpga开发·iar
xu_wenming3 天前
嵌入式软件架构中的6种解耦艺术
c语言·驱动开发·嵌入式硬件·架构
DevHub3 天前
CANopen 教程:STM32 实现 CANopen 从站,3 个回调替代手写对象字典
c语言·驱动开发·stm32·单片机·嵌入式硬件·mcu
Jaixln_HRF4 天前
率能SS6216 单通道1.4A/7.2V直流电机驱动芯片,支持正反转/停止/刹车,用于玩具/智能锁/车载夹
驱动开发·嵌入式硬件·硬件工程
sukalot4 天前
windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)
windows·驱动开发
沫璃染墨4 天前
《从零入门Linux系统篇(二十九):文件篇·二——深入文件描述符:从文件描述符表到重定向,再到Shell实现》
linux·运维·服务器·c++·驱动开发·系统架构
Jaixln_HRF4 天前
率能SS6635E 单通道4.5A/30V直流电机驱动芯片,高压大电流,用于电子锁/玩具/机器人
驱动开发·嵌入式硬件·机器人·硬件工程