2010-08-25 3 views
5

Это чип FT2232D, а светодиод подключен к BDBUS6.Как прожечь светодиод, используя libftdi v0.18?

Библиотека менее документирована, чем мне хотелось бы (лучше, чем собственная библиотека FTDI, хотя и не работает на современных ядрах), единственный пример кода, который я могу найти, который использует устаревшую функцию (я пытался, он, похоже, не работает), и я абсолютно в тупике.

Чем сложнее я стараюсь с этой штукой, тем сложнее она кажется. Я не ищу, чтобы кто-то выполнял мою домашнюю работу для меня, так как мне просто нужно подтолкнуть в правильном направлении. Любая помощь оценивалась (даже спекулятивная).

Обновление: Я пробовал это, хотя ftdi_enable_bitbang() устарел. Следующий код компилируется, он работает без barfing, но не blinkenlighten. Схемы данного устройства доступны по адресу http://www.semtech.com/images/datasheet/sx1211ska_v1_std.pdf, стр. 23. BDBUS6 и BDBUS7 подключены к светодиодам.

#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

возможный дубликат [Мне не удается найти пример кода для режима mpsse (SPI) для libftdi.] (Http: // stackoverflo w.com/questions/3527464/im-having-trouble-finding-example-code-for-libftdis-mpsse-spi-mode) – 2010-08-25 19:51:51

+1

Не дубликат, но связанный с тем же программным проектом. –

ответ

8

Прежде чем вы сможете открыть устройство, вам необходимо инициализировать контекст ftdi. (& ftdic_context);

Также необходимо установить интерфейсный канал перед открытием устройства.

Heres функция Я использую, чтобы создать контекст 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; 
} 
1

тот же ответ, как здесь: I'm having trouble finding example code for libftdi's mpsse (SPI) mode

http://flashrom.org/Downloads

Ее в основном режиме MPSSE, но он также устанавливает NCS сигнал с помощью BitBang команды.

+0

Если у вас есть более глубокое понимание того, где и как это делается, я бы хотел услышать об этом. Я просто не вижу этого в текущей версии. –

4
ftdi_enable_bitbang 

осуждается, следует использовать

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG); 

вместо см documentation:

+0

Я бы хотел, чтобы вы знали, что это было почти два года назад. Я даже больше не работаю в этом месте ... они уложили меня в тот самый день, когда я продемонстрировал, как работает проклятое USB-радио. –