1. I2C总线基础概念解析
I2C(Inter-Integrated Circuit)总线是飞利浦半导体(现恩智浦)在1980年代开发的一种同步、多主从、串行通信总线标准。作为嵌入式系统中最常用的通信协议之一,I2C以其简洁的两线制结构(SDA数据线和SCL时钟线)和灵活的寻址方式著称。
在实际项目中,I2C总线主要应用于以下典型场景:
- 传感器数据采集(如温度、湿度、加速度传感器)
- EEPROM存储器读写
- 实时时钟(RTC)模块通信
- 数字信号处理器与微控制器间的数据交换
与SPI总线相比,I2C的最大优势在于节省引脚资源——多个从设备可以共享同一组总线,仅通过7位或10位地址区分。但相应地,其传输速率通常较低(标准模式100kbps,快速模式400kbps,高速模式3.4Mbps)。
注意:I2C总线采用开漏输出结构,必须外接上拉电阻(典型值4.7kΩ),这是许多初学者容易忽略的关键细节。
2. Linux内核中的I2C子系统架构
Linux内核的I2C子系统采用分层设计,主要包含以下核心组件:
2.1 I2C核心层
作为子系统的中枢,提供总线注册/注销、设备匹配、消息传输等基础服务。关键数据结构包括:
i2c_adapter:抽象物理I2C控制器i2c_msg:描述单次传输的消息单元i2c_algorithm:定义控制器底层操作
2.2 I2C总线驱动
负责具体SoC的I2C控制器驱动实现,需要完成:
- 寄存器级操作(启动/停止条件生成、时钟控制等)
- 中断处理
- DMA传输配置(如有)
例如,i2c-imx.c就是针对NXP i.MX系列处理器的总线驱动。
2.3 I2C设备驱动
实现特定从设备的功能逻辑,如:
- 传感器数据解析(i2c-dev)
- EEPROM读写(at24驱动)
- 触摸屏控制(ft5x06驱动)
典型设备驱动开发流程:
- 定义
i2c_driver结构体 - 实现probe/remove等回调
- 注册设备操作函数集(file_operations)
- 通过sysfs或ioctl暴露用户接口
3. I2C设备驱动开发实战
3.1 环境准备与硬件连接
以常见的MPU6050六轴传感器为例,硬件连接
