摘要:本文主要讨论了以单片机为的振动信号采集系统的设计。介绍了几种实现高速缓存的方法,以及利用Intel8237制作一个DMA控制器,详细介绍了DMA传输的原理和条件,解决了DMA控制器和外部接口电路的设计问题,并且给出了DMA控制器的初始化程序。
问题的提出
在设计以单片机为的振动信号采集与传输系统时,一般会遇到两个问题。一个是采集的数据量,这个问题可以通过存储空间的扩展来解决。另一个问题就是采集数据的频率受单片机执行指令时间的限制的问题。一般的51系列单片机的晶振频率为12MHz,一个机器周期为1uS,则从A/D读出数据到外部RAM至少要4个机器周期,采样频率才250KHz。而振动信号的频率达到几百KHz,虽然A/D转换器可采用高频芯片,但从A/D把数据读出在存储到存储器速度跟不上,如果进行多路的数据采集则采集的频率更低,这样就不能普通的I/O方法进行数据采集。本文中将提供几种方案来解决这个问题。终选择了DMA方式,由于我们所选择的芯片没有带DMA控制器,所以我们就另外设计了一个DMA控制器,以及它和外部设备的接口电路。
二、高速缓存的实现
构成高速缓存的方法有三种:
种是FIFO(先进先出)方式。FIFO存储器就象数据管道一样,数据从管道的一头流入、从另一头流出,先进入的数据先流出。FIFO具有两套数据线而无地址线,可在其一端写操作而在另一端读操作,数据在其中顺序移动,因而能够达到很高的传输速度和效率,且由于省去了地址线而有利于PCB板布线。缺点是只能顺序读写数据,因而显得比较呆板,而且大容量的高速FIFO非常昂贵;
第二种是双口RAM方式。双口RAM具有两套独立的数据、地址和控制总线,因而可从两个端口同时读写而互不干扰,并可将采样数据从一个端口写入而由DSP从另一个端口读出。双口RAM也能达到很高的传输速度,并且具有随机存取的优点,缺点是大容量的高速双口RAM很难得且价格昂贵;
第三种是采用DMA方式。DMA是一
种无需CPU的参与就可以让外设与系统RAM之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。考虑到我们系统要采集的是振动信号,一般的频率也就几百k赫兹,用前两种方法是可以达到理想的效果,但从成本角度分析,这并不经济,所以这里我们选择第三种DMA方式。
三.DMA控制器的设计 [1]
(一)DMA传送的原理
对于中高速外设数据传输,一种有效的方式就是就是用DMA方式,主要就是用DMA控制器(简称DMAC,典型芯片是Intel 8237),在外设和内存之间直接进行数据传输,这种传输由DMAC硬件完成,不需要CPU干预,因此可以达到很高的速度。在DMAC获得总线的控制权之后,什么时候交还总线给CPU,完全有DMAC自己决定,这有两中模式:块传输模式和单字节传输模式。对于单字节传输模式,DMAC完成一字节传输后,释放系统总线。但是,在释放系统总线后,DMAC立即检测接口电路有无DMA请求(检测DREQ信号),如果有DMA请求,DMAC又立即向CPU发出总线请求。这种模式的特点是,DMA请求只传输一字节,然后释放总线,因此,这种模式又称为“总线窃取方式”,每次总是窃取一个总线周期,完成一字节传输,然后立即释放总线。(CPU在总线空闲时响应DMA请求)。对于块传输模式,DMAC一旦获得总线控制权,连续进行多个字节的传输,只有当“字节计数器”减为0,才释放总线。从内存到I/O的DMA块传输过程如下:
(1)接口电路准备好后,向DMAC发出DMA请求(DREQ)。
(2)DMAC向CPU发出总线请求(HOLD),如果无总线封锁(LOCK),CPU在完成当前总线周期后,向DMAC发出总线允许信号(HLDA),CPU放弃总线控制权,DMAC获得总线控制权。
(3)DMAC把存储器地址送至地址总线。
(4)DMAC向接口电路发出DMA请求应答信号(DACK),以通知接口电路把数据送至数据总线。
(5)接口电路送出数据,内存单元获得数据。
(6)DMAC内部的“地址寄存器”加1,指向下一个内存地址。
(7)DMAC内部的“字节计数器”减1。
(8)若字节计数器的值不为0,回到第③步,否则,块传输结束。
(二)DMA传输的条件
要实现DMA传输的条件主要有两方面,一个是DMA传输对外设接口电路的要求,一个是对DMA控制器的要求。具体如下:
1. DMA传输对外设接口电路的要求
(1)接口电路中的控制寄存器,必须有1位用来指出数据传送方向,这样,当DMAC控制总线时,就能判别是进行输入还是输出。
(2)接口电路中的控制寄存器,必须有1位用来启动I/O操作,通过这一位的设置来启动外部设备的操作。
(3)接口电路中的状态寄存器,必须有1位用来指出设备当前是否处于忙状态。
2. DMA传输对DMA控制器的要求
(1)DMAC的控制寄存器中,专门有1位作为DMA允许位,用来控制是否响应来自接口电路的DMA请求。
(2)DMAC的控制寄存器中,必须有1位用来确定DMA方向,以便决定发出读信号还是写信号。
(3)DMAC的控制寄存器中,还有1位用来决定进行传输后,到底是放弃还是维持对总线的控制权。
(4)DMAC的状态寄存器中,必须有1位表示数据块传输是否结束。
综上所示,对外设接口电路和DMA控制器的要求,可得DMA传输的配置如图(1)所示:
图(1)
(三)DMA控制器和接口电路的初始化程序[2,4]
为了使DMA过程能正确进行,必须使用程序对DMA控制器和接口电路进行初始化,初始化包括下列设置:
1.设置DMAC的字节计数器初值,以决定数据块的长度。
2.设置DMAC的地址寄存器初值,以确定数据传输所用的存储区首地址。
3.设置DMAC的控制寄存器,指出数据传送方向、是否进行块传输,并启动DMA操作。
4.设置接口电路的控制寄存器,指出数据传输方向,并启动I/O操作。
设:(INT-interface接口,CON-control register控制寄存器,“输入”指I/O存储器,“输出”指存储器I/O)
接口状态寄存器地址INTSTAT, bit2=1---I/O设备忙
接口控制寄存器地址INTCON, bit0=1为输入,bit0=0为输出
bit2=1---启动I/O操作
DMAC控制寄存器地址DMACON
bit0=1为输入,bit0=0为输出
bit3=1,可接收DMA请求
bit6=0为字节传输模式,bit6=1为块传输模式
DMAC字节计数器地址BYTE-REG
DMAC地址寄存器地址ADD-REG
I/O的数据块传输初始化程序如下:
IDLE: IN AL , INTSTAT ;读接口状态
TEST AL , 04H; 是否忙(bit 2)
JNZ IDLE; bit2=1,忙
MOV AX, COUNT; 块传输字节数
OUT BYTE_REG, AX
MOV AL, DMAC; DMAC原控制字
OR AL, 49H; 块传输允许接收DMA请求,输入
OUT DMACOM, AL
MOV AL, INTC; 接口电路的原控制字
OR AL, 05H; 输入,启动操作
OUT INTCOM, AL
程序对接口电路和DMAC初始化后,当接口准备就绪,向DMAC请求传输,DMAC再向CPU请求总线。当DMAC获得总线控制权后,按初始化程序规定的方式执行传输。传输过程本身不需CPU干预。在DMAC传输完成后,发出结束信号EOP,CPU可以查询EOP信号,以便进行后续数据处理。或者把EOP信号作为中断请求信号,CPU在中断处理程序中进行后续数据处理。
(四)DMA控制器的工作特点[1]
1.DMAC是一个接口电路,CPU可以通过其端口地址对DMAC进行读/写操作,以便对DMAC进行初始化或查询其状态。但它与一般的接口电路有显著的不同,DMAC可以获得系统总线控制权,当其获得系统总线控制权后,能提供一系列控制信号,像CPU一样操纵外设和内存之间的数据传输。即,DMAC有两种工作状态:
从模块状态(或称被动态):作为接口电路,受CPU控制
主模块状态(或称主动态):控制系统总线
2.DMAC控制内存和外设的数据传输方式,与CPU的方式完全不同。
CPU:
①.通过执行指令传输数据。
②.被传输的数据必须通过CPU累加器(AL/AX)中转。
DMAC:
①.通过硬件逻辑电路,用固定的顺序地址信号和读/写信号进行数据传输。
②.被传输的数据不送入DMAC内部中转,从“源”读得的数据保存在数据总线上,然后立即开始写操作,将数据写入“目的”。
正是由于DMAC的上述数据传输特点,使DMA传输可以达到很高的速度,这也是DMA(Direct Memory Access直接内存访问)的含义。
四、结论
实验证明,用DMA方式进行数据传输,可以把有限的单片机资源从烦琐的数据传输中解放出来,使之在系统的其他方面发挥更大的功能。 而用Intel 8237设计的DMA控制器和外设的连接电路简单,成本低廉,具有很高的实用价值。本文所提出的DMA模块及其接口只要稍作修改,就可以在数据采集场合应用。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。