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