APP下载

基于ARM-Linux 的MAX1303 接口与驱动程序设计

2013-10-21姜秀杰

电子设计工程 2013年12期
关键词:驱动程序时钟应用程序

杨 斌,满 峰,姜秀杰,刘 波

(1.中国科学院 空间科学与应用研究中心,北京 100190;2.中国科学院 研究生院,北京 100049)

在数据采集系统中,通常是通过传感器将自然世界的物理量转化成电量,电量是模拟量,必须经过模/数转换才能被系统的处理器读取。现在的很多微处理器都有片内AD,但这些AD 多数是8 位、10 位或者12 位,有时候很难满足精度要求。所以需要利用处理器的接口资源外扩精度较高的AD 芯片。然而精度越高,价格越贵。所以在选择AD 芯片时,必须充分考虑这两个方面。本系统在对采样精度和价格进行权衡后,决定选择16 位模/数转换器。由于设计的数据采集系统放置于环境恶劣的野外,所以全部器件都要满足工业级标准,所以最终选择了MAXIM 公司的MAX1303。处理器选用了恩智普公司的ARM9 微处理器LPC3250。在此基础上,设计了硬件连接,以及Linux2.6.29 内核下的设备驱动程序,并通过编写的应用程序对驱动程序进行了测试。

1 芯片介绍

1.1 LPC3250 简介

LPC3250 是恩智普公司推出的、采用RISC 结构、基于ARM926EJ-S 内核的32 位工业级处理器,可工作于-40~+85 ℃的范围内。它的最高工作频率可达266 MHz,具有完整的存储管理单元(MMU),可以嵌入Linux/Wince 等需要MMU 支持的操作系统;高达256 kB 的内部SRAM 可用于数据和代码存储;32 kB 数据高速缓存和32 kB 指令高速缓存;矢量浮点协处理器具有硬件浮点计算功能。另外,片内有SD/MMC 卡主机控制器和以太网控制器使系统实现文件存储和以太网功能变得简单,这对于数据采集系统非常有用。

1.2 AD 芯片MAX1303 简介

MAX1303 是MAXIM 公司推出的工业级、低功耗、多量程、16 位精度的模/数转换芯片,采用+5 V 单电源供电,最高采样率可达115kbps。可使用+4.096 V 片上基准或者3.800 到4.136 V 之间的外部电压基准[1]。采用20 引脚的TSSOP 封装。它的引脚如图1 所示。

从引脚图可以看出,芯片外部有多种电源引脚,这些引脚对应芯片内部独立的功能模块。对芯片采用独立的电源供电可以尽可能的使工作环境保持低噪声。第16、17 引脚在使用外部电压基准时分别连接AVDD 和基准电压,在使用芯片内部基准时,分别通过0.01 μF 和1 μF 的电容旁路到AGND1即可。其他引脚功能如表1 所示。

图1 MAX1303 引脚图Fig.1 Pin diagram of MAX1303

表1 MAX1303 引脚功能Tab.1 Pin function of MAX1303

CH0-CH4 支持4 路单端输入,或者2 路差分输入。SSTRB 在AD 转换器的某些工作模式下可指示转换状态。另外4 种数字接口可通过SPI/QSPI/MICROWIRE 兼容的串行接口与2.7 V 至5.25 V 的系统连接。

MAX1303 支持7 种单端输入范围或者3 种差分输入范围,有7 种工作模式。这些都可以通过输入控制字进行配置。

2 系统硬件设计

已提到,模/数转换器MAX1303 可以通过SPI/QSPI/MICROWIRE 兼容的串行接口进行控制。由于SPI 比较常见,并且协议简单,本系统使用SPI 协议控制此AD 芯片。然而,虽然LPC3250 有内置的SPI 控制器,但本系统选择使用LPC3250 的GPI/O 口模拟SPI 接口对MAX1303 进行控制。下面分析原因。

