当前位置: 首页 > article >正文

在i.MX6ULL开发板上手搓DS18B20驱动:从GPIO配置到用户态测试的完整流程

在i.MX6ULL开发板上手搓DS18B20驱动从GPIO配置到用户态测试的完整流程温度传感器在工业控制、智能家居等领域有着广泛应用而DS18B20作为一款经典的单总线数字温度传感器以其独特的单线接口和较高的精度受到开发者青睐。本文将带你从零开始在i.MX6ULL开发板上实现DS18B20的完整驱动开发流程涵盖硬件连接、内核驱动编写、用户空间测试等关键环节。1. 硬件准备与GPIO配置1.1 硬件连接与引脚选择在开始编码前我们需要确保硬件连接正确。对于i.MX6ULL开发板如正点原子ATK-DL6Y2C推荐使用GPIO4_PIN19作为DS18B20的数据线DQ连接引脚。硬件连接要点如下电源连接DS18B20支持3.0V-5.5V宽电压供电可直接使用开发板的3.3V电源数据线上拉DQ线需要接4.7KΩ上拉电阻至VCC引脚分配确认GPIO4_PIN19对应的物理引脚位置硬件连接示意图i.MX6ULL开发板 DS18B20传感器 --------------- --------------- | 3.3V ------------- VDD | | GND ------------- GND | | GPIO4_19 ----[4.7K]-- DQ | --------------- ---------------1.2 GPIO初始化与配置在Linux内核中配置GPIO需要完成以下几个关键步骤时钟使能首先需要使能GPIO4的时钟引脚复用配置将引脚设置为GPIO功能方向设置根据操作需要动态切换输入/输出模式以下是GPIO初始化的核心代码片段#define CCM_CCGR3_BASE 0x20C4074 #define GPIO4_GDIR_BASE 0x20A8004 #define GPIO4_DR_BASE 0x20A8000 #define PIN_NUM 19 static void __iomem *gpio_base; static void gpio_init(void) { // 1. 映射寄存器地址 gpio_base ioremap(GPIO4_DR_BASE, 8); // 2. 使能GPIO4时钟 writel(readl(CCM_CCGR3_BASE) | (312), CCM_CCGR3_BASE); // 3. 设置引脚复用为GPIO iomux_set_pad(MX6UL_PAD_CSI_VSYNC__GPIO4_IO19, 0x1B0B0); // 4. 初始设置为输出模式 writel(readl(gpio_base 4) | (1PIN_NUM), gpio_base 4); }注意不同内核版本和开发板的寄存器地址可能有所差异请参考具体芯片手册确认。2. DS18B20驱动核心实现2.1 单总线协议时序控制DS18B20采用严格的单总线时序协议任何操作都需要遵循特定的时序要求。以下是关键时序的实现要点复位脉冲主机拉低总线480μs以上然后释放存在脉冲从机在15-60μs内拉低总线60-240μs作为响应写时序写0拉低总线至少60μs写1拉低总线1-15μs后释放读时序主机拉低总线1μs后释放在15μs内采样总线状态实现精确的微秒级延时是驱动稳定的关键。在内核空间我们可以使用udelay()函数static void ds18b20_reset(void) { gpio_direction_output(pin, 0); udelay(480); gpio_direction_input(pin); udelay(60); if (!gpio_get_value(pin)) { udelay(420); printk(KERN_INFO DS18B20 detected\n); } }2.2 温度转换与读取流程完整的温度读取流程包括以下步骤发送复位脉冲并检测设备存在发送跳过ROM命令0xCC发送温度转换命令0x44等待转换完成典型750ms再次发送复位脉冲发送跳过ROM命令0xCC发送读取暂存器命令0xBE读取两个字节的温度数据温度数据处理代码示例static int ds18b20_read_temp(short *temp) { unsigned char lsb, msb; // 启动温度转换 ds18b20_reset(); ds18b20_write_byte(0xCC); // Skip ROM ds18b20_write_byte(0x44); // Convert T msleep(750); // 等待转换完成 // 读取温度值 ds18b20_reset(); ds18b20_write_byte(0xCC); // Skip ROM ds18b20_write_byte(0xBE); // Read Scratchpad lsb ds18b20_read_byte(); msb ds18b20_read_byte(); *temp (msb 8) | lsb; return 0; }3. Linux字符设备驱动框架3.1 驱动模块初始化Linux内核模块需要实现标准的初始化和退出函数static int __init ds18b20_init(void) { int ret; // 1. 分配设备号 ret alloc_chrdev_region(devno, 0, 1, ds18b20); if (ret 0) { printk(KERN_ERR Failed to allocate device number\n); return ret; } // 2. 初始化cdev结构 cdev_init(ds18b20_cdev, ds18b20_fops); ds18b20_cdev.owner THIS_MODULE; // 3. 添加cdev到系统 ret cdev_add(ds18b20_cdev, devno, 1); if (ret) { unregister_chrdev_region(devno, 1); return ret; } // 4. 创建设备节点 ds18b20_class class_create(THIS_MODULE, ds18b20); device_create(ds18b20_class, NULL, devno, NULL, ds18b20); // 5. 初始化硬件 gpio_init(); printk(KERN_INFO DS18B20 driver loaded\n); return 0; }3.2 文件操作接口实现为用户空间提供read接口来读取温度值static ssize_t ds18b20_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { short temp; int ret; ret ds18b20_read_temp(temp); if (ret) return ret; if (copy_to_user(buf, temp, sizeof(temp))) return -EFAULT; return sizeof(temp); } static struct file_operations ds18b20_fops { .owner THIS_MODULE, .read ds18b20_read, };4. 用户空间测试与调试4.1 测试程序编写编写简单的用户空间程序测试驱动功能#include stdio.h #include fcntl.h #include unistd.h int main() { int fd; short temp; float celsius; fd open(/dev/ds18b20, O_RDONLY); if (fd 0) { perror(Failed to open device); return -1; } while (1) { if (read(fd, temp, sizeof(temp)) ! sizeof(temp)) { perror(Read failed); break; } celsius temp * 0.0625; printf(Temperature: %.2f°C\n, celsius); sleep(1); } close(fd); return 0; }4.2 常见问题排查在实际开发中可能会遇到以下典型问题设备无响应检查硬件连接是否正确确认上拉电阻已接测量DQ线电压是否正常读取温度值异常检查时序精度特别是延时时间确认内核配置是否正确特别是HZ设置尝试降低CPU频率测试驱动加载失败检查内核版本是否匹配确认GPIO资源未被其他驱动占用查看dmesg输出获取详细错误信息调试技巧在内核驱动中添加printk语句输出关键步骤的执行情况可以帮助快速定位问题所在位置。5. 性能优化与进阶技巧5.1 中断与轮询的选择对于DS18B20这类时序严格的设备通常有以下两种实现方式方式优点缺点适用场景轮询实现简单时序精确占用CPU资源单一传感器低负载系统中断节省CPU资源实现复杂时序难控制多传感器高负载系统对于i.MX6ULL这类性能较强的处理器推荐使用轮询方式可以保证时序精度。5.2 多设备支持单总线上可以挂载多个DS18B20每个设备有唯一的64位ROM编码。实现多设备支持需要实现搜索ROM算法为每个设备创建单独的设备节点管理各设备的温度转换和读取核心搜索算法实现片段void ds18b20_search_rom(uint8_t *rom_codes, int max_devices) { int last_zero -1; uint8_t rom[8]; while (ds18b20_find_next(rom, last_zero)) { if (devices_found max_devices) { memcpy(rom_codes[devices_found*8], rom, 8); devices_found; } } }5.3 内核定时器与工作队列对于需要定期采集温度的场景可以使用内核定时器和工作队列实现后台采集static struct delayed_work ds18b20_work; static void ds18b20_work_handler(struct work_struct *work) { short temp; ds18b20_read_temp(temp); schedule_delayed_work(ds18b20_work, HZ); // 每秒采集一次 } static int __init ds18b20_init(void) { INIT_DELAYED_WORK(ds18b20_work, ds18b20_work_handler); schedule_delayed_work(ds18b20_work, HZ); // ...其他初始化代码 }6. 系统集成与部署6.1 交叉编译环境搭建针对i.MX6ULL的ARM Cortex-A7处理器需要配置交叉编译工具链下载Linaro GCC工具链设置环境变量export ARCHarm export CROSS_COMPILEarm-linux-gnueabihf-编译驱动模块make -C /path/to/kernel/source M$PWD modules6.2 通过NFS快速部署开发阶段可以使用NFS挂载根文件系统加速调试过程主机端配置NFS服务器导出开发目录在uboot中设置启动参数setenv bootargs consolettymxc0,115200 root/dev/nfs nfsroot192.168.1.100:/path/to/rootfs ipdhcp启动后即可直接访问主机上的驱动模块和测试程序6.3 集成到Buildroot/Yocto对于产品化部署建议将驱动集成到构建系统中Buildroot配置创建package/ds18b20目录编写Config.in和ds18b20.mk添加BR2_PACKAGE_DS18B20配置选项Yocto配置创建meta-ds18b20层编写bb文件定义驱动模块添加到IMAGE_INSTALL中7. 实际项目经验分享在工业现场部署DS18B20时电缆长度可能达到数十米这会引入信号完整性问题。通过以下措施可以提高稳定性使用屏蔽双绞线作为信号线在远端增加RC滤波电路如100Ω电阻串联100nF电容对地降低总线速度适当延长各时序的时间裕量在驱动中实现自动重试机制另一个常见问题是电源干扰特别是在电机等大功率设备附近。可以采用以下方案使用寄生供电模式不连接VDD引脚在电源端增加π型滤波电路确保良好的接地对于需要高精度测量的场景需要注意DS18B20的精度为±0.5°C对于更高要求可以考虑DS18B20-PAR±0.2°C避免将传感器安装在发热元件附近定期进行校准可通过软件补偿

