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 在 硬件支持
每月315次下载
在 rppal-pfd 中使用
87KB
2K SLoC
MCP23S17 驱动器
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