批量传输:用来传输大量数据而没有周期和传输速率严格要求的设备上。
d)同步传输:要求恒定速率,发送方和接收方都必须保证传输速率的匹配,不然会造成数据的丢失。
本系统中需要传输的数据量较大,且传输时机受设备控制。因此采用中断传输+批量传输的设计方法,即PC主机起始使用中断传输端点,采用中断传输方式轮询设备,如果发现设备有数据需要传输,立即转到批量传输端点,在真正的数据传输过程中,采用批量传输方式传输数据。
2 ISP1581简介
ISP1581是Philips公司推出的一种价格低、功能强大的USB设备接口芯片,完全符合USB2.0规范。ISP1581需外接微控制器或微处理器对它进行控制,它支持与大多数MCU和DSP的连接。ISP1581的外部接口有通用处理器模式和断开总线模式(由引脚BUS_CONF控制)。在断开总线模式下,处理器接口使用多路复用的8位地址/数据总线AD[7..0]和单独的DMA(直接存储器存取)总线DATA[15..0]。本系统采用断开总线模式、16位数据总线的MDMA(主机DMA)方式。
3 硬件设计
其中USB接口芯片选用ISP1581,EPLD选用EPM7128S,MCU选用的是Cygnal的c8051f120单片机。
系统设计思路如下:ISP1581和MCU的连接采用断开总线模式,数据传输使用MDMA模式,ISP1581的16位DMA总线与FIFO的输出端相连,A/D模块的16位数据输出总线与FIFO的输入端相连。FIFO的写信号由定时芯片8254根据A/D采样频率产生,FIFO的读信号直接由ISP1581的DIOR给出(MDMA模式下),MDMA开始传输信号也由8254产生,连接到MCU的一个中断引脚,用于启动MDMA。ISP1581和8254的片选信号以及8254的地址、数据、控制等信号均在EPLD内产生。通过8254和EPLD的设置,可以保证FIFO读和MDMA写时序的配合。在本系统中,c8051f02x需要大量访问ISP1581的内部寄存器,因为c8051f系列采用数据空间和I/O空间统一寻址方式,必须采用full memory模式,即将ISP1581作为一个普通外设映射到c8051f02x外部存储空间的I/O空间。
4 固件程序设计
本系统的固件程序包括单片机固件编程和EPLD方程设计两部分。单片机固件编程用于完成对ISP1581控制,处理主机发送来的一切请求,启动MD-MA开始传输命令等;EPLD方程设计用于产生各种外设的片选等,控制MDMA传输及FIFO、8254等外围芯片的时序配合。
4.1 单片机固件编程
单片机程序处理一切由主机发送来的USB请求(包括标准请求和自定义的厂商请求),并进行相应的数据接收和发送。本系统使用cygnal的e8051f系列单片机,所以相应使用该单片机配套的silieon Labora-tories IDE集成开发环境,采用C51语言编程,使用该系列单片机配套的U-EC3仿真器,可以设断点、在线编程、即时仿真、在线查看单片机内部寄存器的值。因为c8051f系列采用数据空间和I/O空间统一寻址方式,对ISP1581所有寄存器的访问均与单片机对普遍外设的访问方式相同。需要指出的是,C8051f12x系列单片机速度很快(快可以达到100 MHz),且指令较传统ISP8051系列有很大优化,大多数指令为单指令周期,这对提高DMA传输速度很有帮助,因为每次DMA传输有很多地方需要单片机的参与,具体参见下面"处理DMA请求"部分。下面重点论述使用MDMA部分的固件程序设计。
1)
MDMA传输初始化
功能包括:
a)设置DMA配置寄存器,指定DMA传输的数据总线位数(本系统用16位数据总线)。
b)设置DMA硬件寄存器,指定DMA传输方式(MDMA还是GDMA)以及设置DACK、DIOW、DIOR、DREQ信号的极性。本系统使用MDMA方式,设置这些信号为低有效。
c)设置DMA中断使能寄存器,激活指定中断源。我们设置可以产生DMA中断的源有内部EOT信号和DMA传输结束(即DMA传输计数器值变为0)。需要注意的是,此处DMA中断使能寄存器不同于ISP1581的中断寄存器,两者的设置方法不同。
d)设置选通时间寄存器,指定MDAMA方式下DIOW或DIOR的周期。应在满足ISF1581读写周期的前提下,使该周期尽可能小,这可以显著提高DMA传输速度。经测试,应设置该寄存器的值为0x01。这部分代码可以放在程序的起始部分,需要注意的是,在初始化ISP1581的各寄存器时,应首先设置DMA命令寄存器为Ox11,使其处于上电复位状态。
2)处理DMA请求
主机发送指定传输大小的DMA读的厂商请求后(传输大小应等于每个中断间隔内A/D采样数据大小,以保证所有采样数据不会丢失),单片机响应该请求,进入相应函数处理DMA请求。具体编程如下:
a)设置DMA端点寄存器,指定DMA传输使用的端点。需要注意,为防止DMA端点寄存器与当前使用的端点索引寄存器相同,应首先指定端点索引寄存器为一个与DMA端点寄存器不同的端点值。
b)设置DMA传输计数器寄存器,指定本次DMA传输的字节数。当然,这个数越大,DMA传输的速度越快,但笔者经过测试发现,该数不要大于65535,否则可能MDMA传输会失败。而且该数是512的整数倍,这可以保证没有短包传输。
c)设置DMA命令寄存器为0x06(表示MDMA读),开始MDMA传输。
d)程序应循环查询DMA中断寄存器的值,判断本次传输是否完成,如果完成,则清DMA中断寄存器,退出循环,完成本次DMA传输。
3)中断程序设计
本系统中需要用到2个外部中断,分别对应2个中断程序。第1个中断函数用于读出并保存当前所有ISP1581发出的中断的拷贝。注意,我们不仅要保存中断寄存器的值,还要保存DMA中断寄存器的值。需要强调的是,因为ISP1581是全中断驱动的,所有的信息交互都通过中断完成,PC机对ISP1581的任何操作都会引起ISP1581相应的中断,进而单片机通过查询1581中断寄存器判断并处理中断。第2个中断函数是8254发给单片机的,当完成指定周期的A/D数据采样后,8254通过本中断程序通知单片机启动MD-MA开始传输标识,即转到上述"处理DMA请求"部分,读FIFO中的数据。本系统设计8254每隔5 ms左右产生中断,进行DMA传输。
系统采用中断传输+批量传输的方法设计中断程序,即如果数据采集模块有数据需要传给主机,首先采用中断传输方式传输数据通知主机,方法是在本段函数的起始部分通过固定的中断传输端点发送8字节数据以与驱动程序部分吻合,然后使用批量传输端点实际传输数据;而主机端应用程序则不断轮询该中断传输端点,若接收到8个字节固定格式的数据,马上采用批量传输方式接收数据。该方法不但利用了中断传输方式的实时性(1 ms以内),而且充分利用了批量传输的高速率。若FIFO的读写和8254的时序设计得当,利用该方法,可以实现10 MB/s以上的数据录入。在实验中,我们已经做到了8 MB/s的录入速度。
USB驱动程序
[1]. EPM7128S datasheet https://www.dzsc.com/datasheet/EPM7128S_301040.html.
[2]. c8051f120 datasheet https://www.dzsc.com/datasheet/c8051f120_209854.html.
[3]. c8051f02x datasheet https://www.dzsc.com/datasheet/c8051f02x_209834.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。