Rust SPI显示接口库display-interface-spi的使用,高效驱动SPI显示屏的嵌入式开发工具

Rust SPI显示接口库display-interface-spi的使用,高效驱动SPI显示屏的嵌入式开发工具

SPI接口用于显示接口

这个Rust crate包含了一个通用的SPI实现,用于通过任何实现了embedded-hal/embedded-hal-async SpiDevice trait的SPI驱动程序来实现显示器数据/命令接口。

许可证

可选择以下任一许可证使用:

  • Apache License, Version 2.0
  • MIT license

贡献

除非您明确声明,否则任何有意提交包含在作品中的贡献,如Apache-2.0许可证中所定义,都应按照上述双重许可,不附加任何额外条款或条件。

安装

在项目目录中运行以下Cargo命令:

cargo add display-interface-spi

或在Cargo.toml中添加以下行:

display-interface-spi = "0.5.0"

完整示例代码

use display_interface_spi::SPIInterface;
use embedded_hal::spi::SpiDevice;
use embedded_hal::digital::v2::OutputPin;

// 假设有以下类型定义
struct MySpi;  // 实现SpiDevice trait的SPI设备
struct MyDcPin; // 实现OutputPin的数据/命令控制引脚
struct MyCsPin; // 实现OutputPin的芯片选择引脚

// 创建SPI接口
let spi = MySpi;
let dc = MyDcPin;
let cs = MyCsPin;

// 初始化SPI显示接口
let interface = SPIInterface::new(spi, dc, cs);

// 现在可以使用interface与显示设备通信
// 例如发送命令或数据到显示器
// 更完整的示例,使用embedded-hal traits

use embedded_hal::spi::MODE_0;
use embedded_hal::blocking::spi::Transfer;
use embedded_hal::digital::v2::OutputPin;
use display_interface_spi::SPIInterface;

// 定义SPI总线实现
struct MySPIBus {
    // 实际的SPI实现细节
}

impl Transfer<u8> for MySPIBus {
    type Error = MySPIError;
    
    fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], MySPIError> {
        // 实现SPI传输逻辑
        Ok(words)
    }
}

// 定义引脚实现
struct MyPin {
    // 实际的GPIO实现细节
}

impl OutputPin for MyPin {
    type Error = MyPinError;
    
    fn set_low(&mut self) -> Result<(), MyPinError> {
        // 实现设置低电平逻辑
        Ok(())
    }
    
    fn set_high(&mut self) -> Result<(), MyPinError> {
        // 实现设置高电平逻辑
        Ok(())
    }
}

fn main() {
    // 初始化SPI总线
    let spi_bus = MySPIBus { /* 初始化参数 */ };
    
    // 初始化数据/命令和片选引脚
    let dc_pin = MyPin { /* 初始化参数 */ };
    let cs_pin = MyPin { /* 初始化参数 */ };
    
    // 创建SPI显示接口
    let display_interface = SPIInterface::new(spi_bus, dc_pin, cs_pin);
    
    // 现在可以使用display_interface与SPI显示器通信
    // 例如:
    // display_interface.send_commands(&[0x01, 0x02])?;
    // display_interface.send_data(&[0x03, 0x04])?;
}

更完整的实际应用示例

//! 使用display-interface-spi驱动ST7789 SPI显示屏的完整示例

use embedded_hal::spi::{SpiDevice, MODE_0};
use embedded_hal::digital::v2::OutputPin;
use display_interface_spi::SPIInterface;
use st7789::{ST7789, Orientation};

// 定义错误类型
#[derive(Debug)]
enum DisplayError {
    SPIError,
    PinError,
}

// 假设我们有一个具体的SPI实现
struct HardwareSPI {
    // 实际的硬件SPI实现
}

impl SpiDevice for HardwareSPI {
    type Error = DisplayError;
    
    fn transaction(&mut self, operations: &mut [Operation<'_, u8>]) -> Result<(), Self::Error> {
        // 实现SPI事务处理
        Ok(())
    }
}

// 假设我们有一个具体的GPIO实现
struct HardwarePin {
    // 实际的GPIO实现
}

impl OutputPin for HardwarePin {
    type Error = DisplayError;
    
    fn set_low(&mut self) -> Result<(), Self::Error> {
        // 设置引脚为低电平
        Ok(())
    }
    
    fn set_high(&mut self) -> Result<(), Self::Error> {
        // 设置引脚为高电平
        Ok(())
    }
}

fn main() -> Result<(), DisplayError> {
    // 初始化硬件SPI
    let spi = HardwareSPI {};
    
    // 初始化数据/命令控制引脚
    let dc = HardwarePin {};
    
    // 初始化复位引脚(可选)
    let rst = HardwarePin {};
    
    // 初始化片选引脚(可选)
    let cs = HardwarePin {};
    
    // 创建SPI显示接口
    let display_interface = SPIInterface::new(spi, dc, cs);
    
    // 创建ST7789显示器驱动
    let mut display = ST7789::new(
        display_interface,
        rst,
        240,  // 宽度
        320,  // 高度
    );
    
    // 初始化显示器
    display.init()?;
    
    // 设置显示方向
    display.set_orientation(Orientation::Portrait)?;
    
    // 清屏为红色
    display.clear(Rgb565::RED)?;
    
    // 绘制一些内容
    // ...
    
    Ok(())
}

1 回复

Rust SPI显示接口库display-interface-spi使用指南

概述

display-interface-spi是一个用于Rust嵌入式开发的SPI显示接口库,它提供了与SPI显示屏通信的高效抽象接口。这个库是embedded-graphics生态系统的一部分,可以与各种显示驱动配合使用。

主要特性