已提到,MAX1303 有7 中工作模式,其中,有3 种用于数据采集。这3 种工作模式是:外部时钟模式;外部采集模式;内部时钟模式。这3 种采集模式各有优缺点。外部时钟模式的吞吐率最高,同时,给处理器带来的负担也最高;内部时钟模式吞吐率次之,能适当减轻处理器的负担;外部采集模式的吞吐率最低,但却能最大限度的减轻处理器负担。由于LPC3250 性能强大,所以系统在采集数据时,使用吞吐率高的外部时钟模式。然而,使用外部时钟模式时,不像使用内部时钟模式和外部采集模式,处理器向MAX1303 写完控制字和转换启动字后,只需等待MAX1303 的SSTRB 引脚输出的转换结束信号,然后就可以读取转换结果。使用外部时钟模式,需要精确的控制时钟个数,这使得在驱动程序中,要经常修改SPI 的相关控制器,而且还要通过查询来确定时钟的个数。如果使用LPC3250 的GPI/O 口模拟SPI 协议控制AD 芯片就简单的多。控制GPO 口不断翻转输出电平就可以产生时钟信号,而且可随意控制时钟个数。对于发送数据,只需要简单的把数据字节的每个位根据时钟变化通过GPI 口输出给AD 芯片。读取数据与发送数据是一个相反的过程,但类似。

所以,用GPI/O 口模拟SPI 总线控制MAX1303 非常简单。本系统有两路模拟信号需要采集,使用单端输入,MAX1303 的另外两个输入端接地。LPC3250 与MAX1303 的硬件连接如图2 所示。

图2 LPC3250 和MAX1303 的连接图Fig.2 Connection diagram of LPC3250 and MAX1303

3 Linux 下设备驱动程序设计

设备驱动程序是应用程序和硬件之间的桥梁,它为应用程序屏蔽硬件细节,并将硬件封装成一个文件的形式[2-3]。当应用程序需要操作硬件时,只需操作硬件相对应的设备文件即可。Linux 对设备的分类有许多种,常见的分类是将设备分成3 种:字符设备、块设备、网络设备[4]。这三类设备对应3 种设备文件。不同设备的开发模式以及与内核的接口也不相同。MAX1303 属于字符设备,本文将分析Linux2.6.29 内核下MAX1303 的字符设备驱动设计方法。

设备驱动程序与应用程序不同,应用程序从main 函数开始执行,而驱动程序在被安装时,则是从module_init 宏指定的函数处开始执行[5]。module_init 宏指定的函数被称为模块加载函数,它可以看成是驱动程序的入口。它通常完成地址映射,向内核注册并初始化cdev 结构,创建设备文件等工作。模块加载函数的程序流程图如图3 所示。

与模块加载函数对应的,有一个模块卸载函数,此函数由module_exit 宏指定,它在驱动模块被卸载时执行。它主要完成的工作包括:销毁设备文件;注销设备所对应的cdev 结构;释放内存;注销设备号。

Struct cdev 在内核内部被用来表示设备,这是一个非常重要的数据结构。它内部有一个成员结构 struct file_operations[6],用于连接设备编号和驱动程序的操作。这个数据结构包含一组函数指针,这一组函数的实现是设计驱动程序的重点和难点。这一组函数有很多,但根据项目需求,本系统只实现open,write,read,release 4个函数。

图3 模块加载函数流程图Fig.3 Flow diagram of module loading function

结构struct file_operations 中的open 字段对应着系统调用中的open 函数。在应用程序中,通过open 函数打开MAX1303 对应的设备文件时,内核会跳转到此函数指针处。此函数指针的实现,主要完成初始化工作。这包括MAX1303的初始化配置和LPC3250 驱动相关的寄存器设置。MAX1303的初始化包括工作模式选择、量程范围选择、单端/差分输入选择、初始化通道选择。对于这四项,本系统全部使用默认设置:外部时钟模式;-Vref 到+Vref 的测量范围;单端输入;初始化输入通道0。所以,在open 中不用配置MAX1303。对LPC3250 的寄存器配置也比较简单,需要完成的配置有:片选信号拉高;时钟信号拉低;处理器输出拉低。

Write 字段需要接收应用程序从用户空间[7]传递到内核的的数据,然后将此数据通过GPO_17 端口发送给MAX1303。这些数据主要用于修改MAX1303 的配置,例如通道选择。向MAX1303 写数据时需要注意MAX1303 电气特性中的两个时间参数Tcss 和Tcspw。Tcss 对应着芯片的片选信号被拉低后到第一个时钟到来前所必需的时间间隔[8]。Tcspw对应着写模拟输入配置字节、模式控制字节、转换启动字节时,任意两者之间的时间间隔。这两个时间参数都必须大于40 ns,且没有上限。本系统中,在Read 中写转换启动字节,write 中只做通道的切换,其他配置都使用默认的。

