#ftdi #embedded-devices #usb #usb-device #hal #io

dev ftdi-embedded-hal

embedded-hal implementation for FTDI USB devices

14 releases (breaking)

new 0.21.1 Mar 27, 2024
0.20.0 Dec 14, 2023
0.19.0 Nov 29, 2023
0.16.0 Jul 6, 2023
0.10.0 Nov 9, 2021

#80 in Embedded development

Download history 61/week @ 2023-12-04 272/week @ 2023-12-11 231/week @ 2023-12-18 39/week @ 2023-12-25 37/week @ 2024-01-01 105/week @ 2024-01-08 39/week @ 2024-01-15 266/week @ 2024-01-22 444/week @ 2024-01-29 605/week @ 2024-02-05 687/week @ 2024-02-12 334/week @ 2024-02-19 548/week @ 2024-02-26 527/week @ 2024-03-04 333/week @ 2024-03-11 232/week @ 2024-03-18

1,644 downloads per month
Used in 4 crates

MIT and maybe LGPL-2.1 AND MIT

82KB
1.5K SLoC

Maintenance crates.io docs.rs Build Status

ftdi-embedded-hal

This is an embedded-hal implementation for the FTDI chips that can use various drivers including libftd2xx and ftdi-rs.

This enables development of embedded device drivers without the use of a microcontroller. The FTDI devices interface with PC via USB, and provide a multi-protocol synchronous serial engine to interface with most GPIO, SPI, I2C embedded devices.

Note: This is strictly a development tool. The crate contains runtime borrow checks and explicit panics to adapt the FTDI device into the embedded-hal traits.

Quickstart

  • Enable the "libftd2xx-static" feature flag to use static linking with libftd2xx driver.
  • Linux users only: Add udev rules.
[dependencies.ftdi-embedded-hal]
version = "0.21.1"
features = ["libftd2xx", "libftd2xx-static"]

Limitations

  • Limited trait support: SPI, I2C, Delay, InputPin, and OutputPin traits are implemented.
  • Limited device support: FT232H, FT2232H, FT4232H.
  • Limited SPI modes support: MODE0, MODE2.

Examples

SPI

Pin setup:

  • D0 - SCK
  • D1 - SDO (MOSI)
  • D2 - SDI (MISO)
  • D3..D7 - Available for CS

Communicate with SPI devices using ftdi-rs driver:

use ftdi_embedded_hal as hal;

let device = ftdi::find_by_vid_pid(0x0403, 0x6010)
    .interface(ftdi::Interface::A)
    .open()?;

let hal = hal::FtHal::init_freq(device, 3_000_000)?;
let spi = hal.spi()?;

Communicate with SPI devices using libftd2xx driver:

use ftdi_embedded_hal as hal;

let device = libftd2xx::Ft2232h::with_description("Dual RS232-HS A")?;

let hal = hal::FtHal::init_freq(device, 3_000_000)?;
let spi = hal.spi()?;

I2C

Communicate with I2C devices using ftdi-rs driver:

use ftdi_embedded_hal as hal;

let device = ftdi::find_by_vid_pid(0x0403, 0x6010)
    .interface(ftdi::Interface::A)
    .open()?;

let hal = hal::FtHal::init_freq(device, 400_000)?;
let i2c = hal.i2c()?;

Communicate with I2C devices using libftd2xx driver:

use ftdi_embedded_hal as hal;

let device = libftd2xx::Ft232h::with_description("Single RS232-HS")?;

let hal = hal::FtHal::init_freq(device, 400_000)?;
let i2c = hal.i2c()?;

GPIO

Control GPIO pins using libftd2xx driver:

use ftdi_embedded_hal as hal;

let device = libftd2xx::Ft232h::with_description("Single RS232-HS")?;

let hal = hal::FtHal::init_default(device)?;
let gpio = hal.ad6();

Control GPIO pins using ftdi-rs driver:

use ftdi_embedded_hal as hal;

let device = ftdi::find_by_vid_pid(0x0403, 0x6010)
    .interface(ftdi::Interface::A)
    .open()?;

let hal = hal::FtHal::init_default(device)?;
let gpio = hal.ad6();

More examples

Dependencies

~0.2–1.7MB
~20K SLoC