[特殊字符] 驱动开发硬核特训 · Day 4

Linux 与 ZXISOS 驱动开发架构对比 本文对比了Linux与ZXISOS在驱动开发架构上的核心差异,基于PPCP2020与i.MX8QM平台源码分析。关键区别包括:硬件描述上,Linux采用设备树动态匹配,而ZXISOS通过board_init.c硬编码;内存管理方面,Linux使用虚拟地址映射(ioremap),ZXISOS则采用恒等映射直接访问寄存器;驱动框架上,Linux依赖VFS与子系统,ZXISOS仅用drvlib六回调统一接口;注册机制上,Linux由probe自动匹配,ZXISOS需user_drv_init手动安装;应用调用中, 阅读详情

主题:从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析

I2C(Inter-Integrated Circuit)总线是一种广泛用于嵌入式设备的串行通信协议,因其低成本、简单布线和多从设备支持,成为连接各种传感器(温湿度、加速度计、压力等)、EEPROM、IO 扩展器的首选方案。

本期内容围绕 I2C 协议原理、SoC 控制器设计、Linux I2C 驱动框架、自定义传感器驱动开发及调试技巧展开。重点聚焦 I2C 控制流程、寄存器操作、中断与轮询模式、设备树配置、驱动 API 与适配实例,帮助你从硬件协议出发全面掌握 I2C 驱动能力。


在这里插入图片描述

🎯 本期特训结构

模块内容概览
I2C 总线原理硬件结构、通信协议、信号时序、主从机制
控制器架构SoC 中 I2C 控制器模块的工作流程与寄存器解释
Linux 驱动框架I2C adapter 与 client 机制、核心 API 解析
设备树配置reg、compatible、clock、scl-gpios、interrupts 等
驱动编写流程编写 platform 驱动适配某一具体 I2C 传感器(如 BH1750、MPU6050)
实战平台案例基于 i.MX6ULL + BH1750 光照传感器完整驱动开发
常见问题与调试设备不响应、时序错误、ACK 失败、挂载失败

📘 Part 1:I2C 协议与硬件原理

✅ 1. I2C 总线基础结构
  • 两条信号线:SCL(时钟)与 SDA(数据)
  • 多主多从机制:唯一地址分配,支持多个从设备
  • 开漏结构:需外接上拉电阻
  • 传输单位:以字节(8bit)为单位,附带 1bit ACK
✅ 2. I2C 通信流程
  1. 主机发送 START 信号(SDA 下降沿,SCL 高)
  2. 发送 7 位从设备地址 + 1 位 R/W 位
  3. 从机返回 ACK(拉低 SDA)
  4. 主机读写数据,期间每字节都需从机 ACK
  5. 主机发送 STOP 信号(SDA 上升沿,SCL 高)
✅ 3. 波形时序图解
START   Address   ACK   Data   ACK   ...   STOP
 |         |       |     |     |           |
↓SDA     7+1bit  ← 1bit  8bit  ← 1bit    ↑SDA

📘 Part 2:I2C 控制器硬件结构分析(以 i.MX6ULL 为例)

✅ 1. 控制器模块说明

i.MX6ULL SoC 内部包含多个 I2C 控制器(I2C1 ~ I2C4),每个控制器控制一条独立 I2C 总线。

  • 基地址示例:
    • I2C1:0x021A0000
    • I2C2:0x021A4000

主要寄存器:

寄存器名功能
I2C_I2CR控制寄存器(使能、主从、发起 START)
I2C_I2SR状态寄存器(是否忙、ACK 等)
I2C_IADR从设备地址寄存器(用于 slave 模式)
I2C_I2DR数据寄存器(收发数据)
I2C_IFDR时钟分频器设置
✅ 2. 控制流程关键点
  • 设置 I2C_I2CR 的 MST 和 TX 位,发起 START
  • 写入地址字节,等待中断或轮询 ACK
  • 写数据或读数据,操作 I2C_I2DR
  • 结束后清除中断,发 STOP 信号

📘 Part 3:Linux I2C 驱动框架

✅ 1. I2C adapter 与 client
  • struct i2c_adapter:表示一个 I2C 控制器
  • struct i2c_client:表示连接在 adapter 上的某个 I2C 外设

I2C 驱动注册流程:

  1. 控制器驱动注册 i2c_adapter(如 i2c-imx)
  2. 设备树声明某个 i2c 从设备节点(如 bh1750@23)
  3. 匹配 compatible,调用 i2c_driver.probe()
  4. 在 probe 中获取 i2c_client,使用 i2c_smbus_*() 或 i2c_transfer() 进行通信
