Более подробно о ситуации: имеется ft245, подключённая по типовой схеме. Преобразователь ничего не получает от управляющего контроллера, т. е. RD# - выставлена в 1, WR - выставлена в 0. Но библиотечная функция ftdi_read_data () при обращении к этому устройству немедленно, не дожидаясь таймаута всегда возвращает 0. Если подставить вместо ftdi_read_data () ftdi_write_data - то всё нормально, данные уходят если управляющий контроллер их считывает, либо возвращается ошибка превышения таймаута, если контроллер данные не принимает. Где могут быть грабли, в какую сторону посоветуете копнуть ? (на всякий случай привожу проблемный код; при запуске программа почти сразу выдает "total read 0"):
Код
#include <cstdio>
#include <ftdi.h>
#define L 128
int main (void)
{
struct ftdi_context ftdi_context;
int ret, cnt = 0;
ftdi_init (&ftdi_context);
ret = ftdi_usb_open(&ftdi_context, 0x0403, 0x6001);
if (-5 == ret)
std :: fprintf (stderr, "wrn: retcode = -5\n");
else
if (0 > ret)
{
std :: fprintf (stderr,"unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string (&ftdi_context));
goto end;
}
for (int i = 0;i < 0x1;i++)
{
static unsigned char buffer[L];
int rd;
rd = ftdi_read_data (&ftdi_context, buffer, L);
if (0 > rd)
std :: fprintf (stderr,"error while read ftdi: %d (%s)\n", ret, ftdi_get_error_string (&ftdi_context));
else
cnt += rd;
}
printf ("total read %d\n", cnt);
ftdi_usb_close (&ftdi_context);
ret = 0;
end:
ftdi_deinit (&ftdi_context);
return ret;
}
#include <ftdi.h>
#define L 128
int main (void)
{
struct ftdi_context ftdi_context;
int ret, cnt = 0;
ftdi_init (&ftdi_context);
ret = ftdi_usb_open(&ftdi_context, 0x0403, 0x6001);
if (-5 == ret)
std :: fprintf (stderr, "wrn: retcode = -5\n");
else
if (0 > ret)
{
std :: fprintf (stderr,"unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string (&ftdi_context));
goto end;
}
for (int i = 0;i < 0x1;i++)
{
static unsigned char buffer[L];
int rd;
rd = ftdi_read_data (&ftdi_context, buffer, L);
if (0 > rd)
std :: fprintf (stderr,"error while read ftdi: %d (%s)\n", ret, ftdi_get_error_string (&ftdi_context));
else
cnt += rd;
}
printf ("total read %d\n", cnt);
ftdi_usb_close (&ftdi_context);
ret = 0;
end:
ftdi_deinit (&ftdi_context);
return ret;
}