I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于衔接微操控器及其外围设备。它是同步通讯的一种特别办法,具有接口线少、操控办法简略、器材封装办法小、通讯速率较高级长处。在主从通讯中,可有多个I2C总线器材一起接到I2C总线上,经过地址来辨认通讯目标。笔者在开发根据MPC8250的嵌入式Linux体系的进程中发现I2C总线在嵌入式体系中运用广泛,I2C总线操控器的类型比较多,对体系供给的操作接口不同也很大。与I2C总线相连的从设备主要有微操控器、EEPROM、实时时钟、A/D转换器等.MPC8250处理器正是经过内部的I2C总线操控器来和这些衔接在I2C总线上的设备进行数据交流的。因为I2C总线的特性,Linux的I2C总线设备驱动程序的规划者在规划驱动程序时选用了共同的体系结构。使开发I2C总线设备驱动程序与开发一般设备驱动程序的办法具有很大不同。因而,开发I2C总线设备驱动程序除了要触及一般Linux内核驱动程序的常识外。还要对I2C总线驱动的体系结构有深化的了解。笔者在开发进程中运用设备型号为AT24C01A的EEPROM 来测验I2C总线驱动。
1 作业原理概述
在介绍I2C总线结构之前。要搞清楚两个概念:I2C总线操控器和I2C设备。I2C总线操控器为微操控器或微处理器供给操控I2C总线的接口,它操控一切I2C总线的特别序列、协议、裁定、时序,这儿指MPC8250供给的I2C总线操控接口。I2C设备是指经过I2C总线与微操控器或微处理器相连的设备,如EEPROM、LCD驱动器等,这儿指EEPROM。
在一个串行数据通道中.I2C总线操控器能够装备成主形式或从形式。开发进程中,MPC8250的I2C总线操控器作业在主形式,作为主设备;与总线相连的I2C设备为AT24C01A型EEPROM,作为从设备。主设备和从设备都能够作业于接纳和发送状况。总线有必要由主设备操控,主设备发生串行时钟操控总线的传输方向,并发生开端和中止条件。
1.1 I2C总线操控器
I2C运用由串行数据线SDA 和串线时钟线SCL组成的两线结构来在外部集成电路与操控器之间交流数据。MPC8250的I2C总线操控器包含发送和接纳单元、一个独立的波特率发生器和一个操控单元。发送和接纳单元运用相同的时钟信号,假如I2C为主设备。那么时钟信号由I2C的波特率发生器发生;假如I2C为从设备,时钟信号则由外部供给。
SDA和SCL为双向的,经过外部+3.3 V上拉电阻衔接至正向电压。当总线处于闲暇状况时,SDA和SCL都应是高电平,I2C一般的装备形式如图1所示。
图1 I2C装备形式
I2C的接纳和发送单元均为双缓存,在数据发送时,数据从发送数据寄存器到移位寄存器,以时钟速率输出到SDA线;在数据接纳时,数据从SDA线进入移位寄存器,然后进入接纳寄存器。
1.2 I2C总线操控器和EEPROM 的根本操作
I2C总线在传送数据进程中共有3种类型的信号,分别是:开端信号、完毕信号和应对信号。
开端信号:SCL为高电平时,SDA 由高电平向低电平跳变,开端传送数据;
完毕信号:SCL为高电平时,SDA由低电平向高电平跳变,传送数据完毕;
应对信号:接纳数据的设备在接纳到一个字节数据后, 向发送数据的设备宣布特定的低电平脉冲。表明已收到数据。
当MPC8250的I2C总线闲暇时,其SDA和SCL均为高电平,主设备经过发送一个开端信号发动发送进程。这个信号的时序要求是当SCL为高时,SDA呈现一个由高到低的电平跳变。在开端条件之后。有必要是从设备的地址字节,其间高4位为器材类型辨认符(不同的芯片类型有不同的界说,EEPROM一般应为1010),接着3位为片选,最终1位为读写位,当为1时为读操作,为0时为写操作,如图2所示。
图2 EEPROM设备地址字节结构
假如主设备要向EEPROM 中写数据,在地址字节中主设备向EEPROM宣布一个写恳求(R/W=0),发送的地址字节之后紧跟着要发送的数据。每发送一个字节的数据后EEPROM就会发生一个应对信号,主设备也会监控应对信号,假如在发送一个字节后EEPROM没有回来应对信号,则主设备就会中止发送,并生成一个完毕信号。写操作的时序如图3所示。
图3 I2C主设备写操作时序
要从EEPROM 中读取数据时,应设置R/W=1。在EEPROM发送完一个字节的数据后,主设备发生一个应对信号来呼应,奉告EEPROM主设备要求更多的数据,对应主设备发生的每个应对信号EEPROM将发送一个字节的数据。当主设备不发送应对信号并随后发送完毕信号位时完毕此操作。读操作的时序如图4所示。
图4 I2C主设备读操作时序
2 Linux中I2C总线驱动体系结构
在Linux体系中,关于一个给定的I2C总线硬件装备体系,I2C总线驱动程序体系结构由I2C总线驱动和I2C设备驱动组成。其间I2C总线驱动包含一个详细的操控器驱动和I2C总线的算法驱动。一个算法驱动适用于一类总线操控器。而一个详细的总线操控器驱动要运用某一种算法。例如,Linux内核中供给的算法i2e-algo-8260能够用在MPC82xx系列处理器供给的I2C总线操控器上。Linux内核中供给了一些常见处理器如MPC82xx系列的算法驱动。关于I2C设备,根本上每种详细设备都有自己的根本特性。其驱动程序一般都需求特别规划。
在I2C总线驱动程序体系结构中。运用数据结构Driver来表明I2C设备驱动,运用数据结构Client表明一个详细的I2C设备。而关于I2C总线
操控器,各种总线操控器在进行数据传输时选用的算法有好多种,运用相同算法的操控器供给的操控接口也或许不同。在I2C总线驱动程序体系结构中,用数据结构Algorithm来表明算法,用数据结构Adapter来表明不同的总线操控器。Linux内核的I2C总线驱动程序体系结构如图5所示。