✅ 2. 核心通信 API
int i2c_smbus_read_byte_data(struct i2c_client *client, u8 reg);
int i2c_smbus_write_byte_data(struct i2c_client *client, u8 reg, u8 val);
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);

📘 Part 4:设备树中的 I2C 配置

✅ 1. 控制器节点
&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";
};
✅ 2. 从设备节点
bh1750@23 {
    compatible = "rohm,bh1750";
    reg = <0x23>;
};

属性说明:

属性说明
regI2C 地址(7bit)
compatible与驱动绑定的标识
clock-frequencyI2C 速率(100k/400k)

📘 Part 5:BH1750 光照传感器驱动开发

✅ 1. 芯片说明
  • I2C 地址:0x23 或 0x5C
  • 单指令启动模式,输出 16bit 光照值(Lux)
  • 通信流程:写启动命令 → 读 2 字节数据
✅ 2. 驱动核心结构
static int bh1750_probe(struct i2c_client *client, const struct i2c_device_id *id) {
    int ret;
    u8 cmd = 0x10; // Continuously H-Resolution Mode
    ret = i2c_smbus_write_byte(client, cmd);
    if (ret < 0) return ret;
    msleep(180); // 等待数据稳定
    ret = i2c_smbus_read_word_data(client, 0x00);
    printk("Light = %d lux\n", be16_to_cpu(ret));
    return 0;
}

📘 Part 6:平台实战案例 —— i.MX6ULL + BH1750

✅ 硬件连接说明
  • SCL → I2C1_SCL(对应 GPIO1_IO16)
  • SDA → I2C1_SDA(对应 GPIO1_IO17)
  • 外接上拉电阻 4.7kΩ 至 3.3V
✅ 步骤概览
  1. 修改设备树,添加 bh1750@23 节点
  2. 编译设备树、内核并部署至开发板
  3. 编写驱动模块,注册 i2c_driver
  4. 加载驱动后通过 dmesg 打印光照值

🧪 常见问题与调试技巧

问题可能原因
I2C 无法通信未上拉、设备地址错误、频率不兼容
probe 不触发compatible 不匹配、reg 地址错误
读取数据不正常没有正确发送启动命令或读取顺序错误
总线异常挂死多主冲突或时序误配置

调试建议:

  • 使用示波器观察 SDA/SCL 波形
  • 使用 i2cdetect -y 1 查看设备是否存在
  • 加 log 追踪通信过程

🧠 本日知识点总结

分类核心内容
I2C 协议原理START/STOP、地址位、ACK 时序
控制器结构I2C_I2CR、I2DR、IFDR 配置与流程
驱动框架i2c_adapter、i2c_client、i2c_driver 机制
设备树配置clock-frequency、reg、compatible、pinctrl
驱动开发读写流程、smbus API 使用、i2c_transfer 应用
调试技巧i2cdetect 工具使用、log 跟踪、SDA/SCL 波形分析

✅ 总结

I2C 总线看似简单,实则涵盖了从硬件时序控制、控制器寄存器配置、协议状态转换,到 Linux 驱动注册、通信 API 使用、设备树适配的完整驱动开发链路。掌握 I2C 驱动不仅有助于理解嵌入式外设通信机制,也为后续复杂协议(如 SPI、MIPI、USB)打下坚实基础。

📘 Day 5 预告:输入子系统详解 + gpio-keys 与键盘矩阵驱动开发实战

敬请持续关注,每日精讲一类驱动,从硬件到驱动,让理解变成能力。

PLC批量读写优化:C# Modbus TCP多寄存器批量操作(效率提升50%) 效率提升:请求次数减少90%以上,通信耗时降低50%-95%;资源节约:减少网络带宽占用和PLC/上位机CPU负载;稳定性提升:更少的请求意味着更少的通信异常;适配高频采集:满足工业现场100ms/次的高频率数据采集需求。工业落地时需注意:批量操作的核心是地址连续化规划,提前与PLC工程师协同规划寄存器地址,是优化的前提;同时需配合重试、校验机制,确保批量操作的可靠性。 阅读详情

相关推荐

【电机控制入门】——电机控制书籍推荐

电机控制入门书籍推荐及分享 阅读须知: 1.电机控制的入门是涉及到机械、电子与控制等复杂交叉学习,它需要持续投入时间才可以看到学习的效果,如同“一万小时定律”。俗话说,九层之台,起于垒土,因此电机控制入门没有所谓的速成培训班。相反,还需要夯实好一定的基础。为此,博主建议从基础理论抓起,故推荐相关的书籍并分享给大家。 2.学习电机贵在动手实践,无论是借助于MATLAB/Simulink仿真平台来验证理论分析,或是使用板子对所设计的控制系统进行物理实现,博主极力推荐在一定基础(看完部分以下推荐的书籍),一边动手

