1 引言
在嵌入式应用系统中,特别是智能仪器、仪表、机电设备及装置控制中,需要使用A/D转换将模拟的电量信号转换为数字信号进行处理,而后再将处理的结果通过D/A转换为模拟量实现对被控过程和对象的控制[1]。
基于ARM920T内核的s3c2410是一款低功耗,高性价比的处理器[2]。这款处理器内部集成了多种控制接口,自带8路10位的A/D转换器[3],用于支持对于触摸屏输入的控制,而且足以满足外部模拟量采集的需要,但是s3c2410内部没有集成D/A转换器,因此在上述应用中,就需要采用独立的D/A转换芯片与s3c2410配合,满足应用的需要。而MAX504一款通用的10位串行D/A转换器,可以满足一般应用对于分辨率和精度的要求,并且采用串行通信,芯片面积小,占用的处理器管脚数少,因此本文中以s32410外接MAX504,并基于Linux操作系统,实现D/A转换的功能。
2 系统硬件电路
2.1 10位的D/A转换器MAX504[4]
MAX504是MAXIUM公司推出的低功耗,电压输出,10位串行数字/模拟转换芯片,支持+5V单供电和±5V双供电方式,并且该芯片对于包括偏移、增益和线性误差在内的各项误差均以调整,所以应用非常简单,不需要再度校正。
MAX504采用的是三线串行接口,与SPI,QSPI和Microwire标准均兼容。MAX504可通过写入两个8位长的数据进行编程,其写入的先后顺序为,4个填充位,10个数据位和最低两位的0。此处,最高4位的填充位只有当MAX504采用菊花链方式连接时必须写入,而最低的两位0则一定需要写入。当且仅当CS片选有效时,数据在SCLK的上升沿逐位打入片内的16位移位寄存器,并在CS上升沿,将有效的10位数据(第2~第11位)传送到D/A转换寄存器中,修改原寄存器内容。
MAX504芯片为14管脚的DIP或者SO封装形式,除电源和地管脚外,管脚可以分为两组,一组与处理器相连接,另一组管脚的不同连接可以改变MAX504的工作模式。
MAX504具有三种工作模式,分别是单极性输出,双极性输出和四象限乘法器。通过将MAX504的REIN,VOUT ,BIPOFF和RFB几个管脚的不同连接方式,可以根据需要将MAX504定义为需要的工作模式。
2.2 MAX504与S3c2410的连接
MAX504与处理器之间可以使用SPI,QSPI和Microwire中的任何一种串行通信方式,而s3c2410带有两个SPI接口,所以MAX504与s32410之间通过SPI进行连接非常方便。电路如图所示
图2.1 电路连接原理图
MAX504与处理器连接的主要管脚有四个,分别是:
(1) DIN—数据输入端,该管脚用于接收串行通信数据信号,直接与s3c2410的MOSI管脚连接即可。MOSIn(n可以为0或1,分别对应两个SPI口)管脚,s3c2410作为SPI串行通信的主模块使用,该管脚由s3c2410输出信号,MAX504作为通信的从设备进行数据的接收。
(2) SCLK—串行时钟输入端,该管脚用于接收串行通信的时钟信号,以便串行通信过程中的通信双方的同步,直接与s3c2410的SPI时钟输出管脚SPICLK连接即可。
(3) CS—片选管脚,该管脚为低电平有效,只有当CS有效时,MAX504接收数据,并在CS失效时,开始进行数据转换。本电路中,使用s3c2410的一根外部I/O管脚进行控制。
(4) CLR—清除端,该管脚也是低电平有效,可将MAX504的转换数据寄存器复位清零,本电路,使用s3c2410的另一个外部I/O脚进行控制。
该电路中,采用的是单极性工作模式,输出电压范围为0~2VREF,参考电压VREF由片内电路形成,为2.048V,故该电路的输出电压范围为0~4.096V。
3 系统的编程实现
3.1 嵌入式Linux简介
目前嵌入式系统为了更好的适应高效,稳定,可移植的需要,广泛地应用了嵌入式操作系统进行资源管理。Linux因其开放性特点,成为在嵌入式系统中应用最为广泛的操作系统。嵌入式Linux包括RT-linux,µClinux以及ARM处理器使用的ARM-Linux等多种适应不同应用需要的版本。
ARM-Linux将Linux内核移植到各种ARM处理器上,因此,在开发基于ARM处理器的应用系统时,如果对于实时性的要求不是很严格,且处理器又支持MMU时,采用ARM-Linux作为操作系统可以缩短开发周期,降低开发成本。
3.2 D/A驱动的实现
考虑到一个嵌入式应用系统中,不仅仅包含A/D,D/A转换,还包括其他,如通信,显示,输入等等功能,所以在实现D/A转换功能时,是基于嵌入式操作系统的,以嵌入式Linux作为操作系统。嵌入式Linux在操作外设时,将外设分为三种类型的设备进行操作,即:字符型、块设备和网络设备[5]。在支持D/A操作时,将D/A设备作为字符型设备,需要编写相应的驱动程序。
驱动程序<s3c2410-da.h>主要包含的内容就是对文件结构体open, ctrl,realse的重定向函数的编写,即定向为s3c2410_da_open,s3c2410_da_ctrl,s3c2410_da_close。这三个函数的作
用分别为:
(1)s3c2410_da_open:所做的工作非常简单,就是增加模块使用的计数值,通过该值可以体现逻辑上当先打开da端口的任务数。
(2)s3c2410_da_close:该函数进行的处理与open刚好相反,将模块使用计数值减一,表明使用结束。
图3.1 驱动核心函数s3c2410_da_ctrl流程图
(3)s3c2410_da_ctrl:该函数为核心函数,函数定义为static int s3c2410_exio_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg),函数功能为:由cmd参数指出D/A操作类型,arg为操作使用的参数,根据cmd和arg,可以根据通道号,对多个D/A通道进行清空操作和数据写入操作。
函数流程如图3.1所示,应用程序进行系统调用后,进入内核态,运行该函数实现对DA的操作,DA_ENABLE,使能s3c2410用于控制Max504的外部I/O,使CS低电平有效,选中D/A。之后,根据cmd指定的操作类型,对不同的D/A设备进行数据传送操作和寄存器清空操作。对D/A的数据写入,这里是通过s3c2410的SPI口进行的,s3c2410的两个SPI口,在D/A应用中,需要操作的SPI寄存器主要是SPICON和SPITDAT,设置SPICON,使s3c2410工作于主模式,将发送给MAX504进行转换的数据写入SPITDAT,SPITDAT为8位的寄存器,而MAX504是10位D/A转换器,所以需要发送两次,并且MAX504接收的16位数据,要求最低两位一定为00。数据经SPI传送后,MAX504并不立即进行数据转换,而是在CS片选上升沿才开始数据转换,DA_DISABLE的作用就是使s3c2410连接MAX504-CLR管脚的外部I/O端失效,此时D/A开始进行数据转换,系统调用结束。
将写好的驱动程序库,进行加载,加载到Linux核中,应用程序就可以像操作文件一样操作D/A设备了。
3.3应用程序设计示例
有了底层驱动的支持,用户可以根据自己的需要编写D/A转换应用程序,而不需要关心MAX504和s3c2410的硬件特征,这样就使的应用程序的编写非常的简单。这里以一个简单的应用程序为例,说明其程序编写方法,流程图如图所示。该应用程序,可以根据用户输入的D/A转换器的编号和电压,由MAX504的Vout管脚输出该电压。
首先,由于按上述电路,MAX504的满量程输出电压为4.096V,所以用户要求输出的电压应在该范围内,将用户输入的电压值,用下面语句转换为数字量:
value=(unsigned int)((v*1024.0f)/Max504_FULL);
得到D/A转换的数字量后,调用ioctl,首先将指定D/A的寄存器清空:
ioctl(da_fd, DA_IOCTRL_CLR, 0);//清D/A0
而后调用ioctl,对待转换的数字量进行D/A转换:
ioctl(da_fd, DA0_IOCTRL_WRITE, &value);
转换结束后,将设备释放即可。
图3.2 应用程序流程图
4结束语
本文针对主流嵌入式处理器-基于ARM920T内核的s3c2410,以D/A小型外设实际开发过程为引,在硬件连接电路的基础上,详细地说明了嵌入式Linux操作系统的外设驱动开发方法,给出了基于该处理器和Linux操作系统的外设驱动开发流程,既可直接用于工程应用,同时又为其他嵌入式系统的开发提供参考。