I2C总线

原创 2011年01月16日 00:02:00

 。本文描述了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总线驱动提供的函数,设备驱动可以忽略不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。

 

 

图1  Linux内核I2C总线驱动程序构架

  在我们的Linux驱动的i2c文件夹下有algos,busses,chips三个文件夹,另外还有i2c-core.c和i2c-dev.c两个文件。其中i2c-core.c文件实现了I2C core框架,是Linux内核用来维护和管理的I2C的核心部分,其中维护了两个静态的List,分别记录系统中的I2C driver结构和I2C adapter结构。I2C core提供接口函数,允许一个I2C adatper,I2C driver和I2C client初始化时在I2C core中进行注册,以及退出时进行注销。同时还提供了I2C总线读写访问的一般接口,主要应用在I2C设备驱动中。

  Busses文件夹下的i2c-mpc.c文件实现了PowerPC下I2C总线适配器驱动,定义描述了具体的I2C总线适配器的i2c_adapter数据结构,实现比较底层的对I2C总线访问的具体方法。I2C adapter 构造一个对I2C core层接口的数据结构,并通过接口函数向I2C core注册一个控制器。I2C adapter主要实现对I2C总线访问的算法,iic_xfer() 函数就是I2C adapter底层对I2C总线读写方法的实现。同时I2C adpter 中还实现了对I2C控制器中断的处理函数。

  i2c-dev.c文件中实现了I2C  driver,提供了一个通用的I2C设备的驱动程序,实现了字符类型设备的访问接口,实现了对用户应用层的接口,提供用户程序访问I2C设备的接口,包括实现open,release,read,write以及最重要的ioctl等标准文件操作的接口函数。我们可以通过open函数打开 I2C的设备文件,通过ioctl函数设定要访问从设备的地址,然后就可以通过 read和write函数完成对I2C设备的读写操作。

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

本篇文章来自<A href='http://www.soidc.net'>IDC专家网</a> 原文链接:http://www.soidc.net/articles/1215484977397/20100409/1215945713087_1.html

简单介绍I2C总线

第7章  I2C 总线简介 ZLG7290B与微控制器的接口形式是I2C串行总线,因此有必要简要地介绍一下I2C总线协议标准。第8章还给出了用C51编写的I2C总线软件包,以供参考学习。 7.1 I2...
  • junyeer
  • junyeer
  • 2015年06月13日 16:51
  • 4721

I2C总线和SPI总线

I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输(字节高位先传),每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一...
  • u010667082
  • u010667082
  • 2015年07月24日 13:37
  • 990

和菜鸟一起学linux总线驱动之i2c死锁问题

不知不觉中已经有好几个月没有写点东西了,懒了就是懒了,说是忙着想把产品做得更好,都是借口,每天花一点时间来写点东西确实很不错,自己也坚持了很久很久,只不过今年以来,发现提高不是很大,能写的东西好少好少...
  • eastmoon502136
  • eastmoon502136
  • 2014年07月01日 14:02
  • 3118

I2C总线深入理解

时钟同步       总线仲裁 一、 I2C总线定义     I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制...
  • u012497906
  • u012497906
  • 2015年08月18日 18:13
  • 1635

I2C总线死锁原因及解决方法

原文地址:I2C总线死锁原因及解决方法作者:zhm4976转发网易DP先生关于I2C的博文,便于学习时查找 最近发现访问I2C设备时,主设备复位可能会引起i2C死锁,表现为SCL为高,SDA一直为低,...
  • u012045426
  • u012045426
  • 2016年08月28日 08:57
  • 935

I2C总线解析

注:本文来源http://blog.csdn.net/zmq5411/article/details/6085740,在此感谢原作者!   IIC总线 一般串行数据通讯都有时钟和数据之分,有异步...
  • dddd0216
  • dddd0216
  • 2016年03月15日 14:18
  • 2982

51单片机——I2C总线

单片机——I2C 宗旨:技术的学习是有限的,分享的精神是无限的。         UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数...
  • a1314521531
  • a1314521531
  • 2016年03月16日 09:03
  • 1160

个人总结之I2C总线协议

1.what is I2C? 简单讲就是用来传输数据的两根线:一根数据线(SDA)一根时钟线(SCL) 2.I2C怎么传输的? (1)基本过程:      1.主机发出开始信号      2...
  • black_yu
  • black_yu
  • 2016年07月16日 20:03
  • 4200

STM32 I2C 总线占用问题解析

STM32F207 MCU有三组I2C,在Pre-ES1使用I2C1接上DSP/Codec/EEPROM,运作良好。新硬件把Codec/EEPROM移到I2C3,DSP还是留在I2C1,发现在I2C3...
  • cannerxx
  • cannerxx
  • 2015年07月19日 18:31
  • 1062

51单片机I2C总线驱动程序

I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。一.I2...
  • u013151320
  • u013151320
  • 2015年12月15日 09:44
  • 1747
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:I2C总线
举报原因:
原因补充:

(最多只允许输入30个字)