基于GPIF的USB-ATA解决方案
扫描二维码
随时随地手机看文章
目前,通过单片机去控制硬盘的ATA接口,大多采用PIO模式实现,速度和性能上都不够理想,硬盘与PC机的连接也相当繁琐。要频繁地与PC机交换大量资料,采用USB硬盘是一个相当好的解决方案。本文给出一个如何利用单片机完成对硬盘的读写,同时具有USB-ATA功能的可行方案。
1 USB、GPIF、ATA接口
1.1 USB总线
USB(Universal Serial Bus)[4]是一种串行接口的新标准,其主要优点是速度快、功耗低、支持即插即用(Plug & Play)、使用安装方便。USB支持最多5个Hub层以及127个外设,所有外设通过协议共享USB的带宽。目前使用中的USB协议有1.0、1.1和2.0三个版本,通讯速率分别为1.5Mbps、12Mbps、480Mbps,USB协议向下兼容。
从逻辑结构上讲,USB数据的传输是通过管道进行的,管道的两端连接host和device的端点BUFFER,BUFFER的大小直接影响通讯的速率。USB系统软件通过缺省管道(与端点0相对应)管理设备,设备驱动程序通过其它管道来管理设备的功能接口。每一个USB设备在主机看来就是一个端点的集合,主机只能通过端点与设备进行通讯。在USB系统中,每一个端点都有唯一的地址,这是由设备地址和端点号给出的。每个端点都有一定的特性,其中包括:传输方式、总线访问频率、带宽、端点号、数据包的最大容量等。根据应用场合的不同选择相应的端点类型。USB数据流模型见图1。
1.2 GPIF
GPIF(general programmable interface)[1、2]即通用可编程接口,是CYPRESS公司在其EZ-USB FX以及FX2系列单片机里设计的一个可由用户编程的接口,具有快速、灵活等特点,可使用多种协议完成与外围器件的无缝连接,如EIDE/ATAPI、IEEE1284、Utopia等。对其可以根据需要进行编程,且运行中不需要CPU的干预,仅通过一些CPU标志和中断与增强型8051内核通讯。GPIF与8051内核的关系见图2。
GPIF主要组成部分:
(1)ADR[5..0]:地址线,可作为扩展存储器的低位地址,在连续执行GPIF动作时具有自动增一功能。可对其对应的寄存器进行读写(FX2系列中扩充为9根地址线)。
(2)RDY[5..0]:输入Ready信号,可对指定的信号进行连续采样,以确定GPIF动作继续、等待或是反复不断采样,直到信号的指定状态出现。通常用来等待指定信号的某个状态出现,然后继续剩余动作。
(3)CTL[5..0]:输出Control信号,根据编程指令输出高低电平或集电极开路。通常用作选通信号、非总线输出信号,以及产生简单的脉冲信号。
(4)FD[15..0]:双向FIFO数据线,一般又称AFI、BFI。
(5)IFCLK:时钟接口,决定使用外接时钟还是使用内部48MHz或30MHz时钟周期。
(6)GSTATE[2..0]:当前GPIF状态数,可用来判断当前GPIF工作状态,一般调试用。
(7)GPIF PROGRAM:GPIF程序存储区间0x7900~0x797F,存储GPIF指令,可存储4组波形的程序代码(FX2系列存储区间为0xE400~0xE47F)。
每个GPIF动作都由七段组成:Interval0~Interval6,简称I0~I6。执行完I0~I6的动作后,最后都进入IDLE(I7),即空闲状态,以准备启动下一次GPIF动作。每个Interval可以定义为Non-Decision Interval,简称NDP;或是Decision Point Interval,简称DP。
当某个Interval定义为NDP,在执行这个Interval动作时,只是简单地延时,用来确定产生指定电平的延续时间;而当Interval定义为DP时,它将根据RDY0~RDY5上的输入信号状态,以及内部FIFO的可编程标志和一个内部自定义的Internal Ready标志,将这些信号进行逻辑与、逻辑或,或是进行逻辑异或,根据得到的逻辑结果在I0~I6中选择下一个即将执行的Interval。在每个Interval执行时,都可指定CTL0~CTL5输出用户指定的状态。通过RDY和CTL以及内部一些标志位的组合,能完成各种复杂的时序电路的控制。
1.3 ATA接口
ATA[3]接口是在ST506基础上改进而成的,它将控制器集成到驱动器中,采用8个端口寄存器完成对硬盘的读写。这些端口寄存器统称为命令块寄存器,各寄存器功能见表1。ATA有两种工作模式:PIO模式和DMA模式。PIO传输模式是由处理器负责信息的传输,以扇区为单位,用中断请求方式与处理器进行数据交换。DMA传输模式分多点DMA和UDMA两种方式,其不需要处理器参与整个数据传输过程,而由I/O口直接将数据传送到存储器中,从而节约大量CPU时间,可更好地处理其他事务。UDMA中采用了冗余校验技术(CRC)。控制器对硬盘的操作分为两种:8位数据的命令操作和16位数据的数据传输操作。在对硬盘输出控制命令前,程序需对端口完整输出7字节的命令块。其中前六个端口输出为参数,最后一个端口为命令码。在读写数据端口时,以512个字节作为数据块进行读写。硬盘执行命令后,发出中断请求,表示操作结束(命令传输);或置控制器状态空闲,表示扇区请求传输(数据传输)。然后,控制器读取硬盘状态寄存器,检测硬盘操作的成功与否。操作正常,则进行下一次动作;否则,进入错误处理程序。状态寄存器各位信息描述见表2。
2 GPIF与ATA接口的硬件连接
GPIF与ATA接口的连接见表3。
其中PB[0..7]和PD[0..7]是双向FIFO数据线,用来连接数据线DD[0..15],进行数据的传送;PA3连接RESET信号线,对硬盘进行复位操作;ADR[0..2]与DA[0..2]连接,对寄存器选址;RDY0、RDY1分别与IORDY、IOCS16连接,使FIFO分别工作在8位的命令传输和16位的数据传输模式下。
3 软件设计流程
GPIF的程序存储区可存储4组波形的程序代码。一般情况下存储的4组波形分别用于单字节读、单字节写、多字节连续读、多字节连续写。对不同寄存器的读写操作将触发指定波形程序代码的执行,例如:读SGLDATLTRIG寄存器,GPIF将执行单字节读操作;而写SGLDATLTRIG寄存器,GPIF则执行单字节写操作。当GPIF处于IDLE方式时,可以对程序区进行读写操作,从而改变波形程序。对GPIF的编程,可采用CYPRESS公司提供的一个基于Windows界面的开发工具。这个工具使得对GPIF的编程成为一个填表式的选择过程。对所有选项选择完毕后,它将自动生成C51的源代码,完成初始化过程。现分别以EZ-USB FX系列和EZ-USB FX2系列中的GPIF为例,实现ATA接口中的PIO工作模式和UDMA工作模式。
在EZ-USB FX系列里,FIFO只有64字节大小,BULK端点BUFFER最大也只能设置为64字节。因此,用此系列的GPIF实现ATA接口的PIO模式比较合适。GPIF程序存储区分别存储单字节读、单字节写、多字节连续读、多字节连续写4条波形程序。单字节读、写操作时,选择数据宽度为8位,完成命令传输操作。多字节读、写操作时,选择数据宽度为16位,完成数据传输操作。USB数据上传给PC机,采用BULK方式。在EZ-USB FX系列中,端点2支持BULK方式,且可以设置成双缓冲模式。单字节读过程中,总线宽度为8位,RDY0信号接IORDY引脚,在每个Interval中可以根据选定的PIO模式指定合适的延时,也可以对IORDY信号采样,直到指定状态出现才继续动作。图3是根据PIO模式4采用GPIF产生的单字节读波形。单字节写波形的编程类似于单字节读过程,如图4所示。单字节操作一般用在命令传输中,数据传输则采用多字节读写操作,此时FIFO宽度为16,长度为64字节。与单字节操作不同的是,多字节读写操作在一次读写操作完成后,自动开始下一次读写操作,不需要再次触发,直到完成指定的次数,从而减少了CPU参与的时间。在对一个扇区进行操作时,总共需要连续进行256次读写。为此,设计一个连续64次读写的多字节读写操作程序,调用4次,则完成对一个扇区的读写。PIO模式流程图如图5所示。
在EZ-USB FX2系列中,GPIF功能进一步完善,能更好地与ATA接口连接,并可以支持UDMA功能。FX2系列支持USB2.0的控制芯片,BULK端点大小可以设置为512字节或是1024字节。为实现UDMA功能,FX2系列中的GPIF做了几方面的改善。先是让GPIF中的Slave FIFO与USB通讯中端点BUFFER直接建立连接,数据的传送不再需要CPU的参与。当端点BUFFER写满后,置BUFFER满标志位,而GPIF则根据此标志位停止读写动作。此外,GPIF中还多了一项Re-execute功能,即重复执行功能。设定此项后,GPIF可以不经过IDLE状态而根据采样RDY信号重复下一次动作,直到出现了指定的标志位后才停止动作。这项功能一般用于大批量数据的连续读写,如UDMA模式下对一个或多个扇区的读写操作。为完成UDMA模式下的CRC校验,FX2系列的芯片中还设置了特殊寄存器来完成CRC校验工作,具体使用详见芯片技术手册。可见,FX2系列芯片的GPIF能很好地胜任ATA接口中的UDMA模式传输。
上述方案较好地实现了USB-ATA的功能,并实现了PIO和UDMA两种模式。在运行中,GPIF不需要CPU的干预,仅通过一些CPU标志和中断与8051内核通讯,节约大量CPU资源。从该方案中还可以看出,EZ-USB FX以及FX2系列芯片的地址线、数据线都未用到。因此,在此方案上还可以进行其他扩展,从而实现基于硬盘的大容量数据采集系统,应用于某些特殊环境下的数据采集。