#i2c-driver #i2c #driver #switch #embedded-hal-driver

no-std xca9548a

适用于TCA954xA和PCA954xA I2C开关/多路复用器的跨平台Rust驱动程序

4个版本 (1个稳定版)

1.0.0 2024年8月5日
0.2.1 2020年8月13日
0.2.0 2019年10月3日
0.1.0 2018年9月27日

#1507嵌入式开发

Download history • Rust 包仓库 61/week @ 2024-05-03 • Rust 包仓库 125/week @ 2024-05-10 • Rust 包仓库 93/week @ 2024-05-17 • Rust 包仓库 51/week @ 2024-05-24 • Rust 包仓库 65/week @ 2024-05-31 • Rust 包仓库 79/week @ 2024-06-07 • Rust 包仓库 48/week @ 2024-06-14 • Rust 包仓库 91/week @ 2024-06-21 • Rust 包仓库 24/week @ 2024-06-28 • Rust 包仓库 39/week @ 2024-07-05 • Rust 包仓库 30/week @ 2024-07-12 • Rust 包仓库 42/week @ 2024-07-19 • Rust 包仓库 88/week @ 2024-07-26 • Rust 包仓库 222/week @ 2024-08-02 • Rust 包仓库 90/week @ 2024-08-09 • Rust 包仓库 62/week @ 2024-08-16 • Rust 包仓库

每月477次下载

MIT/Apache

29KB
375

Rust TCA954xA和PCA954xA I2C开关驱动程序

crates.io Docs MSRV Build Status Coverage Status

这是一个使用embedded-hal特性实现的适用于TCA9548A和PCA9548A I2C开关/多路复用器的跨平台Rust驱动程序。

此驱动程序允许您

  • 启用一个或多个I2C通道。请参阅:select_channels()
  • 与已启用通道连接的从设备透明通信。
  • 将设备分割成从(虚拟)I2C设备(每个通道一个)。请参阅:split()

设备

TCA954xA和PCA954x设备有两个到八个双向转换开关,可以通过I2C总线进行控制。SCL/SDA上游对扩展到八个下游对或通道。可以选定任何单个SCn/SDn通道或通道组合,由可编程控制寄存器的内容决定。这些下游通道可用于解决I2C从设备地址冲突。例如,如果应用程序需要八个相同的数字温度传感器,则可以在每个通道0-N连接一个传感器。

TCA9545/3A和PCA9545/3A设备为每个通道都有一个关联的中断引脚INT,可以通过轮询来检查哪些通道有挂起的中断。(提示:也可以用作通用输入)

数据手册

用法

要使用此驱动程序,请导入此crate和embedded_hal实现,然后实例化设备。

请在此存储库中找到使用硬件的附加示例: driver-examples

use embedded_hal::i2c::I2c;
use linux_embedded_hal::I2cdev;
use xca9548a::{Error, SlaveAddr, Xca9548a};

fn main() {
    let slave_address = 0b010_0000; // example slave address
    let write_data = [0b0101_0101, 0b1010_1010]; // some data to be sent
    let dev = I2cdev::new("/dev/i2c-1").unwrap();

    let mut switch = Xca9548a::new(dev, SlaveAddr::default());

    // Enable channel 0
    switch.select_channels(0b0000_0001).unwrap();

    // write to slave connected to channel 0 using
    // the I2C switch just as a normal I2C device
    if switch.write(slave_address, &write_data).is_err() {
        println!("Error received!");
    }

    // read from the slave connected to channel 0 using the
    // I2C switch just as a normal I2C device
    let mut read_data = [0; 2];
    if switch.read(slave_address, &mut read_data).is_err() {
        println!("Error received!");
    }

    // write_read from the slave connected to channel 0 using
    // the I2C switch just as a normal I2C device
    if switch
        .write_read(slave_address, &write_data, &mut read_data)
        .is_err()
    {
        println!("Error received!");
    }

    // Split the device and pass the slave (virtual) I2C devices
    // to an external driver
    let parts = switch.split();
    let mut some_driver = Driver::new(parts.i2c1);
    let mut some_other_driver = Driver::new(parts.i2c2);
    some_driver.do_something().unwrap();
    some_other_driver.do_something().unwrap();
}

/// Some driver defined in a different crate.
/// Defined here for completeness.
struct Driver<I2C> {
    i2c: I2C,
}

impl<I2C, E> Driver<I2C>
where
    I2C: I2c<Error = E>,
    E: core::fmt::Debug,
{
    pub fn new(i2c: I2C) -> Self {
        Driver { i2c }
    }
    pub fn do_something(&mut self) -> Result<(), Error<E>> {
        self.i2c.write(0x21, &[0x01, 0x02]).map_err(Error::I2C)
    }
}

支持

有关问题、问题、功能请求和其他更改,请在此github项目中提交一个问题

最低支持的Rust版本(MSRV)

本crate保证在稳定Rust 1.62及更高版本上编译。它可能可以使用较旧版本编译,但在任何新的补丁版本中可能会发生变化。

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确说明,否则您有意提交以包含在作品中的任何贡献(根据Apache-2.0许可证的定义),应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~56KB