libftdi Archives
|
From: | Vojtech Michalek <vojtechuv@xxxxxxxxx> |
---|---|
To: | libftdi@xxxxxxxxxxxxxxxxxxxxxxx |
Date: | Thu, 5 Apr 2012 17:32:21 +0200 |
Hi all, I have an issue with Fast Opto-Isolated Serial Interface Mode on FT2232H. Reading from external device to PC works fine; however, writing does not work properly. The issue seems to lie in my code or libftdi, as it runs flawlessly while using proprietary linux drivers.
While using libftdi I can only send 3600 bytes, then I got error -1 (usb bulk write failed). It seems that the data are jammed inside the FTDI chip and some buffer becomes full (when I purge buffers using ftdi_usb_purge_rx_buffer before reaching 3600 bytes, I can send another bytes to the chip). FSDO pin is persistenly at high level (there is no signal switching) and FSCTS is kept low (unlike when using proprietary drivers, in that case the FSCTS signal goes high after initial drop).
Moreover, when I disconnect clock at FSCLK pin, also program using proprietary drivers jams after 3600 bytes are written. Here is the code I use: int main(int argc, char **argv) { struct ftdi_context ftdic; int f; unsigned long int sum; unsigned char buf[20]; char* descstring="USB <-> Serial Cable";
const char *errstr; if (ftdi_init(&ftdic) < 0) { fprintf(stderr, "ftdi_init failed\n"); return EXIT_FAILURE;
} if (ftdi_usb_open_desc(&ftdic, 0x0403, 0x6010, descstring, NULL) < 0) { fprintf(stderr,"Can't open ftdi device: %s\n",ftdi_get_error_string(&ftdic));
return EXIT_FAILURE; } else fprintf(stderr,"Device opened\n"); if (ftdi_set_interface(&ftdic, INTERFACE_A) < 0)
{ fprintf(stderr, "ftdi_set_interface failed\n"); return EXIT_FAILURE; } fprintf(stderr,"Interface set\n");
if(ftdi_set_latency_timer(&ftdic, 2)) { fprintf(stderr,"Can't set latency, Error %s\n",ftdi_get_error_string(&ftdic)); return EXIT_FAILURE;
} //ftdi_usb_purge_rx_buffer(&ftdic); //ftdi_usb_purge_tx_buffer(&ftdic); if (ftdi_usb_purge_buffers(&ftdic) < 0)
fprintf(stderr,"Purging buffers failed!\n"); else fprintf(stderr,"Purging rx and tx buffers succeeded\n"); f = ftdi_set_bitmode(&ftdic, 0x0, 0x10);
if (f < 0) printf("Error while setting bitmode\n"); f = ftdi_set_bitmode(&ftdic, 0x0, BITMODE_OPTO); //f = ftdi_set_bitmode(&ftdi, 0x0, 0x0);
if (f < 0) printf("\n"); printf("Writing...\n"); buf[0]=0xAB; sum=0; while(1) {
f = ftdi_write_data(&ftdic, buf, 20); errstr = strerror(errno); printf( "%s\n", errstr ); if (f < 0) fprintf(stderr,"write failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic));
else { sum+=f; fprintf(stderr,"%d byte(s) written successfully, %lu total\n",f,sum); fflush(stderr); //~ if (sum % 3500 == 0) //~ { //~ if (ftdi_usb_purge_rx_buffer(&ftdic)<0) //~ fprintf(stderr,"Rx buffer purge failed!\n");
//~ else //~ fprintf(stderr,"Rx buffer purged\n"); //~ } } fprintf(stderr,"RB offset: %u\n",ftdic.readbuffer_offset);
fprintf(stderr,"RB remaining: %u\n",ftdic.readbuffer_remaining); usleep(100000); } ftdi_usb_close(&ftdic); ftdi_free(&ftdic);
return 0; } Is there any obvious mistake? Have anyone successfully written to an external device using Fast Opto-Isolated Serial Interface Mode?
Thanks, Vojtech libftdi - see http://www.intra2net.com/en/developer/libftdi for details. |
Current Thread |
---|
|