Знакомимся с библиотекой libftdi и режимом bitbang

17 декабря 2018

Ранее в этом блоге многократно упоминались чипы производства компании FTDI, такие, как FT232RL и FT2232HL — смотри заметки раз, два и далее по ссылкам. В частности, было сказано, что этими чипами можно управлять с компьютера, что позволяет использовать их, например, в качестве программатора. При этом чипы FTDI поддерживают несколько режимов работы. Далее будет рассмотрен, пожалуй, самый простой режим под названием bitbang.

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

Не будем тянуть кота за хвост, и сразу перейдем к коду:

/* vim: set ai et ts=4 sw=4: */

#include <stdio.h>
#include <stdint.h>
#include <ftdi.h>

// see /usr/include/ftdi.h

#define VENDOR_ID   0x0403
#define PRODUCT_ID  0x6001

#define PIN_TX      0x01
#define PIN_RX      0x02
#define PIN_RTS     0x04
#define PIN_CTS     0x08
#define PIN_DTR     0x10
#define PIN_DSR     0x20
#define PIN_DCD     0x40
#define PIN_RI      0x80

int main() {
    uint8_t ctr = 0;
    struct ftdi_context ftdi;
    ftdi_init(&ftdi);

    if(ftdi_usb_open(&ftdi, VENDOR_ID, PRODUCT_ID) < 0) {
        printf("Can't open device\n");
        return 1;
    }

    ftdi_set_bitmode(&ftdi, 0xFF, BITMODE_BITBANG);

    for(;;) {
        uint8_t data = 0;
        ctr++;
        if(ctr & (1 << 0)) {
            data |= PIN_TX;
        }

        if(ctr & (1 << 1)) {
            data |= PIN_RX;
        }
        ftdi_write_data(&ftdi, &data, 1);
        sleep(1);
    }

    ftdi_disable_bitbang(&ftdi);
    ftdi_usb_close(&ftdi);
}

Компилируется программа так:

gcc -lftdi bitbang-ft232rl.c -o bitbang-ft232rl

Как видите, здесь используется библиотека libftdi, при помощи которой мы и отдаем команды чипу. Интерфейс библиотеки незамысловат, поэтому я не буду подробно на нем останавливаться.

В режиме bitbang мы можем управлять восемью пинами чипа, подавая на них либо высокое, либо низкое напряжение. В приведенном примере меняется напряжения на пинах 13 (ADBUS0) и 14 (ADBUS1). На USB-донглах они обычно подписаны, как TX и RX соответственно. Существенное ограничение режима bitbang заключается в том, что мы можем только передавать данные, но не принимать. Однако и этого может быть достаточно для многих практических задач. К примеру, можно вывести что-то на HD44780-совместимый ЖК-индикатор, а воспользовавшись сдвиговыми регистрами и декодерами можно управлять светодиодными матрицами.

Удобство по сравнению с использованием МК заключается в том, что не нужно писать код, отвечающий за передачу данных с компьютера и их декодирование на стороне МК. А раз кода меньше, то меньше и багов. Плюс к этому, если мы хотим обновить приложение, обновление требуется установить только на компьютере. На железной стороне никакой прошивки нет, а значит нечего обновлять.

Из прочих режимов работы чипов FTDI особый интерес представляет режим MPSSE. С его помощью можно реализовывать последовательные интерфейсы, такие, как SPI или I2C, и передавать по ним данные со скоростями до 30 мбит/сек. Однако этот режим реализован не во всех чипах FTDI. В частности, FT232RL его не поддерживает. Увы, рассмотрение этого режима выходит за рамки данного поста.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.