2015-10-16 5 views
1

Я использую устройство FT232H, подключенное к FPGA, и я пытаюсь записать в него несколько байтов. Чтение (передача FPGA-> ПК) отлично работает, но запись (передача 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 на ПК, проблем нет; bufin заполнен правильными данными.

Но когда я пытаюсь отправить некоторые данные в ПЛИС, и отображать их на светодиодах или отправлять обратно, проблема начинается.

Каждый байт, который я получаю на сайте FPGA, равен 0xFF независимо от bufout. Bufout и bufin оба объявлены как unsigned char *.

unsigned char *bufin, *bufout; 

Удивительно (или нет) количество байт, полученных FPGA совпадает с числом байтов отослано на ПК, но все байты имеют значение 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; 

EDIT: Я проверил все возможные электрические конфигурации, подтягивания, I/O напряжение и все, кажется, хорошо. Тем не менее все данные, переданные из FTDI в FPGA, являются одними, проверены на 2 отдельных чипах, поэтому, скорее всего, это проблема программного обеспечения. Я проверил моделирование, даже после моделирования, связь должна работать в соответствии с документацией.

EDIT2: Я пробовал с оригинальными библиотеками поставщиков.

#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

Если вы попытаетесь отправить данные на эмулятор терминала на другом ПК, пройдет ли он? –

+0

У меня очень неопределенная память, но, возможно, это даст вам ключ. Разве нет последовательности, которую вы должны написать для запуска чтения? Что-то вроде, прочитайте X байт с адреса A? –

+0

Как я понимаю из документации, так работает режим ЦП. Но я в режиме FIFO, EEPROM запрограммирован для режима FIFO. (http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232H.pdf стр. 27). Я внимательно слежу за формами волн из документации. Но практически все время, когда чтение выполняется, шина данных содержит 0xFF, я проверю настройку pull-up/pull-down внутри FPGA, возможно, это проблема. – mucka

ответ

0

Не уверен, что это ваша единственная проблема, но я думаю, что на ftdi_data происходит короткое замыкание. Он может управляться FPGA одновременно с активностью ftdi_oe.

 Смежные вопросы

  • Нет связанных вопросов^_^