昔时扬尘处 3万+

[特殊字符] 驱动开发硬核特训 · Day 2

本篇通过结构化知识梳理与重点模块讲解,系统呈现 UART 与 SPI 驱动开发全流程。无论是波特率配置、中断处理,还是 SPI 总线协议控制与多设备支持,都提供了可复用的工程实践路径。📘 Day 3 预告:设备树进阶使用技巧 + 中断子系统剖析 + 多外设资源管理欢迎持续关注本系列内容,助你构建稳定、高效、可维护的驱动开发能力体系。

Interview_TC的博客 1157

高级Salesforce开发面试题

自定义设置允许您创建自定义数据集,以及为组织、配置文件或特定用户创建和关联自定义数据。自定义元数据类似于自定义设置,但是自定义元数据类型中的记录被视为元数据而不是数据。自定义设置有列表和层次自定义设置两种。自定义元数据中没有此类类型。此外,自定义元数据不支持基于用户配置文件或特定用户的层次结构类型的数据。自定义设置现在不再支持关系字段。但您可以在自定义元数据对象之间创建查找。元数据查询不占用查询sql次数的限制。

weixin_45663522的博客 1237

[特殊字符] 驱动开发硬核特训 · Day 5 - 深入解析 Platform Driver 驱动框架

Platform Driver 是 Linux 内核中用于管理“平台设备”的驱动框架。那些无法通过标准总线(如 PCI 或 USB)自动识别的固定连接外设。是 SoC(系统级芯片)内部集成的硬件模块,如 UART、GPIO、I2C 控制器;或通过固定方式连接在主控的管脚上,如 LED、按键、蜂鸣器、电源管理芯片 PMIC 等;没有专门的总线控制器进行自动枚举,需开发者主动在设备树中声明其存在。驱动专注实现控制逻辑,而设备信息由设备树提供,二者通过内核的 platform 总线完成匹配与绑定。

Interview_TC的博客 929

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 495

Cursor赋能Qt C++:从环境配置到项目构建的AI开发新范式

本文详细介绍了如何利用Cursor工具链提升Qt C++开发效率,从智能环境配置到CMake项目构建的全流程实践。通过AI辅助编程、Qt生态优化及高级调试技巧,开发者可快速完成从传统开发到AI驱动的新范式转换,显著缩短项目搭建时间并提升代码质量。

weixin_30329623的博客 546

[特殊字符] 驱动开发硬核特训 · Day 3 —— GPIO 子系统与中断机制全解析

GPIO(General Purpose Input/Output)指可配置为输入或输出的引脚,用于与外部器件进行简单逻辑通信。输入模式:用于读取外部状态,如按键、传感器信号等;输出模式:用于控制设备,如点亮 LED、复位模块、触发外部器件;高阻状态(Hi-Z):在未配置为输入或输出时处于断开状态,不影响总线信号。return 0;分类核心内容硬件原理GPIO 输入/输出/高阻、边沿检测、电气属性控制器结构GPIOx_DR、GDIR、IMR、ISR 等寄存器详解。

Interview_TC的博客 1334

【STM32】基于STM32F103C8T6实现步进电机精准调速控制

本文详细介绍了如何使用STM32F103C8T6微控制器实现步进电机的精准调速控制。通过利用其内置定时器生成PWM脉冲,替代低效的延时方法,并结合TB6600驱动器进行硬件连接,可实现平滑、高效的电机速度控制。文章提供了基于HAL库的代码实战,包括速度与方向设置函数,并探讨了加减速规划等高级应用,帮助开发者彻底掌握步进电机驱动技术。

weixin_29169899的博客 483

指纹识别传感器驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述在RK3568平台使用私有二进制协议指纹模组的调试要点:以亮灯确认通信为首要步骤,波特率固定为57600,通过tcflush(TCIFLUSH)清除缓冲避免旧应答干扰;严格按“连接→亮灯→录入→比对”顺序操作,依赖包头F11FE22E锚定帧,校验标记与状态(成功为0E,0F为已存在);以灯亮为准选择正确TTY(如ttyS8非ttyS7),禁用CRTSCTS,应用层采用异步poll机制,避免误判。强调硬件层面断电重连、权限配置及单路排针原则,确保通信稳定可靠。

wanwuzhineng_01的博客 345