相关文章:

在i.MX6ULL开发板上手搓DS18B20驱动:从GPIO配置到用户态测试的完整流程

在i.MX6ULL开发板上手搓DS18B20驱动:从GPIO配置到用户态测试的完整流程 温度传感器在工业控制、智能家居等领域有着广泛应用,而DS18B20作为一款经典的单总线数字温度传感器,以其独特的单线接口和较高的精度受到开发者青睐。本文将带你从零开始…...

yolo检测生成的txt转换为labelme可以编辑的json

yolo检测生成的txt转换为labelme可以编辑的json,以及json转txttxt转json代码如下import cv2 import os import json该脚本实现将yolo格式标签转为json格式标签 需要的数据:原始图像 原始yolo格式标签(txt文件) imgs_path "D…...

mdBook集成AI助手:自动化技术文档编写与优化实践

1. 项目概述:当技术文档遇上AI助手最近在折腾一个开源项目,需要写一份像样的技术文档。说实话,写文档这事儿,对很多开发者来说,可能比写代码还头疼。代码逻辑清晰,运行结果立竿见影;文档呢&…...

【INTERCONNECT】CW Laser 和 OPWM 组成的系统

【INTERCONNECT】CW Laser 和 OPWM 组成的系统 引言 正文 Author: JiJi \textrm{Author: JiJi} Author: JiJi Created Time: 2026.05.07 \textrm{Created Time: 2026.05.07} Created Time: 2026.05.07...

