基于FPGA和微控制器的采集系统使用两个FTDI(FT2232H)器件。基本上,FPGA正在生成数据(尽可能快)并通过FT2232H(异步FIFO模式)发送到系统处理器。此外,微控制器通过UART模式下的另一个FTDI设备连接到系统处理器。
(可点击,来自http://postimg.org/image/ovpov6ujv/)
整个系统已经成功在Windows平台上运行,使用D2XX驱动程序在FTDI模式下达到~95MB / s。另一个FTDI设备IC使用虚拟COM驱动程序连接,不测量数据吞吐量(不需要快速)。
在Linux上,结果有所不同。对于两种器件(UART和FIFO模式),使用FTDI的D2XX直接驱动器。
通过FIFO模式IC传输的数据是丢弃字节(约占总数据的10%,30MB)。 UART模式IC接收的数据包含意外值。即使微控制器不通过UART发送任何数据,函数FT_GetQueueStatus也会无错误地返回,并且字段RxBytes大于零(0)。收到的数据通常是0x01和0x60,是倍数。当延迟时间改变时频率改变。 下面是测试用例的详细信息。
设置设备:
ftStatus |= FT_ResetDevice(*ftHandle); //Reset USB device
ftStatus |= FT_Purge(*ftHandle, FT_PURGE_RX | FT_PURGE_TX); // Purge transmit and receive buffers
ftStatus |= FT_SetUSBParameters(*ftHandle, USB_TRANSFER_SIZE, 0); //Set USB request transfer size
ftStatus |= FT_SetTimeouts(*ftHandle, 100, 100); //Sets the read and write timeouts in milliseconds for the FT2232H
ftStatus |= FT_SetLatencyTimer(*ftHandle, 4); //Set the latency timer
//对于使用UART模式的设备,还会执行以下功能:
if(serial) {
ftStatus |= FT_SetBitMode(*ftHandle, 0x00, 0); //Turn off bit bang mode
ftStatus |= FT_SetBaudRate(*ftHandle, 9600); // Set baud rate to 9600
ftStatus |= FT_SetDataCharacteristics(*ftHandle, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE); // Set to communicate at 8N1
ftStatus |= FT_SetFlowControl(*ftHandle, FT_FLOW_NONE, 0, 0); // Disable hardware / software flow control
}
读取数据:
dwNumInputBuffer = USB_TRANSFER_DATA_SIZE;
ftStatus = FT_Read(ftHandle, &InputBuffer, dwNumInputBuffer,
&dwNumBytesRead); //Read out the data from input buffer
if (ftStatus != FT_OK) {
printf("Fail reading from USB device!\n");
done = 1;
}
if (dwNumBytesRead > 0) {
// move the data to other location memory (and process once all the expected data is received)
}
系统规范:
D2XX库用于两个FTDI设备,因为需要根据FTDI建议FTDI Drivers Installation Guide for Linux关闭USB-SERIAL驱动程序。使用一(1)个UART模式FTDI设备和USB-SERIAL驱动程序(Linux内核标准)时,应用程序不会收到意外结果。
感谢您的任何建议。