微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式数据采集系统中的ADS8364驱动程序设计

嵌入式数据采集系统中的ADS8364驱动程序设计

时间:03-23 来源:互联网 点击:

1 引言

数据采集系统的工作原理就是将被测对象(外部世界或现场)的各种参量(可以是物理量,也可以是化学量,生物量)通过各种传感元件做适当转换后,再经信号调理、采样、量化、编码、传输等步骤,最后送到服务器进行数据处理和存储记录的过程。用于数据采集的成套设备称为数据采集系统(Data Acquisition System,DAS)。

数据采集系统一般包括传感器、放大器、滤波器、A/D采样转换电路、微处理器等元件。数据采集系统基本组成示意图如图1所示。A/D转换电路在数据采集系统中起着至关重要的作用,它的转换精度和工作可靠度直接关系着整个采集系统的工作性能。由于篇幅有限,本文仅就该数据采集系统中的A/D转换芯片ADS8364的驱动开发过程加以概述。

图1 数据采集系统组成示意图

2 ADS8364的功能简介

ADS8364是美国TI公司生产的一种高速、低能耗、6通道同步采样转换、单+5V供电、16位高速并行接口的高性能模数转换芯片。并带有6个80dB共模抑制的全差分输入通道以及6个4μs连续近似的模数转换器、6个差分采样/保持放大器[1]。 ADS8364的6个模拟输入分为3组(A,B和C),每个输入端都有一个ADCs保持信号以用来保证几个输入通道能同时进行采样和转换,因此不同模拟输入通道信号之间的相位差异得以保存。当3个保持信号同时被选通时,6个ADCs同步转换,其转换结果将保存在6个寄存器中。采样频率最高为 250KHz,抗噪性能好。

3 设备驱动程序开发的基本原理

设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽了硬件的细节,将应用程序对设备的操作转化为对相应的设备文件的操作,使应用程序可以象操作普通文件一样,用处理普通文件的标准系统调用来打开、关闭和读写设备。设备驱动程序作为内核的一部分,主要完成如下功能:对设备进行初始化和释放;完成硬件与内核的数据交互;完成内核与应用层的数据交互;对可能出现的错误进行检测和处理。

在Linux系统中,打开的设备在内核内部由设备文件结构标识,内核使用file_operations(文件操作)结构访问驱动程序的函数。每个文件都与自己的函数集相关联(通过包含在设备中指向file_operations结构的指针实现),这些操作主要负责系统调用的实现。用户进程利用系统调用对设备文件进行操作时,系统调用通过设备的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这就是 Linux的设备驱动程序工作的基本原理。由此可见,编写设备驱动程序的主要工作就是编写file_operations中的子函数,完成对设备的操作。

为了实现设备的独立性,Linux把设备分成三种类型:字符设备(character device),块设备(block device)和网络设备(network device)[2]。每类设备都有独特的管理控制方式和不同的驱动程序,这样就可以把控制不同设备的驱动程序与操作系统的其它部分分离开来,不但便于对不同设备的管理,而且为系统中增加和撤销某种设备提供了很多方便。在此,我们是把ADS8364看作字符设备来驱动的,其驱动程序就是字符设备驱动程序。

4 ADS8364的驱动程序设计概述

4.1 驱动程序的LKM实现机制

Linux内核提供了两种机制来开发设备驱动程序,一种是直接把驱动程序编译进内核,成为Linux内核的一部分。另一种是通过LKM(Loadable Kernel Module,即可加载模块化机制)来开发可动态加载和卸载的驱动模块[3]。驱动程序如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以本系统把ADS8364的驱动程序编写成了 LKM型驱动程序(就是把ADS8364的驱动程序作为一个独立的单元模块,在使用时可以使用insmod命令加载到核心中,用完后使用rmmod命令卸载的那种)。

4.2 驱动程序的注册与注销

向系统增加一个驱动程序则意味着要赋予它一个主设备号,这一赋值过程是在驱动程序模块的初始化中完成的。ADS8364的初始化入口函数定义如下:

int _init ads8364_init_module(void)全功能版J-LINK ARM仿真器V6.0

{ …..

ret = register_chrdev(11, ADS8364, ad_fops);

……}

在用insmod命令将编译好的模块调入内存时,ads8364_init_module( )函数被调用。在这里,ads8364_init_module( )只做了一件事,它调用函数register_chrdev( )向内核注册该字符设备。函数register_chrdev()定义在linux/fs-h> 中。register_chrdev需要三个参数,参数一是希望获得的设备号,如果是零的话,系统将自动选择一个没有被占用的设备号作为该字符设备的主设备号并返回。参

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top