GitXplorerGitXplorer
R

port-expander

public
18 stars
14 forks
5 issues

Commits

List of commits on branch main.
Unverified
c269fd96de6f92168bf5de5d87d6c04c5e710fe1

Prepare 0.6.3

RRahix committed 4 months ago
Unverified
c7823bf4a1b1af0ba6cd001daec33d836206dcde

Update README

RRahix committed 5 months ago
Unverified
5da0e25df405334739369d33e02a06890a96e26d

Update CHANGELOG

RRahix committed 5 months ago
Verified
8b02bfdd2d5740cdec3947966b9726d4400e71d6

Add PCA9554 & PCA9554A support

jjacobzlogar committed 5 months ago
Unverified
9679b16653b0f1cf73e6a012766ec8527114aa3a

Add 0.5.1 to main CHANGELOG

RRahix committed 6 months ago
Unverified
c69187bd0905d6aa60253171ae94a36630f2bda1

Prepare 0.6.2

RRahix committed 6 months ago

README

The README file for this repository.

port-expander crates.io page docs.rs page

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).

Example

// 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());

Accessing multiple pins at the same time

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.

Supported Devices

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!

Non-local sharing

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();

License

Licensed under either of

at your option.

Contribution

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.