机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

现在,我们将进入到机器学习的核心部分——算法原理。在本篇文章中,我们将详细探讨各种机器学习算法的原理、优缺点和适用场景。

a871923942的博客 2965

【Python计量】linearmodels面板数据回归(一)

我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。

mfsdmlove的博客 9275

芯参谋(93):Zephyr_驱动开发指南

本文为面向Cortex-M/RISC-V平台的Zephyr存储驱动移植指南,聚焦binding YAML、设备模型、SPI/I2C/UART/GPIO、Flash/MTD、NAND坏块管理、SDMMC/eMMC、文件系统(LittleFS/FatFs)、NVS/ZMS、电源管理与ISR-DMA并发安全。核心理念:驱动骨架由“binding声明硬件契约、Kconfig声明依赖、设备模型定义初始化顺序”三者构建,其余为厂商时序差异。重点指出四大高频问题:compatible与DTS不匹配、初始化等级错误导致de

qq520131714的专栏 575

Open3D 读取、保存、显示点云【2025最新版】

paint_uniform_color给所有的点上一个统一的颜色。博客长期更新,本文最近更新时间为:2025年1月1日。

点云侠的博客 37万+

芯参谋(83):AliOS Things_驱动开发指南

本指南针对AliOSThings驱动开发中的核心痛点,系统梳理了从硬件配置到组件交付的全流程。聚焦“初始化顺序”“分级加载”“CSI隔离”“VFS挂载”等关键问题,提供可照搬的八步开发流程、骨架代码与核查清单。通过明确驱动类型选择、组件化管理、板级静态配置(无DTS)及内核态/用户态运行模式,解决“驱动不注册”“open失败”“偶发死机”等典型难题。配套模板与实战案例,确保驱动可复现、可维护、可裁剪,适用于V3.x弹性微内核平台,助力开发者高效完成稳定可靠的外设驱动开发。

qq520131714的专栏 470

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kiro 详解:Spec 驱动开发、Steering、Hooks 与 AI 编程实践

代码生成;Bug 修复;单元测试;项目重构;SQL 编写;接口设计;代码解释;技术文档生成。帮我增加一个用户登录接口。AI 很快就能生成代码。AI 对业务需求理解不完整;不同对话中的技术方案不一致;开发过程中不断遗忘早期约束;生成的代码不符合项目规范;复杂功能缺少完整设计;需求、任务和代码之间无法追踪;修改范围越来越难以控制;功能完成后无法判断是否满足验收条件。Kiro 提供了一种更结构化的 AI 开发方式。Specs;Steering;

十二的博客 143

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring AI开发从入门到实践-人工智能发展与开发范式变革

人工智能历经符号主义、机器学习到生成式AI三阶段演进,当前以大语言模型(LLM)为核心的生成式AI正推动开发范式变革。传统“规则驱动”开发转向“数据+模型驱动”的AI驱动开发,显著提升效率与场景适应性。Spring AI作为Java生态的AI框架,助力开发者低门槛集成LLM能力,实现传统系统与智能应用的融合,开启“AI+开发”新范式。

老卫的技术站 255

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【正点原子Linux连载】 第十三章 Linux按键输入实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

本章我们实现按键输入,在驱动程序中使用一个整形变量来表示按键值,应用程序通过read函数来读取按键值,判断按键有没有按下。也就是模拟按键按下,GPIO3_C5为高电平,松开按键为低电平。注意,本章例程只是为了演示Linux下GPIO输入驱动的编写,实际中的按键驱动并不会采用本章中所讲解的方法,Linux下的input子系统专门用于输入设备!第120~131行,key_open函数通过调用keyio_init函数来始化按键所使用的IO,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。

weixin_55796564的博客 156

Go 工程化实践:命令行工具、日志收集与 Prometheus 监控告警客户端

import ("net/http"var (Help: "HTTP 请求总数",},Help: "HTTP 请求耗时分布",},Help: "采集队列当前长度",},本文用 Cobra 搭建了可扩展的命令行入口,用 zap + 异步采集器实现了结构化日志收集,用 Prometheus 客户端完成了指标暴露与告警规则配置。三者组合后,一个 Go 服务就具备了基本的可观测性与运维能力。

qq_42773521的博客 198

芯参谋(87):Linux 系统(SPI NOR)驱动开发指南

