2010-08-25 21 views
5

Il s'agit d'une puce FT2232D, et la LED est connectée à BDBUS6. La bibliothèque est moins documentée que je ne le souhaite (mieux que la propre bibliothèque de FTDI, qui ne fonctionne même pas sur les noyaux modernes), le seul exemple de code que je peux trouver qui utilise une fonction dépréciée (j'ai essayé, ça ne semble pas marcher), et je suis absolument perplexe.Comment faire pour éclairer une LED en utilisant libftdi v0.18?

Plus j'essaie avec cette chose, plus cela semble difficile. Je ne cherche pas quelqu'un pour faire mes devoirs pour moi autant que j'ai juste besoin d'un coup de pouce dans la bonne direction. Toute aide appréciée (même spéculative). Mise à jour: J'ai essayé cela, mais ftdi_enable_bitbang() est obsolète. Le code suivant compile, il fonctionne sans barfing, mais pas blinkenlighten. Les schémas de l'appareil en question sont disponibles au http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf, page 23. BDBUS6 et BDBUS7 sont raccordés aux 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

double possible [J'ai du mal à trouver un exemple de code pour le mode mpsse (SPI) de libftdi.] (Http: // stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mpsse-spi-mode) –

+1

Pas un doublon, mais lié au même projet logiciel que le mien. –

Répondre

8

Vous devez initialiser le contexte ftdi avant de pouvoir ouvrir un périphérique avec celui-ci.

ftdi_init (& ftdic_context);

Vous devez également définir le canal d'interface avant d'ouvrir l'appareil.

Heres la fonction que j'utilise pour mettre en place un contexte 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 dépréciée, vous devez utiliser

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

à la place, voir le documentation:

+0

Je voudrais juste que vous sachiez que c'était il y a près de deux ans. Je ne travaille même plus à cet endroit ... ils m'ont mis à l'écart le jour même où j'ai manifesté pour faire fonctionner cette fichue radio USB. –