#raspberry-pi #rppal #spi-driver #spi-interface #raspberry #pi-face-digital #mcp23s17

rppal-pfd

PiFace Digital 驱动器 为 Raspberry Pi 的 PiFace Digital I/O 扩展器提供的实验性驱动器。需要 RPPAL 来支持 GPIO 和 SPI 接口。

6 个版本

0.1.0 2024 年 8 月 19 日
0.0.5 2023 年 1 月 22 日
0.0.3 2022 年 11 月 14 日

#355硬件支持

Download history 11/week @ 2024-05-02 9/week @ 2024-07-04 3/week @ 2024-07-25 108/week @ 2024-08-15

111 每月下载量

MIT 许可证

51KB
692

PiFace Digital 驱动器

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

一个通过 SPI 总线访问的 Raspberry Pi 的 PiFace Digital I/O 扩展器的驱动程序。

示例用法

有关更多示例,请参阅 ${CARGO_MANIFEST_DIR}/examples 文件夹中的内容。

use rppal_pfd::{ChipSelect, HardwareAddress, Level, PiFaceDigital, SpiBus, SpiMode};

// Create an instance of the driver for the device with the hardware address
// (A1, A0) of 0b00 on SPI bus 0 clocked at 100kHz. The address bits are set using
// `JP1` and `JP2` on the PiFace Digital board.
let mut pfd = PiFaceDigital::new(
    HardwareAddress::new(0).expect("Invalid hardware address"),
    SpiBus::Spi0,
    ChipSelect::Cs0,
    100_000,
    SpiMode::Mode0,
).expect("Failed to create PiFace Digital");
pfd.init().expect("Failed to initialise PiFace Digital");

// Take ownership of the output pin on bit 4 of the device.
let pin = pfd
    .get_output_pin(4)
    .expect("Failed to get Pin");

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

特性

该 crate 实现以下特性。

mockspi

该 crate 使用模拟代码编译所有访问真实 Raspberry Pi 硬件的代码,以便代码可以在非 Raspberry Pi 硬件上成功编译和运行

  • 移除了访问 GPIO(用于处理来自 MCP23S17 的中断)的 PiFaceDigital 代码。
  • rppal_mcp23s17 crate 中的 MCP23S17 代码使用模拟 SPI,它允许在 MCP23S17 的寄存器中非常简单地设置测试数据,并检查是否已执行预期的读取和写入操作。

构建

您可能需要交叉编译此代码以用于目标 Raspberry Pi。该项目包括一个 Makefile.toml,用于与 cargo-make 一起使用,它具有使用 cross 交叉编译环境执行的任务

  • rpi - 为目标 Raspberry Pi 构建调试版本。
  • rpi-release - 为目标 Raspberry Pi 构建发布版本。
  • rpi-test - 在 qemu 模拟下测试目标代码。

在您的项目中,您可能需要使用类似的交叉编译环境,并像这样调用您的构建:

cross build --target arm-unknown-linux-gnueabihf    # First generation Raspberry Pi.

cross build --target armv7-unknown-linux-gnueabihf  # Later Raspberry Pi versions.

当测试底层rppal-mcp23s17库时,它将编译成一个简单的模拟SPI,允许你编写在宿主环境中运行的单元测试,而不需要目标硬件。同样,这个库还将编译一个访问函数TODO,你的单元测试可以通过它访问模拟SPI来设置测试数据和检查I/O扩展器是否按预期配置。

并发警告

请注意,包含在PiFaceDigital中的rppal_mcp23s17!Send,这意味着设备只能在单个线程的上下文中使用。然而,没有阻止不同线程上的独立实例访问相同的MCP23S17设备。然而,当涉及到PiFace Digital本身时,它需要拥有树莓派GPIO-25引脚的所有权,该引脚用作中断输入。目前,这会导致系统上只能存在一个PiFace Digital设备,因为尝试创建第二个设备将因“GPIO设备忙”错误而失败。

需要进一步的工作才能允许单个进程共享中断;由于这是中断的用户空间架构,进程间的共享可能始终是不可能的。

致谢

这个库从PiFace Digital I/O Python库的设计中汲取了许多灵感和指导。

这个库遵循了RPPAL库中使用的某些API设计模式。

谢谢!

依赖项

~0.8–1.4MB
~31K SLoC