2010-08-25 15 views
5

È un chip FT2232D e il LED è collegato a BDBUS6.Come faccio a lampeggiare un LED, usando libftdi v0.18?

La libreria è meno documentata di quanto mi piacerebbe (meglio della stessa libreria di FTDI però, che non funziona nemmeno sui kernel moderni), l'unico codice di esempio che posso trovare utilizza una funzione deprecata (ho provato, non sembra funzionare), e sono assolutamente perplesso.

Più ci provo con questa cosa, più sembra difficile. Non sto cercando qualcuno che faccia i compiti per me tanto quanto ho bisogno di una spinta nella giusta direzione. Qualsiasi aiuto apprezzato (anche speculativo).

Aggiornamento: ho provato questo, anche se ftdi_enable_bitbang() è deprecato. Il seguente codice viene compilato, funziona senza barfare, ma non lampeggia. Schemi del dispositivo in questione sono disponibili su http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf, pagina 23. BDBUS6 e BDBUS7 sono collegati ai LED.

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <ftdi.h> 

#define FTDI_VID    0x0403 
#define FTDI_PID    0x6010 


static struct ftdi_context ftdic_context; 

int main(void) { 
     int ret; 
     unsigned int i; 
     unsigned char c = 0; 

     // Initialize bitbang. 
//  ret = ft2232_bb_init(); 

     ftdi_usb_open(&ftdic_context, FTDI_VID, FTDI_PID); 
     ftdi_set_interface(&ftdic_context, INTERFACE_B); 
     ftdi_enable_bitbang(&ftdic_context, 0xb0); 

     // Trying to blink some lights. 
     printf("\nNow let's try to blinkenlights...\n"); 
     for (i = 0; i < 20; i++) { 
       c ^= 0x80; 
       ftdi_write_data(&ftdic_context, &c, 1); 
       sleep(1); 
     } 

     return EXIT_SUCCESS; 
} 
+0

possibile duplicato [Ho difficoltà a trovare codice di esempio per la modalità mpsse (SPI) di libftdi.] (Http: // stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mpsse-spi-mode) –

+1

Non è un duplicato, ma è relativo al mio stesso progetto software. –

risposta

8

È necessario inizializzare il contesto ftdi prima di poter aprire un dispositivo con esso.

ftdi_init (& ftdic_context);

Inoltre, è necessario impostare il canale di interfaccia prima di aprire il dispositivo.

Heres la funzione che uso per istituire un contesto FTDI

int initFTDI(struct ftdi_context * ftdic) 
{ 
    unsigned char Mask = 0x1F; 
    int ret=0; 

    fprintf(stderr,"start init\n"); 

    ftdi_init(ftdic); 

    //for multi-channel ftdi chips eg(ft2232) 
    if(ftdi_set_interface(ftdic,INTERFACE_B)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if((ret = ftdi_usb_open(ftdic, VID, PID)) < 0){ 
     fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdic)); 
     return EXIT_FAILURE; 
    } 
    if(ftdi_usb_reset(ftdic)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_usb_purge_buffers(ftdic)) //clean buffers 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_write_data_set_chunksize(ftdic,65536)) //64k transfer size 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_read_data_set_chunksize(ftdic,4096)) //64k transfer size 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_event_char(ftdic,false,0)) //disable event chars 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_error_char(ftdic,false,0)) //disable error chars 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_latency_timer(ftdic,2)) //Set the latency timer to 1mS (default is 16mS) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_set_baudrate(ftdic,921600)) 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if(ftdi_setflowctrl(ftdic,SIO_RTS_CTS_HS)) //set flow control 
     fprintf(stderr,"%s\n",ftdi_get_error_string(ftdic)); 

    if ((ret = ftdi_set_bitmode(ftdic, 0x00, BITMODE_RESET)) < 0) 
    { 
     fprintf(stderr, "can't set bitmode to %x: %d (%s)\n", BITMODE_RESET, ret, ftdi_get_error_string(ftdic)); 
     fprintf(stderr, "RESET\n"); 
     return EXIT_FAILURE; 
    } 
    if ((ret = ftdi_set_bitmode(ftdic, Mask, BITMODE_BITBANG)) < 0) 

     fprintf(stderr, "can't set bitmode to %x: %d (%s)\n", BITMODE_BITBANG, ret, ftdi_get_error_string(ftdic)); 
     fprintf(stderr, "RESET\n"); 
     return EXIT_FAILURE; 
    } 

    //fprintf(stderr,"end init\n"); 

    return ret; 
} 
4
ftdi_enable_bitbang 

è deprecato, dovreste usare

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

invece, vedere la documentation:

+0

Vorrei solo che tu sappia che questo era quasi due anni fa. Non lavoro più nemmeno in quel posto ... mi hanno licenziato il giorno stesso in cui ho dimostrato di far funzionare la maledetta radio USB. –

Problemi correlati