Как мне прошить светодиод, используя libftdi v0.18? - PullRequest
5 голосов
/ 25 августа 2010

Это чип FT2232D, а светодиод подключен к BDBUS6.

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

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

Обновление: я пробовал это, хотя ftdi_enable_bitbang () устарела.Следующий код компилируется, он работает без ошибок, но не мигает.Схемы рассматриваемого устройства доступны по адресу 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;
}

Ответы [ 3 ]

8 голосов
/ 06 мая 2011

Вам необходимо инициализировать контекст ftdi, прежде чем вы сможете открыть устройство с ним.

ftdi_init (& ftdic_context);

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

Вот функция, которую я использую для настройки контекста 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 голосов
/ 08 мая 2012
ftdi_enable_bitbang

устарела, вы должны использовать

ftdi_set_bitmode(&ftdic, LED,BITMODE_BITBANG);

Вместо этого см. Документацию :

1 голос
/ 25 августа 2010

Тот же ответ, что и здесь: У меня проблемы с поиском примера кода для режима libftdi mpsse (SPI)

http://flashrom.org/Downloads

В основном это режим MPSSE, но он также устанавливает сигнал nCS с помощью команды bitbang.

...