1. IIC子系统基础概念解析
IIC(Inter-Integrated Circuit)总线是由飞利浦公司(现恩智浦半导体)在1980年代开发的一种同步、多主从、串行通信总线标准。在现代嵌入式系统中,IIC因其简单的两线制结构和灵活的多设备连接能力,成为传感器、EEPROM、RTC等低速外设的首选通信接口。
IIC子系统在Linux内核中的实现包含三个关键层次:
- 核心层(I2C Core):提供总线注册/注销、设备探测、消息传输等基础框架
- 适配器层(I2C Adapter):实现具体SoC的I2C控制器驱动
- 设备驱动层(I2C Driver):针对特定I2C从设备的驱动实现
关键特性:标准模式下传输速率100kbps,快速模式400kbps,高速模式3.4Mbps。采用7位或10位地址编码,支持同一总线上连接多达112个设备(7位地址时)。
2. IIC协议深度剖析
2.1 电气特性与信号定义
IIC总线仅需两根线:
- SCL(Serial Clock):时钟线,由主设备产生
- SDA(Serial Data):双向数据线
采用开漏输出设计,需外接上拉电阻(典型值4.7kΩ)。总线空闲时两根线均为高电平,通过"线与"逻辑实现多主仲裁。
2.2 通信时序详解
完整传输包含:
- 起始条件(START):SCL高电平时SDA由高变低
- 地址帧:7/10位设备地址 + 1位读写标志(0写/1读)
- 数据帧:8位数据 + 1位ACK/NACK
- 停止条件(STOP):SCL高电平时SDA由低变高
c复制// 典型I2C传输序列示例
[start][addr+w][ack][reg][ack][data][ack][stop]
常见问题:当从机地址错误时,总线会持续等待ACK导致超时。解决方法是在驱动中添加超时检测机制,如STM32 HAL库中的HAL_I2C_IsDeviceReady()函数。
3. Linux IIC子系统驱动开发
3.1 适配器驱动实现
以STM32为例,需要实现以下关键操作:
c复制static const struct i2c_algorithm stm32_i2c_algo = {
.mas
