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);
注意事项
- 确保你的SPI设备实现了
embedded-hal
的相应trait - 根据显示屏规格正确设置SPI时钟速度
- 某些显示屏需要初始化序列,请参考具体显示屏的数据手册
- 在嵌入式环境中使用时,注意内存管理
兼容性
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 {}
}
这个完整示例展示了如何:
- 初始化SPI接口
- 创建SSD1306显示驱动
- 初始化显示屏
- 显示文本内容
- 刷新显示缓冲区
注意:实际使用时需要根据你的硬件平台实现相应的SpiDevice和OutputPin trait。