2010-08-25 13 views
5

Es ist ein FT2232D-Chip, und die LED ist mit BDBUS6 verbunden.Wie blitze ich eine LED mit libftdi v0.18?

Die Bibliothek ist weniger dokumentiert als ich möchte (besser als die eigene Bibliothek von FTDI, die nicht einmal auf modernen Kernel funktioniert), der einzige Beispielcode, den ich finden kann, der eine veraltete Funktion verwendet (Ich habe versucht, es scheint nicht zu funktionieren), und ich bin absolut ratlos.

Je härter ich versuche mit dieser Sache, desto schwieriger scheint es. Ich suche nicht nach jemandem, der meine Hausaufgaben für mich macht, sondern ich brauche nur einen Anstoß in die richtige Richtung. Jede Hilfe wird geschätzt (sogar spekulativ).

Update: Ich habe dies versucht, obwohl FTDI_enable_bitbang() veraltet ist. Der folgende Code kompiliert, es läuft ohne zu barfingen, aber kein blinkenlighten. Die Schaltpläne des betreffenden Geräts sind unter http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf, Seite 23, verfügbar. BDBUS6 und BDBUS7 sind an die LEDs angeschlossen.

#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

möglich Duplikat [Ich habe Probleme, Beispielcode für libfdi's MPSS (SPI) -Modus zu finden.] (Http: // stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mssse-spi-mode) –

+1

Nicht ein Duplikat, aber bezogen auf das gleiche Software-Projekt von mir. –

Antwort

8

Sie müssen den FTDI-Kontext initialisieren, bevor Sie ein Gerät damit öffnen können.

ftdi_init (& ftdic_context);

Auch müssen Sie den Schnittstellenkanal einstellen, bevor Sie das Gerät öffnen.

Heres die Funktion Ich benutze einen ftdi Kontext einzurichten

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 

ist veraltet, Sie

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

stattdessen verwenden sollten, finden Sie in der documentation:

+0

Ich möchte nur, dass Sie wissen, dass dies vor fast zwei Jahren war. Ich arbeite nicht einmal mehr an diesem Ort ... sie haben mich von dem Tag an entlassen, an dem ich gezeigt habe, wie das verdammte USB-Radio funktioniert. –