2015-10-16 46 views
1

我正在使用連接到FPGA的FT232H器件,並且正在嘗試向其寫入一些字節。讀取(傳送FPGA→PC)完美工作,但寫入(傳送PC→FPGA)完全不起作用。我正在使用以下代碼:使用FT245同步模式寫入芯片

libusb_open(board, &board_handle); 
if (libusb_kernel_driver_active(board_handle, 0) == 1) { 
    if(libusb_detach_kernel_driver(board_handle, 0) == 0); 
} 
libusb_set_configuration(board_handle, 1); 
libusb_claim_interface(board_handle, 0); 
libusb_control_transfer(board_handle, 0x40, 0x0B, 0x00FF, 0x01, NULL, 0, 5000); 
libusb_control_transfer(board_handle, 0x40, 0x0B, 0x40FF, 0x01, NULL, 0, 5000); 
libusb_bulk_transfer(board, 0x02, bufout, 3, &transfered, 5000); 
bufin = calloc(512, 1); 
libusb_bulk_transfer(board, 0x81, bufin, 512, &transfered, 5000); 

Bufout中充滿了數據。當我試圖將在FPGA上生成的一些數據發送到PC時,沒有問題; bufin填充了正確的數據。

但是,當我試圖發送一些數據到FPGA,並顯示它在LED或發回它,問題開始。

無論bufout的內容如何,​​我在FPGA站點上接收到的每個字節都是0xFF。 Bufoutbufin都被聲明爲無符號字符*。

unsigned char *bufin, *bufout; 

令人驚訝的(或不)接收到的字節數FPGA匹配由PC sended的字節數,但所有字節具有值爲0xFF。

我做錯了什麼?

我試過使用libftdi,但效果是一樣的(不奇怪libftdi是使用libusb作爲引擎我認爲)。

也許我忘了在主機端調用一些重要的功能?在FPGA上側

代碼也很簡單:

process(ftdi_clk, sys_rst) 
begin 
    if sys_rst = '0'then 
     ftdi_wr <= '1'; 
     ftdi_data <= "ZZZZZZZZ"; 
     ftdi_rd <= '1'; 
     ftdi_oe <= '1'; 
     read <= '1'; 
    elsif rising_edge(ftdi_clk) then 
     if ftdi_txe = '0' then 
      ftdi_wr <= '0'; 
      ftdi_data <= buf; 
     else 
      ftdi_wr <= '1'; 
      ftdi_data <= "ZZZZZZZZ"; 
     end if; 
     if (read = '0') and (ftdi_rxf = '0') then 
      ftdi_rd <= '0'; 
      buf <= ftdi_data; 
     else 
      ftdi_rd <= '1'; 
     end if; 
     if ftdi_rxf = '0' then 
      ftdi_oe <= '0'; 
      read <= '0'; 
     else 
      ftdi_oe <= '1'; 
      read <= '1'; 
     end if; 
    end if; 
end process; 

編輯:我已經檢查了所有可能的電氣配置,上拉,I/O電壓,一切似乎罰款。仍然所有從FTDI傳輸到FPGA的數據都是1,在2個獨立的芯片上檢查,所以很可能這是一個軟件問題。我已經檢查過仿真,即使是適配後的仿真,通信也應該按照文檔工作。

編輯2:我曾嘗試與原始供應商庫。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ftd2xx.h> 

int main(){ 
    FT_STATUS ftStatus; 
    FT_HANDLE ftHandle; 
    DWORD BytesWritten; 
    unsigned char data[512]; 
    int i; 
    FT_PROGRAM_DATA ftData = { 
    0x00000000, 0xFFFFFFFF, // Headers 
    0x00000005, // Version (5 = 232H) 
    0x0403, 0x6014, // VID:PID 
    "StackOverflow", "Stack", "StackBoard", NULL, 
    500, 0, 1, 1, // MaxPower, PnP, SelfPowered, Remote WakeUp 
    // FT232B 
    0, 0, 0, 0, 0, 0, 0, 
    // FT2232 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    // FT232R 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    // FT2232H 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 
    // FT4232H 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 
    // FT232H 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
    0, 0, 0, 0, 0, 0, 0, 
    }; 
    ftStatus = FT_Open(0, &ftHandle); 
    ftStatus = FT_SetTimeouts(ftHandle, 5000, 5000); 
    ftStatus = FT_EE_Program(ftHandle, &ftData); 
    ftStatus = FT_EE_Program(ftHandle, &ftData); 
    ftStatus = FT_SetBitMode(ftHandle, 0xFF, FT_BITMODE_SYNC_FIFO); 
    for(i = 0; i<512; i++) data[i] = 0x02; 
    ftStatus = FT_Write(ftHandle, data, 512, &BytesWritten); 
    printf("%d bytes written\n", BytesWritten); 
    ftStatus = FT_Read(ftHandle, &data, 512, &BytesWritten); 
    printf("%d bytes read\n", BytesWritten); 
    for(i = 0; i<BytesWritten; i++) printf("%#2x ", data[i]); 
    FT_Close(ftHandle); 
} 

還是完全一樣的行爲。我已將Linux內核更新爲最新版本(4.2.3),但結果相同。可悲的是我檢查了幾臺不同的機器和3個不同的芯片。

+0

如果您嘗試將數據發送到另一臺PC上的終端仿真器,它會通過嗎? –

+0

我有一個非常模糊的記憶,但也許它會給你一個線索。是否沒有必須編寫觸發閱讀的序列?就像,從地址A讀取X個字節? –

+0

據我所知,這是CPU模式的工作原理。但是我處於FIFO模式,EEPROM編程爲FIFO模式。 (http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232H.pdf第27頁)。我正在密切關注文檔中的波形。但實際上讀取數據總線的時間總是包含0xFF,我將檢查FPGA內部的上拉/下拉配置,可能這是一個問題。 – mucka

回答

0

不知道這是你唯一的問題,但我認爲你的ftdi_data有一些短路。它可以在ftdi_oe處於活動狀態的同時由FPGA驅動。