【INTERCONNECT】Optical Spectrum Analyzer 组件

【INTERCONNECT】Optical Spectrum Analyzer 组件 引言 正文 General 标签页下的参数 Standard 标签页下的参数 Enhanced 标签页下的参数 Simulation 标签页下的参数 Display 标签页下的参数 Results 标签页下的参数 Author: JiJi \textrm{Author: JiJi} Author: JiJi Created…...

Chrome插件开发实战

目录 一、核心概念与基础 二、开发环境搭建 三、Content Script深度开发 四、Background Script高级技巧 五、数据存储方案选型 六、权限安全最佳实践 七、调试与性能优化 八、实战案例:广告拦截插件 九、发布与更新策略 掌握浏览器扩展开发核心技术&#…...

从VBA到Python:给老牌仿真软件HFSS做个‘现代化改造’

从VBA到Python:HFSS仿真自动化的技术跃迁与实践指南 在电磁仿真领域,HFSS作为行业标杆工具已有数十年历史,而与其相伴的VBA脚本语言正逐渐显露出时代局限性。当Python以每年20%的增速成为工程领域最受欢迎的编程语言时(IEEE Spect…...

国内如何聪明地使用Cursor,汉化、无限制与第三方Key三步走

为何使用Cursor 在AI 编程IDE选择上,Cursor的提示词输入,文件引用,使用交互方面确实是很良好的,如果对工具交互有极致要求的,相对Trae 、VSCode等确实不太完美。 汉化,让你更加快速操作界面 无限制&#x…...

Python代码实现原理深度解析:从基础语法到高级特性

Python代码实现原理深度解析:从基础语法到高级特性 【免费下载链接】code ActiveState Code Recipes 项目地址: https://gitcode.com/gh_mirrors/code1/code 一、Python代码执行的基本流程 Python作为一门解释型语言,其代码实现原理主要围绕解释…...

2025届最火的十大AI学术工具横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 专门用于降低文本被人工智能检测系统识别概率的工具问世,它借助语义重构与句式变…...

tinfoleak地理情报分析:追踪用户位置与移动路线的终极指南

tinfoleak地理情报分析:追踪用户位置与移动路线的终极指南 【免费下载链接】tinfoleak The most complete open-source tool for Twitter intelligence analysis 项目地址: https://gitcode.com/gh_mirrors/ti/tinfoleak tinfoleak是一款功能强大的开源Twitt…...

BoringSSL未来展望:量子安全加密与下一代协议演进

BoringSSL未来展望:量子安全加密与下一代协议演进 【免费下载链接】boringssl Mirror of BoringSSL 项目地址: https://gitcode.com/gh_mirrors/bo/boringssl BoringSSL作为一款由Google开发的加密库,正积极应对量子计算带来的挑战,通…...

为Claude Code配置Taotoken密钥与聚合地址避免封号困扰

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为Claude Code配置Taotoken密钥与聚合地址避免封号困扰 如果你正在使用Claude Code作为编程助手,可能会遇到官方渠道的…...

ESXi GPU虚拟化(vGPU)怎么配置?新手一步到位教程

在ESXi主机运维中,随着图形密集型业务(如3D渲染、AI训练、虚拟桌面)的需求增加,GPU虚拟化(vGPU)成为必备技能——通过vGPU技术,可将一张物理GPU虚拟化成多个虚拟GPU,分配给不同虚拟机…...

Newton性能分析工具:找出仿真瓶颈的实用方法

Newton性能分析工具:找出仿真瓶颈的实用方法 【免费下载链接】newton An open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers. 项目地址: https://gitcode.com/Git…...

华硕B660M主板装Ubuntu 22.04,避开N卡黑屏和磁盘识别坑的保姆级教程

华硕B660M主板Ubuntu 22.04实战指南:NVIDIA显卡与磁盘识别的终极解决方案 当高性能硬件遇上开源系统,总会碰撞出意想不到的火花。作为一名长期在Linux环境下工作的开发者,我最近为团队配置了一批搭载华硕B660M主板和NVIDIA 30系列显卡的开发机…...

ESP32-S3开发板硬件解析与LoRaWAN实战指南

1. 硬件解析:Heltec WiFi LoRa 32 (V4)开发板深度拆解1.1 核心硬件架构设计这款基于ESP32-S3的开发板在硬件设计上做了多项针对性优化。主控采用双核240MHz的ESP32-S3,搭配512KB SRAM和2MB PSRAM的内存组合,在低功耗场景下能保持足够的处理能…...

AI Agent运维实战:轻量级仪表板AgentHQ部署与核心功能解析

1. 项目概述:一个为AI Agent团队打造的轻量级运维仪表板如果你正在使用OpenClaw框架管理一个AI Agent团队,那么你很可能和我一样,经历过这样的混乱时刻:打开好几个终端窗口,翻看一堆日志文件,才能勉强搞清楚…...

零基础学日语,我用这510个单词搞定《标日初级》前12课(附分类记忆法)

零基础日语入门:510个高频词构建《标日初级》12课完整记忆网络 站在东京涩谷的十字路口,耳边此起彼伏的日语对话让刚落地的新手学习者感到既兴奋又焦虑。当我翻开《标准日本语》前12课,面对510个陌生单词时,传统按课背诵的方法让我…...

ARM CP15协处理器与DMA控制架构深度解析

1. ARM CP15协处理器与DMA控制架构解析在ARMv6架构的嵌入式系统中,CP15协处理器扮演着系统控制核心角色,其寄存器组管理着内存保护、缓存操作以及DMA传输等关键功能。以ARM1136JF-S为例,c11寄存器组专门负责两级DMA控制,通过硬件加…...

FPGA设计避坑指南:手把手教你搞定跨时钟域信号处理(附Verilog代码)

FPGA设计避坑指南:手把手教你搞定跨时钟域信号处理(附Verilog代码) 在数字电路设计中,跨时钟域(CDC)问题就像一颗定时炸弹,随时可能让你的系统陷入混乱。想象一下这样的场景:你精心设…...

老司机翻车记:双路E5+PVE7.0直通GTX1060,我踩过的那些坑和最终解法

双路E5平台PVE7.0显卡直通实战:从错误码43到完美驱动的深度排错指南 当你在双路E5服务器上尝试将GTX1060直通给PVE7.0虚拟机时,可能会遇到一系列令人抓狂的问题——黑屏、错误码43、分辨率异常、光标闪烁...这些问题往往让中高级用户也束手无策。本文不是…...

AI任务分解与执行框架:从原理到实战构建智能工作流引擎

1. 项目概述与核心价值最近在折腾AI应用开发的朋友,估计都绕不开一个核心痛点:如何让一个AI模型,比如ChatGPT,真正理解并执行复杂的、多步骤的任务?我们常常遇到的情况是,你给AI一个指令,它可能…...

Auralith程序化音频引擎:实时动态声音生成与游戏集成实战

1. 项目概述:Auralith是什么,以及它为何值得关注如果你是一名独立游戏开发者,或者对游戏音频设计有浓厚兴趣,那么“Auralith”这个名字很可能已经出现在你的雷达上。这是一个由开发者“smouj”在GitHub上开源的项目,它…...

WiFi 6智能管理:从OFDMA、TWT到云端优化,解决家庭网络拥堵实战

1. WiFi 6的潜力与隐忧:为什么“智能”比“更快”更重要 WiFi 6终于走进了千家万户。铺天盖地的宣传都在告诉你,它能带来飞一般的网速、更低的延迟,以及同时连接海量设备的能力。从技术规格上看,这无疑是无线网络的一次巨大飞跃。…...

Socket.IO-objc性能优化指南:减少延迟、节省流量的7个策略

Socket.IO-objc性能优化指南:减少延迟、节省流量的7个策略 【免费下载链接】socket.IO-objc socket.io v0.7.2 — 0.9.x for iOS and OS X 项目地址: https://gitcode.com/gh_mirrors/so/socket.IO-objc Socket.IO-objc是一款为iOS和OS X平台打造的Socket.IO…...

SpecVibe项目复盘:基于规格驱动与智能体技能框架的AI辅助开发实践

1. 项目概述与核心价值最近在整理过往的代码仓库时,我重新审视了“SpecVibe”这个项目。它是我在2022年10月至2023年1月期间,参与一个名为“Lithium”的后端开发训练营时完成的核心作业。这个项目远不止是一份简单的作业提交,它是我个人对于“…...

UnityMeshSimplifier自定义扩展:如何编写自己的简化算法

UnityMeshSimplifier自定义扩展:如何编写自己的简化算法 【免费下载链接】UnityMeshSimplifier Mesh simplification for Unity. 项目地址: https://gitcode.com/gh_mirrors/un/UnityMeshSimplifier UnityMeshSimplifier是一款强大的Unity网格简化工具&#…...

Godot游戏引擎集成MCP协议:AI智能体辅助开发实战指南

1. 项目概述:当游戏引擎遇见AI智能体如果你是一位游戏开发者,或者对AI应用开发感兴趣,最近可能已经感受到了一个趋势:AI智能体(Agent)正在从云端走向本地,从通用走向垂直。而游戏开发&#xff0…...

programmer-book部署指南:快速搭建个人技术文档网站

programmer-book部署指南:快速搭建个人技术文档网站 【免费下载链接】programmer-book 公众号:普通程序员 项目地址: https://gitcode.com/gh_mirrors/pr/programmer-book programmer-book是一个面向普通程序员的技术文档项目,通过简单…...