  • 提供标准化的SPI显示通信接口
  • 支持阻塞和异步SPI通信
  • 与嵌入式硬件抽象层(e-hal)兼容
  • 支持多种SPI显示屏控制器

安装方法

在Cargo.toml中添加依赖:

[dependencies]
display-interface-spi = "0.4"
embedded-hal = "0.2"

基本使用方法

1. 初始化SPI接口

use display_interface_spi::SPIInterface;
use embedded_hal::spi::blocking::SpiDevice;

// 假设你已经有了SPI和DC(数据/命令)引脚的实例
let spi: YourSpiDevice = ...;  // 实现SpiDevice trait的类型
let dc: YourOutputPin = ...;   // 实现OutputPin trait的GPIO引脚

// 创建SPI接口
let interface = SPIInterface::new(spi, dc);

2. 与显示驱动配合使用

use display_interface::DisplayInterface;
use some_display_driver::DisplayDriver;  // 替换为你实际使用的显示驱动

// 初始化显示驱动
let mut display = DisplayDriver::new(interface);

// 发送命令
display.send_command(0x01).unwrap();

// 发送数据
display.send_data(&[0xAA, 0xBB, 0xCC]).unwrap();

3. 完整示例:驱动ST7789显示屏

use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::blocking::SpiDevice;
use display_interface_spi::SPIInterface;
use st7789::{ST7789, Orientation};

fn main() -> ! {
    // 初始化硬件外设
    let spi = ...;  // 你的SPI设备
    let dc = ...;   // 数据/命令引脚
    let rst = ...;  // 复位引脚
    
    // 创建SPI接口
    let di = SPIInterface::new(spi, dc);
    
    // 创建ST7789驱动
    let mut display = ST7789::new(di, rst, 240, 240);
    
    // 初始化显示屏
    display.init().unwrap();
    display.set_orientation(Orientation::Portrait).unwrap();
    
    // 清屏为红色
    display.clear(Rgb565::RED).unwrap();
    
    loop {}
}

高级用法

异步SPI支持

如果你的SPI设备支持异步操作,可以使用async特性:

use display_interface_spi::AsyncSPIInterface;
use embedded_hal_async::spi::SpiDevice;

async fn async_example(spi: impl SpiDevice, dc: impl OutputPin) {
    let interface = AsyncSPIInterface::new(spi, dc);
    // 异步操作...
}

自定义延迟

某些显示屏需要命令间的延迟:

use display_interface_spi::SPIInterfaceWithDelay;
use embedded_hal::delay::blocking::DelayUs;

let interface = SPIInterfaceWithDelay::new(spi, dc, delay);

注意事项

  1. 确保你的SPI设备实现了embedded-hal的相应trait
  2. 根据显示屏规格正确设置SPI时钟速度
  3. 某些显示屏需要初始化序列,请参考具体显示屏的数据手册
  4. 在嵌入式环境中使用时,注意内存管理

兼容性

display-interface-spi可以与以下常见显示驱动配合使用:

  • st7789
  • ssd1306
  • ili9341
  • sh1106
  • 其他实现display-interface的驱动

完整示例代码

下面是一个完整的示例,展示如何使用display-interface-spi驱动SSD1306 OLED显示屏:

use embedded_hal::digital::v2::OutputPin;
use embedded_hal::spi::blocking::SpiDevice;
use display_interface_spi::SPIInterface;
use ssd1306::{prelude::*, Ssd1306, size::DisplaySize128x64};

// 假设有以下硬件抽象类型
struct MySpi; // 实现SpiDevice trait
struct MyPin; // 实现OutputPin trait

impl SpiDevice for MySpi {
    // 实现必要的SPI方法
}

impl OutputPin for MyPin {
    // 实现必要的GPIO方法
}

fn main() -> ! {
    // 初始化SPI设备
    let spi = MySpi;
    // 初始化数据/命令选择引脚
    let dc = MyPin;
    // 初始化复位引脚
    let rst = MyPin;
    
    // 创建SPI接口
    let interface = SPIInterface::new(spi, dc);
    
    // 创建SSD1306驱动实例
    let mut display = Ssd1306::new(
        interface,
        DisplaySize128x64,
        DisplayRotation::Rotate0
    ).into_buffered_graphics_mode();
    
    // 初始化显示屏
    display.initialize().unwrap();
    
    // 清屏
    display.clear().unwrap();
    
    // 显示内容
    display.draw(
        Text::new("Hello Rust!", Point::new(10, 10))
            .into_styled(
                TextStyle::new(Font6x8, BinaryColor::On)
            )
    ).unwrap();
    
    // 刷新显示
    display.flush().unwrap();
    
    loop {}
}

这个完整示例展示了如何:

  1. 初始化SPI接口
  2. 创建SSD1306显示驱动
  3. 初始化显示屏
  4. 显示文本内容
  5. 刷新显示缓冲区

注意:实际使用时需要根据你的硬件平台实现相应的SpiDevice和OutputPin trait。

回到顶部