S3C2440A外扩AD7705设备驱动设计与实现
2012-10-31干开峰汪济洲
干开峰 王 俊 汪济洲
(合肥学院机器视觉与智能控制技术重点实验室,合肥 230601)
S3C2440A外扩AD7705设备驱动设计与实现
干开峰 王 俊 汪济洲
(合肥学院机器视觉与智能控制技术重点实验室,合肥 230601)
研究微处理器S3C2440A利用串行外设接口(SPI)外扩数模转换器AD7705的应用,以嵌入式 Linux操作系统构建开发平台,给出了 AD7705和S3C2440A的硬件连接以及AD7705驱动的实现方法,为数据采集的嵌入式设备的驱动开发提供了有效的实现方案。
微处理器;数模转换器;SPI;嵌入式Linux;驱动程序
SPI(Serial Peripheral Interface—串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI是一种高速的,全双工,同步的通信总线,只需3~4根数据线和控制线即可扩展具有SPI接口的各种I/O器件,数据传输速度比I2C总线快,实现软件相当简单[1]。串行A/D转换器具有体积小、功耗低、转换速度快、精度高等优点,串行接口的特点使其与微控制器直接相连,而S3C2440A芯片集成了SPI通信协议,被设计应用于手持设备以及各种嵌入式集成系统,将上述两种实用的芯片利用SPI总线技术相结合来实现数据采集是可行的。
1 主要构成器件
1.1 数据采集芯片AD7705
AD7705是美国模拟器件公司推出的一款高速低功耗16位A/D转换器,该器件可以接受直接来自传感器的低电平的输入信号,然后产生串行的数字输出,利用Σ-Δ转换技术实现16位无丢失代码性能,非线性度为0.003%。AD7705具有2个全差分输入通道,可编程增益为1~128,三线串行接口,具有模拟输入端缓冲器。AD7705工作电压为2.7~3.3V或4.75~5.25V,低功耗,3V电压时,最大功耗为1mW,等待电流的最大值为8μA。AD7705还包括自校准和系统校准选项,以消除器件本身或系统的增益和偏移误差[2]。
AD7705芯片内部具有8个寄存器,对芯片的操作必须先从写通信寄存器开始。当上电或复位后,芯片的等待指令数据即被写入通信寄存器中。
AD7705可以直接与MCU进行互联,用到的数据线有片选(CS)、串行时钟输入(SCLK)、指令或数据输入 (DIN)以及转换结果输出(DOUT)等。 只有在状态信号(DRDY)指示输出数据寄存器的数据准备就绪时,MCU才可以读取A/D转换的数据结果。
1.2 主控制器芯片S3C2440A
三星公司推出的16/32位RISC微处理器S3C2440A,主频为 400MHz,最高可达 533MHz。S3C2440A采用了ARM920T内核,实现了MMU、AMBA BUS和Harvard高速缓冲体系结构,该结构具有独立的16kb指令Cache和16kb数据Cache,每个都是由具有8个字长的行组成。S3C2440A通过提供一套完整的通用系统外设,不需配置额外的组件,可减少整体系统成本[3]。S3C2440A具有低功耗、简单且全静态设计的特点,特别适合于对成本和功率敏感型的系统应用。
S3C2440A芯片内有2个SPI口,可以实现和外设进行串行数据传输。每个SPI接口各有2个移位寄存器分别负责接收和发送数据[4]。在传送数据期间,传送数据的频率可由相应的控制寄存器来设定。在数据传输时,一个SPI系统作为“主机”控制数据流,其他 SPI作为“从机”,主机控制数据的输入和输出。
S3C2440A片内SPI接口具有如下特点:
(1)兼容 SPI协议 (ver2.11);
(2)发送和接收具有2×8位的移位寄存器;
(3)有轮询、中断和 DMA三种传送模式。
2 硬件接口设计
S3C2440A的SPI口包括2条数据线及 2条控制线(见表 1)。
表1 SPI接口
作者采用 SPIMISO0,SPIMOSI0,SPICLK0 作为SPI通信信号,利用GPIO口作为AD7705的片选信号。图1为S3C2440A与AD7705的接口电路图。
图1 AD7705和S3C2440A连接图
3 设备驱动程序实现
设备驱动程序是操作系统内核和硬件设备之间的接口,为应用程序屏蔽了硬件的细节,对于应用程序而言,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样,通过对设备文件的打开、读写和关闭等操作,控制底层的具体硬件设备。在嵌入式Linux操作系统下有三类主要的设备文件类型,即字符设备、块设备和网络设备。AD7705芯片属于字符设备类(char device)。
3.1 设备初始化函数
使用一个设备之前首先要对其进行初始化,本系统主要完成AD7705设备的初始化和S3C2440A的SPI接口初始化。AD7705初始化函数:ad7705_init(void),主要完成对AD7705的PIO口进行初始化设置,并对SPI的工作方式以及各控制寄存器和模式寄存器参数进行配置。
对S3C2440A的SPI接口初始化函数:spi_init(void),主要完成设置SPI工作方式,并实现控制寄存器SPCON、波特率SPPRE和GPIO口的设置等。
由于在嵌入式Linux操作系统下不允许对设备的物理地址直接进行访问,必须转换为虚拟地址后才能访问,故定义devp=kmalloc(sizeof(structadc_dev),GFP_KERNEL),并进行动态分配内存:memset(devp,0,sizeof(struct adc_dev))。利用函数 int register_chrdev_region(dev_t first,unsigned int count,char*name)将设备驱动程序向嵌入式Linux内核注册,这样基本完成了设备驱动的初始化函数spi_adc_init(void)。
3.2 设备操作实现函数
嵌入式Linux内核是通过file_operations结构体来组织对设备操作的具体实现函数,结构体中的成员几乎全是函数指针,包含了驱动程序提供给应用程序访问硬件设备的各种方法,每个成员都对应一个系统调用,当用户对设备文件进行操作时,系统调用通过设备文件的主设备号找到相应设备的驱动程序,然后找到file_operations结构体中相应的函数指针[5]。
本系统需要对SPI端口进行打开、关闭、接收、发送和传输数据操作,定义 file_operations结构体如下:
设备操作中最为核心部分的是A/D数据转换的功能实现,函数定义为:ad_convert(void),首先设置寄存器为发送状态,然后采用对SPI接口轮询方式完成数据转换和接受。
其中spi_tx_data(unsigned char data)为数据传输函数。
AD7705芯片驱动的工作流程如图2所示。
图2 驱动设备工作流程
3.3 设备注销函数
设备注销函数spi_adc_exit(void)与设备初始化函数spi_adc_init(void)相对应,主要完成内存空间释放等操作,核心部分由字符设备注销函数unregister_chrdev_region (dev_t first,unsigned int count)组成,该函数完成驱动程序向嵌入式Linux内核的注销,当设备驱动程序被注销后,内核会将之前所分配的设备号收回[6]。
3.4 程序加载与内核编译
完成驱动程序的编写后,需要将完成的驱动程序spi_adc.c文件加入嵌入式Linux内核并编译生成新的kernel文件。
首先将spi_adc.c复制到嵌入式Linux内核源代码的/linux2.6.30/driver/char目录下,修改Kconfig和Makefile文件。
Makefile文件添加代码:
Kconfig文件中添加代码:
完成之后在linux2.6.30根目录执行makemenuconfig,选择AD7705驱动程序如下所示:
选中要配置的选项,此时按下“Y”键,将此选项编译进内核[7]。
最后,执行make命令,生成zImage文件下载到目标板上执行。
至此,完成了SPI设备AD7705的驱动程序开发,将其用于工业现场数据采集,满足数据高精度和高速采集需求。
4 结 论
基于S3C2440A外扩带 SPI接口的串行A/D设备,硬件连接简单,软件易于实现,程序运行效率高,可推广到其他外设设备。该方案的实现可广泛应用于数据采集终端设备、医疗仪表以及其他嵌入式应用系统,具有较高的工程应用价值。
[1]崔微,秦征宇.基于ARMLinux的SPI驱动实现[J].重庆科技学院学报:自然科学版,2009,11(4):143-147.
[2]闫瑞杰,李海香,郝瑞霞.基于ATmega16的 AD7705多通道模拟量采集系统设计 [J].化工自动化及仪表,2011(4):466-468,487.
[3]吴华,谢礼莹,徐泽宇.基于ARM9的红外热像仪设计与实现[J].计算机工程,2010(10):234-236.
[4]李琦,贺明,董利民,等.基于ARM嵌入式系统的SPI驱动程序设计[J].微型机与应用,2011(5):5-8.
[5]李胜朝,黄先祥,谢建.嵌入式 Linux系统中字符设备驱动程序的开发[J].计算机工程,2007,33(4):5-8.
[6]李忠良,陈卫兵,邹豪杰,等.嵌入式 Linux下 AD7714与SPI接口及驱动的实现 [J].仪表技术与传感器,2011(4):42-44,62.
[7]王兴杰,李允,江浩,等.基于Linux的嵌入式交叉开发技术[J].计算机应用研究,2008(1):206-208,214.
Abstract:The application that the microprocessor(S3C2440A)uses SPI to expand AD7705 is studied,constructing the development platform by the embedded Linux operating system,giving the hardware connection diagram of AD7705 and S3C2440A and the realization of the AD7705 driver.It provides a solution for the embedded devices drive in data acquisition,having a high value of engineering application.
Key words:AD7705;S3C2440A;SPI;Embedded Linux;Driver
Design and Implementation of the Expansion AD7705 Device Driver Based on S3C2440A
GAN Kaifeng WANG Jun WANG Jizhou
(Key Laboratory of Machine Vision and Intelligence Control Technology of Hefei University,Hefei 230601)
TP391
A
1673-1980(2012)05-0146-04
2012-06-23
安徽省高校省级自然科学研究重点项目(KJ2010A292);安徽省高校省级自然科学研究一般项目(KJ2012B151)
干开峰(1974-),男,安徽和县人,实验师,研究方向为嵌入式系统。