D2XX在Linux Ubuntu 14.04 64位上从UART模式FTDI设备接收意外数据

时间:2015-03-02 07:54:37

标签: linux ubuntu microcontroller fpga ftdi

基于FPGA和微控制器的采集系统使用两个FTDI(FT2232H)器件。基本上,FPGA正在生成数据(尽可能快)并通过FT2232H(异步FIFO模式)发送到系统处理器。此外,微控制器通过UART模式下的另一个FTDI设备连接到系统处理器。

System Diagram description (可点击,来自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)
   }

系统规范:

  • Windows 7 64位,64GB RAM,SSD硬盘:
    • FIFO模式IC:D2XX库发布日期:2014-09-29
    • UART模式IC:VCP驱动程序发布日期:2014-09-29
  • Ubuntu 14.04 64位,8GB RAM,标准硬盘:
    • FIFO模式IC:D2XX库发布日期:2012-06-29,1.1.12
    • UART模式IC:D2XX库发布日期:2012-06-29,1.1.12

D2XX库用于两个FTDI设备,因为需要根据FTDI建议FTDI Drivers Installation Guide for Linux关闭USB-SERIAL驱动程序。使用一(1)个UART模式FTDI设备和USB-SERIAL驱动程序(Linux内核标准)时,应用程序不会收到意外结果。

感谢您的任何建议。

0 个答案:

没有答案