Chinaunix首页 | 论坛 | 博客
  • 博客访问: 522861
  • 博文数量: 114
  • 博客积分: 271
  • 博客等级: 二等列兵
  • 技术积分: 733
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-24 13:40
文章分类
文章存档

2014年(5)

2013年(14)

2012年(95)

分类:

2012-07-03 16:58:04

1 I2C总线简介

I2C (Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线最主要的优点就是简单性和有效性。

1.1 I2C总线工作原理

I2C总线是由数据线SDA和时钟SCL构成的串行总线,各种被控制器件均并联在这条总线上,每个器件都有一个唯一的地址识别,可以作为总线上的一个发送器件或接收器件(具体由器件的功能决定)I2C总线的接口电路结构如图1所示。

1.2 I2C总线的几种信号状态

1.空闲状态:SDASCL都为高电平。

2.开始条件(S):SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

3.结束条件(P):SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。

4.数据有效:SCL的高电平期间,SDA保持稳定,数据有效。SDA的改变只能发生在SCL的底电平期间。

5.ACK信号:数据传输的过程中,接收器件每接收一个字节数据要产生一个ACK信号,向发送器件发出特定的低电平脉冲,表示已经收到数据。

1.3 I2C总线基本操作

I2C总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL),同时控制总线的传输方向,并产生开始和停止条件。

数据传输中,首先主器件产生开始条件,随后是器件的控制字节(前七位是从器件的地址,最后一位为读写位)。接下来是读写操作的数据,以及ACK响应信号。数据传输结束时,主器件产生停止条件。具体的过程如图2所示。

2 LinuxI2C驱动程序的分析

2.1 Linux系统I2C驱动的层次结构

Linux系统对I2C设备具有很好的支持,Linux系统下的I2C驱动程序从逻辑上可以分为3个部分:

1.I2C总线的驱动I2C core:实现对I2C总线、I2CadapterI2C driver的管理。

2.I2C控制器的驱动I2C adapter:针对不同类型的I2C控制器,实现对I2C总线访问的具体方法。

3.I2C设备的驱动I2C driver:针对特定的I2C设备,实现具体的功能,包括read,write以及ioctl等对用户层操作的接口。

这三个部分的层次关系如图3和图4所示。

2.2 I2C总线驱动I2C core

I2C coreLinux内核用来维护和管理的I2C的核心部分,其中维护了两个静态的List,分别记录系统中的I2C driver结构和I2C adapter结构。I2C core提供接口函数,允许一个I2C adatper,I2C driverI2C client初始化时在I2C core中进行注册,以及退出时进行注销。同时还提供了I2C总线读写访问的一般接口(具体的实现在与I2C控制器相关的I2C adapter中实现),主要应用在I2C设备驱动中。

2.3 I2C控制器的驱动I2C adapter

I2C adapter是针对不同类型I2C控制器硬件,实现比较底层的对I2C总线访问的具体方法。I2C adapter构造一个对I2C core层接口的数据结构,并通过接口函数向I2C core注册一个控制器。

I2C adapter主要实现对I2C总线访问的算法,i-ic_xfer()函数就是I2C adapter底层对I2C总线读写方法的实现。同时I2C adpter中还实现了对I2C控制器中断的处理函数。

2.4 I2C设备的驱动I2C driver

I2C driver中提供了一个通用的I2C设备的驱动程序,实现了字符类型设备的访问接口,对设备的具体访问是通过I2C adapter来实现的。I2C driver构造一个对I2C core层接口的数据结构,通过接口函数向I2CCore注册一个I2C设备驱动。同时I2C driver构造一个对用户层接口的数据结构,并通过接口函数向内核注册为一个主设备号为89的字符类型设备。

I2C driver实现用户层对I2C设备的访问,包括open,read,write,ioctl,release等常规文件操作,我们可以通过open函数打开I2C的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过readwrite函数完成对I2C设备的读写操作。

通过I2C driver提供的通用方法可以访问任何一个I2C的设备,但是其中实现的read,writeioctl等功能完全是基于一般设备的实现,所有的操作数据都是基于字节流,没有明确的格式和意义。为了更方便和有效地使用I2C设备,我们可以为一个具体的I2C设备开发特定的I2C设备驱动程序,在驱动中完成对特定的数据格式的解释以及实现一些专用的功能。

阅读(547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~