基于ARM-Linux的IIC串行通信

2013-09-12 04:24徐海林
电子测试 2013年20期
关键词:适配器低电平高电平

徐海林

(安徽理工大学计算机科学与工程学院,安徽淮南,232001)

0 引言

在现代社会,嵌入式以及半导体技术发展迅速。嵌入式技术被应用到了社会上的各个方面,尤其以手机,平板电脑,医疗电子,自动领域更为明显。而嵌入式技术的核心是嵌入式处理器,在众多的嵌入式处理器领域中又以ARM最为典型。

IIC总线是Philips公司首先推出的新一代串行扩展总线,在嵌入式系统中得到了广泛的应用。本文主要研究ARMLinux系统中IIC设备驱动程序的设计方法。

1 IIC总线技术介绍以及AT24C02与ARM芯片相连接

IIC 是Inter-Integrated Circuit(集成电路总线)的缩写,这种总线类型在八十年代初由飞利浦半导体公司设计出来。IIC总线是一种高性能的串行总线,这种总线连线少,结构简单,使用方便,从而大大简化系统的硬件设计。IIC总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以接受数据又可以发送数据。每一个带有IIC总线的芯片都有一个固定的地址,他们通过这个唯一固定的地址通信,互相接受和发送信息。每个IIC总线芯片都可以是一个单独的接受者和发送者。

1.1 IIC总线的特点

IIC总线是一种双向的串行接口总线,它的最大的特点就是简单和高效率。正是这种总线采用了串行通信方式,所以IIC总线只需要很少的空间和IO接口。IIC总线通过上拉电阻连接正电源,当总线空闲时,两根线均是高电平。连接到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA与SCL都是“线与”的关系。IIC总线的数据传输效率在标准模式下可以达到100Kbps,在快速模式下可以达到400Kbps,在高速模式下可以达到3.4Mbps。

1.2 IIC总线的信号

IIC总线总共能产生三种信号:起始信号、结束信号和响应信号。

(1)起始信号:当SCL总线处于高电平状态,SDA总线的电平从高电平处于低电平,代表着处理器向IIC芯片发送了起始信号。

图1 AT24C02的芯片引脚图

(2)结束信号:同样当SCL总线上的电平为高电平,SDA总线的电平从低电平处于高电平状态,代表着处理器向IIC芯片发送了结束信号。

(3)响应信号:当芯片接受和发送完数据后,在第9个时钟周期,拉低SDA电平,这就是响应信号,标志着数据接受完成或者读完成。

1.3 EEPROM AT24C02与ARM芯片连接

AT24C02是美国公司生产的低功耗的CMOS串行EEPROM,它有四种标准工作电压,分别是5.0V/2.7V/2.5和1.8V。AT24C02共有8个引脚,SDA引脚输出串行数据,SCL输出串行时钟,A1、A2、A3是地址线引脚,它决定了AT24C02 的地址,七号引脚是写保护引脚,当它为低电平时,当WP引脚接到VCC上,所有的内容被写保护,只能读。AT24C02内部含有256个8位字节,总共有32个页,每个页有8个字节。AT24C02不能发送数据,它只能接受数据。AT24C02的引脚如图1所示。

由于IIC总线在嵌入式系统中的广泛应用,S3C2440X芯片内部集成了IIC总线接口,方便系统对IIC总线的应用。IIC总线在主从设备中接受和收发信息,只需要对IIC的特殊功能寄存器进行相应的设置,就可以使用了。在S3C2440中,IIC特殊功能寄存器有IICCON、IICSTAT、IICDS和IICADD。S3C2440的IIC接口工作流程如图2所示。

图2 S3C2440的IIC接口工作流程图

2 接口驱动的编写

在嵌入式Linux系统中设备驱动程序是内核的一部分,完成对设备初始化、读写操作和控制等功能。在广泛应用的ARMLinux及其Android的嵌入式软硬件系统中,经常涉及到内部整合电路IIC总线的操作及其设备的添加与驱动的实现。

2.1 IIC总线设备驱动模型

ARM-Linux下,IIC总线设备驱动采用了总线设备驱动模型,IIC分为3个层次IIC内核和IIC总线驱动和IIC设备驱动。在IIC内核中定义了一个i2C_bus_type结构体,里面定义了一个mach函数,一个设备链表,一个驱动链表。在ARM-Linux中通过mach函数来配对驱动链表中的驱动和与之相对应的设备链表中的设备。IIC内核中还提供了一些数据结构的定义和接口函数,这些函数实现了一个IIC驱动的注册、以及设备的寻找和适配器的读写通信代码。在IIC 设备驱动中提供了一个IIC 设备的物理相关信息,而IIC 驱动则实现了从机设备驱动,包括read、write、以及ioctl等用户层接口。

2.2 i2C-client定义

ARM-linux中添加IIC设备驱动,首先是编写该设备的i2c-driver驱动,然后是编写跟这个设备相关的i2C-client驱动,最后向系统注册该驱动。为了方便编写i2C-client,在linux内核2.6中定义了一个i2C_board_info结构体,里面的两个重要成员name和addr可以很轻松帮我们识别设备的地址和找到该设备的i2c-driver驱动。成员name定义了该设备的名称,上面提到的mach函数会根据成员name来配对相对应的i2c-driver。而成员addr则向内核提供了该IIC设备的唯一地址,用来辨别该设备。

2.3 借用通用I2C-dev.c驱动添加新设备

采用I2C-dev.c来编写IIC驱动是最简单的方法。它实际上是通过应用层操作IIC适配器来控制i2c设备的。I2C-dev.c是一种通用的IIC驱动,它提供了通用的read()、write()和ioctl()等函数接口。应用层通过访问这些接口来访问挂接在IIC适配器上的IIC设备的存储空间和寄存器。其实I2C-dev.c对应的read()、write()是分别调用了IIC内核心的i2C_master_recv()和i2C_master_send ()函数,这样的驱动可读性和可设计性都得到了大大的增加。

3 结束语

IIC总线在现在电子技术中得到广泛的应用,在ARM—Linux中,采用了总线驱动模型三层设备驱动架构,使得IIC驱动程序设计更加的简单,方便阅读与设计。

[1]朱文涛,桑楠,杨国武.基于S3C2410的I2C总线接口的软件仿真与验证,2011,9(9).

[2]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.

[3]孔令成,王华.串行E2PROM的原理及应用[J].国外电子元器件,1997(8):42.

[4]李群芳,张士军,黄建.单片微型计算机与接口技术[M].2版.北京:电子工业出版社,2005.

[5]杨文铂,等.Linux下I2c设备驱动的一种适配器层直接实现方法[J].单片机与嵌入式系统应用,2011,11(6).

[6]韦东山.嵌入式Linux 应用开发完全手册[M].北京:人民邮电出版社.2008.

[7]Data Manual of IIC Serial EEPROM (oaf)[K].Microchip Technology Inc.2005.

猜你喜欢
适配器低电平高电平
一种基于FPGA的PWM防错输出控制电路
TS-03C全固态PDM中波发射机开关机控制电路原理及故障分析
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
基于3D打印的轻型导弹适配器
潜空导弹垂直发射出筒适配器受载变形仿真研究
浅谈物理电路与数字电路
电源适配器怎么选
PDM 1kW中波广播发射机保护电路分析
15-MeV电子直线加速器的低电平系统
美国麦格普公司新型M—LOK相机三脚架适配器