Crates.io | port-expander |
lib.rs | port-expander |
version | 0.6.3 |
source | src |
created_at | 2021-04-24 13:10:48.789403 |
updated_at | 2024-09-16 14:33:09.99912 |
description | Abstraction for I2C port-expanders |
homepage | |
repository | https://github.com/rahix/port-expander |
max_upload_size | |
id | 388974 |
size | 157,326 |
port-expander
This is a crate providing a common abstraction for I²C port-expanders. This
abstraction is not necessarily the most performant, but it allows using the pins
just like direct GPIOs. Because the pin types also implement the embedded-hal
digital IO traits, they can also be passed to further drivers downstream (e.g.
as a reset or chip-select pin).
// Initialize I2C peripheral from HAL
let i2c = todo!();
// A0: HIGH, A1: LOW, A2: LOW
let mut pca9555 = port_expander::Pca9555::new(i2c, true, false, false);
let pca_pins = pca9555.split();
let io0_0 = pca_pins.io0_0.into_output().unwrap();
let io1_5 = pca_pins.io0_1; // default is input
io0_0.set_high().unwrap();
assert!(io1_5.is_high().unwrap());
Sometimes timing constraints mandate that multiple pin accesses (reading or
writing) happen at the same time. The write_multiple()
and
read_multiple()
methods are designed for doing this.
The following list is what port-expander
currently supports. If you needs
support for an additional device, it should be easy to add. It's best to take
a similar existing implementation as inspiration. Contributions welcome!
port-expander
uses a custom trait for abstracting different kinds of mutexes:
PortMutex
.
This means you can also make the pins shareable across task/thread boundaries,
given that you provide an appropriate mutex type:
// Initialize I2C peripheral from HAL
let i2c = todo!();
// A0: HIGH, A1: LOW, A2: LOW
let mut pca9555: port_expander::Pca9555<std::sync::Mutex<_>> =
port_expander::Pca9555::with_mutex(i2c, true, false, false);
let pca_pins = pca9555.split();
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.