2010-08-25 6 views
5

Es un chip FT2232D, y el LED está conectado a BDBUS6.¿Cómo flasheo un LED, usando libftdi v0.18?

La biblioteca está menos documentada de lo que me gustaría (mejor que la propia biblioteca de FTDI, que ni siquiera funciona en núcleos modernos), el único código de ejemplo que encuentro es que usa una función obsoleta (lo intenté, parece que no funciona), y estoy absolutamente perplejo.

Cuanto más intento con esto, más difícil me parece. No estoy buscando a alguien que haga mi tarea por mí, solo necesito un empujón en la dirección correcta. Cualquier ayuda apreciada (incluso especulativa).

Actualización: He estado intentando esto, aunque ftdi_enable_bitbang() está en desuso. El siguiente código se compila, se ejecuta sin desbordamiento, pero no parpadea. Los esquemas del dispositivo en cuestión están disponibles en http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf, página 23. BDBUS6 y BDBUS7 están conectados a los 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

posible duplicado de [Tengo problemas para encontrar el código de ejemplo para el modo mpsse (SPI) de libftdi.] (Http: // stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mpsse-spi-mode) –

+1

No es un duplicado, pero está relacionado con el mismo proyecto de software mío. –

Respuesta

8

Debe inicializar el contexto ftdi antes de poder abrir un dispositivo con él.

ftdi_init (& ftdic_context);

También debe configurar el canal de interfaz antes de abrir el dispositivo.

Aquí está la función que utilizo para establecer un contexto 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 

está en desuso, se debe utilizar

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

lugar, ver el documentation:

+0

Me gustaría que supieras que esto fue hace casi dos años. Ya ni siquiera trabajo en ese lugar ... me abandonaron el mismo día en que demostré que funcionaba la maldita radio USB. –

Cuestiones relacionadas