← На главную

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

Ранее в этом блоге многократно упоминались чипы производства компании 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 его не поддерживает. Увы, рассмотрение этого режима выходит за рамки данного поста.