Знакомимся с библиотекой libftdi и режимом bitbang
17 декабря 2018
Ранее в этом блоге многократно упоминались чипы производства компании FTDI, такие, как FT232RL и FT2232HL — смотри заметки раз, два и далее по ссылкам. В частности, было сказано, что этими чипами можно управлять с компьютера, что позволяет использовать их, например, в качестве программатора. При этом чипы FTDI поддерживают несколько режимов работы. Далее будет рассмотрен, пожалуй, самый простой режим под названием bitbang.
Подозреваю, что для многих читателей сего блога наличие режима bitbang в чипах FTDI не является большой новостью. Но мне подумалось, что для кого-то приведенная информация все же может быть интересной.
Не будем тянуть кота за хвост, и сразу перейдем к коду:
#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);
}
Компилируется программа так:
Как видите, здесь используется библиотека libftdi, при помощи которой мы и отдаем команды чипу. Интерфейс библиотеки незамысловат, поэтому я не буду подробно на нем останавливаться.
В режиме bitbang мы можем управлять восемью пинами чипа, подавая на них либо высокое, либо низкое напряжение. В приведенном примере меняется напряжения на пинах 13 (ADBUS0) и 14 (ADBUS1). На USB-донглах они обычно подписаны, как TX и RX соответственно. Существенное ограничение режима bitbang заключается в том, что мы можем только передавать данные, но не принимать. Однако и этого может быть достаточно для многих практических задач. К примеру, можно вывести что-то на HD44780-совместимый ЖК-индикатор, а воспользовавшись сдвиговыми регистрами и декодерами можно управлять светодиодными матрицами.
Удобство по сравнению с использованием МК заключается в том, что не нужно писать код, отвечающий за передачу данных с компьютера и их декодирование на стороне МК. А раз кода меньше, то меньше и багов. Плюс к этому, если мы хотим обновить приложение, обновление требуется установить только на компьютере. На железной стороне никакой прошивки нет, а значит нечего обновлять.
Из прочих режимов работы чипов FTDI особый интерес представляет режим MPSSE. С его помощью можно реализовывать последовательные интерфейсы, такие, как SPI или I2C, и передавать по ним данные со скоростями до 30 мбит/сек. Однако этот режим реализован не во всех чипах FTDI. В частности, FT232RL его не поддерживает. Увы, рассмотрение этого режима выходит за рамки данного поста.
Метки: C/C++, Электроника.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.