本文为Linux系统下SPINOR驱动开发的完整指南,覆盖从内核配置、设备树与分区设计、4字节地址适配到测试调试与量产运维的全流程。重点解决大容量器件(>128Mbit)必须启用4字节地址的问题,提供三种实现方案及可复用代码。强调设备树、分区表、内核命令行三处一致性,规范驱动调试方法,明确“写对设备树即完成80%工作”的核心原则。适用于XTX、Winbond、GigaDevice等主流厂商器件,兼容主线内核5.10至6.12版本,配套硬件设计与软件规范文档,助力高效稳定开发。

qq520131714的专栏 569

语音识别模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述了在RK3568平台使用ASR语音模组的串口通信调试过程,重点解决识别帧(A5FC...FB)无法接收的问题。核心要点包括:正确配置/dev/ttyS7@115200波特率,确保模组供电与麦克风拾音;必须先唤醒后发命令,以出厂词为准;解析帧时需确认data[4]=0xA0、data[5]=0x91,再提取动作码(02开灯、03关灯、04播音、05停);避免与其他模块共用排针导致短路或干扰;使用hex模式读取,防止文本模式误吞0xA5;通过poll+CO_NONBLOCK实现非阻塞监听,确保帧完整捕获

wanwuzhineng_01的博客 352

GitHub Spec Kit 详解:规范驱动开发、AI 编码工作流与项目实践

本文介绍 GitHub Spec Kit 如何通过规范驱动开发(SDD)解决 AI 编码中需求模糊、上下文丢失、技术不一致等问题。它通过 spec.md、plan.md、tasks.md 等结构化文件,建立从需求到代码的可追溯链,确保 AI 生成代码与原始目标收敛。工具提供 CLI 命令、模板与质量检查机制,支持与 Copilot 等 AI 工具集成,适用于复杂项目管理。但需注意其非自动化、非替代项目管理工具,强调人工审查与适度规范。

十二的博客 291

芯参谋(91):RT-Thread_驱动开发指南

RT-Thread驱动开发的核心在于将硬件对象抽象为符合内核规范的rt_device,而非直接操作寄存器。本指南通过“选框架→定路线→填ops→接中断→交付核查”五步法,系统梳理了驱动开发中的关键决策点与常见陷阱,如初始化时机、中断上下文限制、设备名冲突等,并提供可编译骨架代码与核查清单,确保驱动具备高可移植性与稳定性。

qq520131714的专栏 594

SDD,BDD和TDD

‌SDD、TDD和BDD是三种不同的软件开发方法论,核心区别在于“驱动”的起点和关注层次不同。‌ TDD以测试用例驱动代码实现,BDD以业务行为场景驱动开发,而SDD则以规格说明作为单一事实来源,覆盖从需求到实现的全程对齐。

liuqi332922337的专栏 213

OpenCode v2 GitLab 集成实战:Issue 驱动开发、MR 审查与 CI/CD 最小权限

从普通 GitLab CI 与 GitLab Duo 两条路线出发,完整搭建 OpenCode 的 Issue 分析、自动修复、Merge Request 创建与审查工作流,并系统讲解 Runner 隔离、变量保护、最小权限、分支保护、审计与故障恢复。

jerry764的博客 365

Linux入门第二部分(ARM裸机篇) 第六章 驱动开发

本文基于正点原子I.MX6U裸机开发教程,介绍ARM(MX6U)外设寄存器的封装与配置方法。通过定义外设寄存器组结构体、基地址及访问指针,实现对IOMUX、CCM、GPIO等外设的高效操作。结合start.s启动文件完成C环境初始化,编写clk_enable、led_init等函数配置时钟与LED引脚,并在main.c中实现LED闪烁功能。最终通过Makefile编译并使用imxdownload烧写至SD卡,完成开发板验证。

Zevalin的博客 429

芯参谋(85):Linux_PPI_NAND_驱动开发指南

本文系统解析并口NAND(PPINAND)在Linux下的三条驱动路线:优先使用SoC原生NFC控制器(路线A),其次采用主线gpio-control-nand(路线B),仅当二者不可行时才自研nand_controller(路线C)。强调PPINAND不提供标准块设备,需通过MTD框架暴露/dev/mtd0,且与SPINAND命令编码、坏块标记位置等关键差异不可混用。核心主张是“先走现成路径,避免盲目自研”,因自研涉及DMA、并发、掉电保护等复杂问题,工作量达600~2000行代码,代价远超预期。附详细设

qq520131714的专栏 552
上一篇: [特殊字符] 驱动开发硬核特训 · Day 3 —— GPIO 子系统与中断机制全解析
下一篇: 原来 C++ 这么简单:每日十题轻松学 (Day 7 CRTP 与类型萃取篇)
嵌入式孙老师
博客等级 码龄7年 5686粉丝 898原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值