#hal #io #driver #embedded-hal-i2c #i2c-expander #base-address

无需std pca9548a

使用嵌入式-hal的PCA9548a I2C-Expander驱动程序

1个不稳定版本

0.1.0 2024年5月3日

646嵌入式开发

每月29次下载

MIT 许可证

14KB
203

PCA9548A 驱动程序

使用嵌入式-hal的PCA9548a I2C-Expander驱动程序。

简单用法

您可以选择一个或多个通道进行激活。

use pca9548a::{Pca9548a, BASE_ADDRESS};
use embedded_hal::i2c::I2c;

let pca = Pca9548a::<std::sync::Mutex<_>>::new(i2c_bus, BASE_ADDRESS);

// `select_*()` returns an i2c-bus that can be used to perform transactions.
pca.select_single(0).unwrap().write(0x42, &[1, 2]).unwrap();
pca.select_mask(1 << 2 | 1 << 3).unwrap().write(0x42, &[1, 2]).unwrap();

子总线

通常您会希望使用预期拥有类型实现 I2c 的设备驱动程序。

为此,提供了一个代理类型 SubBus,它实现了 embedded_hal::i2c::I2c/embedded_hal_async::i2c::I2c(根据底层的互斥锁和i2c总线实现)。

您甚至可以使用它级联PCA9548A

use pca9548a::{Pca9548a, BASE_ADDRESS};

let pca = Pca9548a::<std::sync::Mutex<_>>::new(i2c_bus, BASE_ADDRESS);
// NOTE: If you chain PCA9548As, they must have different addresses
let pca_0 = Pca9548a::<std::sync::Mutex<_>>::new(pca.single_subbus(0), BASE_ADDRESS + 1);
let pca_1 = Pca9548a::<std::sync::Mutex<_>>::new(pca.single_subbus(1), BASE_ADDRESS + 1);
let pca_1_7 = Pca9548a::<std::sync::Mutex<_>>::new(pca_1.single_subbus(7), BASE_ADDRESS + 2);

// This will correctly select the channel 1 on pca, then channel 7 on pca_1, then channel 3 on pca_1_7
// before writing [1, 2] to address 0x42.
pca_1_7.select_single(3).unwrap().write(0x42, &[1, 2]).unwrap();

关于SharedBus的说明

此驱动程序需要类似 shared_bus crate对底层i2c总线的共享访问。使用互斥锁来实现这一点。

在选择一组通道时,返回对i2c-bus的锁;这可以用来执行事务,并在您完成之前防止其他任务更改选择。

然而,这假设 Pca9548a 结构对底层i2c总线具有 独占 访问权。如果您使用 shared_bus 或类似,您必须确保其他任务无法更改选择,因为这可能会破坏选择正确通道的保证。

依赖项

~78KB