新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何在Linux环境下设计基于I2C总线的EEPROM 驱动程序?

如何在Linux环境下设计基于I2C总线的EEPROM 驱动程序?

作者:时间:2018-08-01来源:网络收藏

1 引言

本文引用地址:http://www.eepw.com.cn/article/201808/384883.htm

I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于连接微控制器及其外围设备。它是同步通信的一种特殊形式,具有接口线少、控制方式简单、器件封装形式小、通信速率较高等优点。在主从通信中,可有多个器件同时接到上,通过地址来识别通信对象。笔者在开发基于MPC8250的嵌入式系统的过程中发现在嵌入式系统中应用广泛,I2C总线控制器的类型比较多,对系统提供的操作接口差别也很大。与I2C总线相连的从设备主要有微控制器、、实时时钟、A/D转换器等.MPC8250处理器正是通过内部的I2C总线控制器来和这些连接在I2C总线上的设备进行数据交换的。由于I2C总线的特性,的I2C总线设备的设计者在设计时采用了独特的体系结构。使开发I2C总线设备与开发一般设备驱动程序的方法具有很大差别。因此,开发I2C总线设备驱动程序除了要涉及一般内核驱动程序的知识外.还要对I2C总线驱动的体系结构有深入的了解。笔者在开发过程中使用设备型号为AT24C01A的 来测试I2C总线驱动。

2 工作原理概述

在介绍I2C总线结构之前。要搞清楚两个概念:I2C总线控制器和I2C设备。I2C总线控制器为微控制器或微处理器提供控制I2C总线的接口,它控制所有I2C总线的特殊序列、协议、仲裁、时序,这里指MPC8250提供的I2C总线控制接口。I2C设备是指通过I2C总线与微控制器或微处理器相连的设备,如、LCD驱动器等,这里指EEPROM。

在一个串行数据通道中.I2C总线控制器可以配置成主模式或从模式。开发过程中,MPC8250的I2C总线控制器工作在主模式,作为主设备;与总线相连的I2C设备为AT24C01A型EEPROM,作为从设备。主设备和从设备都可以工作于接收和发送状态。总线必须由主设备控制,主设备产生串行时钟控制总线的传输方向,并产生起始和停止条件。

2.1 I2C总线控制器

I2C使用由串行数据线SDA 和串线时钟线SCL组成的两线结构来在外部集成电路与控制器之间交换数据。MPC8250的I2C总线控制器包括发送和接收单元、一个独立的波特率发生器和一个控制单元。发送和接收单元使用相同的时钟信号,如果I2C为主设备.那么时钟信号由I2C的波特率发生器产生;如果I2C为从设备,时钟信号则由外部提供。

SDA和SCL为双向的,通过外部+3.3 V上拉电阻连接至正向电压。当总线处于空闲状态时,SDA和SCL都应是高电平,I2C通常的配置模式如图1所示。


图1 I2C配置模式

I2C的接收和发送单元均为双缓存,在数据发送时,数据从发送数据寄存器到移位寄存器,以时钟速率输出到SDA线;在数据接收时,数据从SDA线进入移位寄存器,然后进入接收寄存器。

2.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主设备读操作时序

3 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所示。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