Linux 下 I2C 设备驱动开发和实现
2008-04-18 嵌入式在线 收藏 | 打印
I2C 总线具有结构简单使用方便的特点。本文描述了 linux 下 I2C 驱动的结构,并在此
基础上给出了 I2C 设备驱动和应用的实现。
1 引言
I2C (Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,
用于连接微控制器及其外围设备。I2C 总线最主要的优点是其简单性和有效性。由于接口
直接在组件之上,因此 I2C 总线占用的空间非常小,减少了电路板的空间和芯片管脚的数
量,降低了互联成本。I2C 总线最初为音频和视频设备开发,现已应用于各种服务与管理
场合,来实现配置或掌握组件的功能状态,如电源、系统风扇、系统温度等参数,增加了
系统的安全性,方便了管理。
2 I2C 总线概述
I2C 总线是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据,每个
器件都有一个惟一的地址识别。I2C 规程运用主/从双向通讯。器件发送数据到总线上,则
定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送
状态。总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总
线的传输方向,并产生起始和停止条件。SDA 线上的数据状态仅在 SCL 为低电平的期间
才能改变,SCL 为高电平的期间,SDA 状态的改变被用来表示起始和停止条件。
I2C 总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号
和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为低电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电
平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答
信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应
答信号,由判断为受控单元出现故障。
3 Linux 的 I2C 驱动架
Linux 中 I2C 总线的驱动分为两个部分,总线驱动(BUS)和设备驱动
(DEVICE)。其中总线驱动的职责,是为系统中每个 I2C 总线增加相应的读写方法。但
是总线驱动本身并不会进行任何的通讯,它只是存在那里,等待设备驱动调用其函数,参
见图 1。
设备驱动则是与挂在 I2C 总线上的具体的设备通讯的驱动。通过 I2C 总线驱动提供
的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。