#no-std #no-alloc #mcp23017

no-std mcp23017-driver

A comprehensive Rust driver for the Microchip MCP23017 IO expander

3 releases

new 0.1.2 Mar 8, 2025
0.1.1 Mar 8, 2025
0.1.0 Jan 20, 2025

#1814 in Embedded development

MIT license

26KB
564 lines

A comprehensive Rust driver for the Microchip MCP23017 IO expander.

  • Split a device into individual embedded-hal pins.
  • Configure modes, pull-ups, and interrupt triggers with a type-level API.
  • Service interrupts efficiently with a centralized controller.

For usage details and explanatory notes, see the documentation.

Overview

let i2c = todo!(/* Setup I2C */);

// Setup a device:
const ADDRESS: u8 = 0x20;
let mut device = Mcp23017::<_, ADDRESS>::new(i2c);
let (pins, mut interrupt_controller) = device.split()?;

// Use a pin as an output:
let mut pin = pins.a0.into_push_pull_output()?;
pin.set_high()?;
pin.is_set_high()?;

// Use another pin as an input:
let mut pin = pins.a1.into_pull_up_input()?;
pin.is_high()?;

// Configure an input pin for interrupts:
let pin = pin.enable_interrupt(Sense::Edge)?;
// When an interrupt occurs,
// immediately notify the controller...
interrupt_controller.interrupt(Bank::A)?;
// ...and later query it about the cause:
interrupt_controller.triggered(&pin);

Dependencies

~1.4–1.9MB
~37K SLoC