#raspberry-pi #rppal #16-bit #spi-interface #raspberry #mcp23s17 #pi-face-digital

rppal-mcp23s17

MCP23S17 驱动器 这是一个为MCP23S17 16位I/O扩展芯片提供的实验性驱动器,该芯片通过Raspberry Pi的外设(如PiFace Digital HAT)上的SPI总线进行寻址。需要RPPAL的SPI接口。

5次发布

0.1.0 2024年8月19日
0.0.4 2024年8月6日
0.0.3 2023年1月19日
0.0.2 2022年11月14日
0.0.1 2022年11月11日

183硬件支持

Download history 13/week @ 2024-05-02 3/week @ 2024-05-23 5/week @ 2024-05-30 1/week @ 2024-06-06 1/week @ 2024-06-13 9/week @ 2024-07-25 107/week @ 2024-08-01 21/week @ 2024-08-08 178/week @ 2024-08-15

每月315次下载
rppal-pfd 中使用

MIT 许可证

87KB
2K SLoC

MCP23S17 驱动器

Crates.io Crates.io Crates.io GitHub Workflow Status

MCP23S17 I/O扩展器驱动器,通过SPI总线访问。请注意,此驱动程序依赖于 RPPAL,因此特定于 Raspberry Pi

示例用法

use rppal_mcp23s17::{ChipSelect, HardwareAddress, Level, Mcp23s17, Port, RegisterAddress, SpiBus, SpiMode};

// Create an instance of the driver for the device with the hardware address
// (A2, A1, A0) of 0b000.
let mcp23s17 = Mcp23s17::new(
    HardwareAddress::new(0).expect("Invalid hardware address"),
    SpiBus::Spi0,
    ChipSelect::Cs0,
    100_000,
    SpiMode::Mode0,
)
.expect("Failed to create MCP23S17");

// Take ownership of the pin on bit 4 of GPIOA and then convert it into an
// OutputPin. Initialisation of the OutputPin ensures that the MCP23S17
// registers (e.g. IODIRA) are set accordingly.
let pin = mcp23s17
    .get(Port::GpioA, 4)
    .expect("Failed to get Pin")
    .into_output_pin()
    .expect("Failed to convert to OutputPin");

// Set the pin to logic-level low.
pin.write(Level::Low).expect("Bad pin write");

并发警告

请注意,在 rppal::spi::Spi 中包含的 Mcp23s17!Send,因此设备只能在单个线程的上下文中使用。但是,并没有阻止不同的线程访问相同的MCP23S17。我们可能会做些更聪明的事情来强制线程间唯一性,但目前这取决于用户确保如果使用多个实例,它们不会互相干扰!

确实,没有阻止不同的进程同时在SPI总线上访问MCP23S17,并且由于许多位翻转操作都实现为对相关寄存器的读取-修改-写入,因此存在大量进程/线程之间的竞争风险。显然,如果单个进程“拥有”MCP23S17设备,并且该进程中的单个线程实例化一个单例 Mcp23s17 对象,这将更加可靠。

致谢

该库中的许多文档注释直接来自 MCP23S17 数据手册,并归 Microchip Technology Inc. 及其子公司版权所有。

此库不仅使用,而且还受到了许多灵感来自 RPPAL crate

依赖关系

~0.7–1.3MB
~28K SLoC