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