Read 字段是MAX1303 驱动的关键点。它负责读取采样结果,并将结果传递给应用程序。在read 中,首先是用8个时钟向MAX1303 写转换起始字节,然后使用8个是时钟周期等待AD 转换完成。最后使用16个时钟周期读取MAX1303输出的转换结果。由于转换结果是以串行方式输出,故需要将读取的数据拼凑起来。又由于ARM 使用的是端口3 的GPI_06 管脚读取MAX1303 的输出数据,且对于端口3 的操作是以32 位进行的,所以还需要考虑拼接端口3 的哪个数据位。本文的处理方式是先将端口3 读出的数据右移6 位。具体的操作代码如下:

release 对应着系统调用中的close 函数。它需要完成这个驱动所涉及的配置寄存器的复位,操作过程与open 相反。在还原寄存器的默认设置后,打印一条设备文件关闭的信息,供应用程序开发者调试时观察使用。

4 Linux 应用程序设计与测试

本文介绍的应用程序是整个系统的一部分,这里仅供测试驱动程序使用。测试的功能主要是驱动中的write 和read功能。由于驱动程序的read 中没有对读取的采样值做处理,所以得到的数据还不是输入信号的实际值,应用程序必须对数据进行处理。由于MAX1303 采用单端、双极性输入,所以处理公式为:

式中,实际值的单位是毫伏;采样值是从MAX1303 读取的数据;FSR 是满量程范围,对于本系统,FSR 是2*Vref;本系统采用内部电压基准,Vref 的理论值是4.096 V,但实际系统中会有一定的漂移,范围一般在4.056 V 到4.136 V 之间。

为了测试,应用程序每秒读取一次两个通道的数据,并打印。应用程序的流程图如图4 所示。

图4 应用程序流程图Fig.4 Flow diagram of application

根据应用程序的打印结果和CH1、CH2 的实际输入,系统采样结果正确,系统运行稳定。

5 结论

A/D 转换器在数据采集系统和智能控制系统中有极其重要的用途。嵌入式Linux 在现代的嵌入式系统中也被广泛应用。本文描述的16 位AD 芯片的Linux 驱动和硬件接口设计不仅在笔者所开发的系统中具有实际工程应用价值,同时,对其他具有SPI 接口的AD 芯片的硬件接口设计和Linux 驱动程序设计也有一定的参考价值。

[1]马茂松,姜秀杰.星载电场仪的信号采集与传输系统[J].微计算机信息,2010,26(12):34-36.MA Mao-song,JIANG Xiu-jie.Signal sampling and transmitting system of satellite onboard electric field meter[J].Microcomputer Information,2010,26(12):34-36.

[2]徐伟,胡志忠,肖前贵.AD7490与AT91RM9200的SPI接口及其驱动程序的实现[J].计算机测量与控制,2009,17(10):2089-2091.XU Wei,HU Zhi-zhong,XIAO Qian-gui.Implementation of SPI and driver for AD7490 and AT91RM9200 [J].Computer Measurement &Control,2009,17(10):2089-2091.

[3]陈鑫旺,姜秀杰.基于嵌入式Linux 和FPGA 的数据通信系统设计[J].微计算机信息,2012,28(6):76-78.CHEN Xin-wang,JIANG Xiu-jie.Design of data communication system based on embedded Linux and FPGA[J].Microcomputer Information,2012,28(6):76-78.

[4]刘淼.嵌入式系统接口设计与Linux 驱动程序开发[M].北京:北京航空航天大学出版社,2006.

[5]曹毅,何慎学,陈会鸽.ARM-Linux 外扩AD 驱动程序的研究与实现[J].自动化与仪表,2010(9):45-48.CAO Yi,HE Shen-xue,CHEN Hui-ge.Research and implementation on extending AD driver program based on ARM-Linux[J].Automation&Instrumentation,2010(9):45-48.

[6]李俊.嵌入式Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[7]魏永明.Linux设备驱动开发详解[M].北京:中国电力出版社,2006.

[8]肖笑.基于BCC算法的多机系统PSS参数优化设计[J].陕西电力,2012(12):51-54.XIAO Xiao.Optimal design of multi-machine power system stabilizer parameters based on bacterial colony chemotaxis algorithm[J].Shaanxi Electric Power,2012(12):51-54.

猜你喜欢

驱动程序时钟应用程序
别样的“时钟”
古代的时钟
删除Win10中自带的应用程序
阻止Windows Update更新驱动程序
谷歌禁止加密货币应用程序
计算机硬件设备驱动程序分析
有趣的时钟
时钟会开“花”
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序