libftdi Archives

Subject: Writing in BITMODE_OPTO with FT2232H

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.
To unsubscribe send a mail to libftdi+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx


Current Thread