add spi_display with mipidsi example for rp pico

This commit is contained in:
Georges PALAUQUI 2023-07-16 15:15:19 +02:00
parent c7ec45a004
commit 919a0071ec
2 changed files with 122 additions and 1 deletions

View File

@ -33,14 +33,16 @@ cortex-m = { version = "0.7.6", features = ["inline-asm"] }
cortex-m-rt = "0.7.0" cortex-m-rt = "0.7.0"
panic-probe = { version = "0.3", features = ["print-defmt"] } panic-probe = { version = "0.3", features = ["print-defmt"] }
futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] } futures = { version = "0.3.17", default-features = false, features = ["async-await", "cfg-target-has-atomic", "unstable"] }
mipidsi = { version = "0.7.1", git = "https://github.com/almindor/mipidsi.git" }
display-interface-spi = "0.4.1" display-interface-spi = "0.4.1"
embedded-graphics = "0.7.1" embedded-graphics = "0.8.0"
st7789 = "0.6.1" st7789 = "0.6.1"
display-interface = "0.4.1" display-interface = "0.4.1"
byte-slice-cast = { version = "1.2.0", default-features = false } byte-slice-cast = { version = "1.2.0", default-features = false }
smart-leds = "0.3.0" smart-leds = "0.3.0"
heapless = "0.7.15" heapless = "0.7.15"
usbd-hid = "0.6.1" usbd-hid = "0.6.1"
rand_core = "0.6.4"
embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" } embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
embedded-hal-async = "0.2.0-alpha.2" embedded-hal-async = "0.2.0-alpha.2"

View File

@ -0,0 +1,119 @@
//! This example shows how to use SPI (Serial Peripheral Interface) in the RP2040 chip.
//!
//! Example written for a display using the GC9A01 chip. Possibly the Waveshare RP2040-LCD-1.28
//! (https://www.waveshare.com/wiki/RP2040-LCD-1.28)
#![no_std]
#![no_main]
#![feature(type_alias_impl_trait)]
use defmt::*;
use display_interface_spi::SPIInterface;
use embassy_executor::Spawner;
use embassy_rp::clocks::RoscRng;
use embassy_rp::gpio::{Level, Output};
use embassy_rp::spi;
use embassy_rp::spi::{Blocking, Spi};
use embassy_time::{Delay, Duration, Timer};
use embedded_graphics::image::{Image, ImageRawLE};
use embedded_graphics::pixelcolor::Rgb565;
use embedded_graphics::prelude::*;
use embedded_graphics::primitives::{PrimitiveStyleBuilder, Rectangle};
use mipidsi::Builder;
use rand_core::RngCore;
use {defmt_rtt as _, panic_probe as _};
const DISPLAY_FREQ: u32 = 64_000_000;
const LCD_X_RES: i32 = 240;
const LCD_Y_RES: i32 = 240;
const FERRIS_WIDTH: u32 = 86;
const FERRIS_HEIGHT: u32 = 64;
#[embassy_executor::main]
async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default());
let mut rng = RoscRng;
info!("Hello World!");
let bl = p.PIN_25;
let rst = p.PIN_12;
let display_cs = p.PIN_9;
let dcx = p.PIN_8;
let mosi = p.PIN_11;
let clk = p.PIN_10;
// create SPI
let mut display_config = spi::Config::default();
display_config.frequency = DISPLAY_FREQ;
display_config.phase = spi::Phase::CaptureOnSecondTransition;
display_config.polarity = spi::Polarity::IdleHigh;
let spi: Spi<'_, _, Blocking> = Spi::new_blocking_txonly(p.SPI1, clk, mosi, display_config.clone());
let display_cs = Output::new(display_cs, Level::High);
let dcx = Output::new(dcx, Level::Low);
let rst = Output::new(rst, Level::Low);
// dcx: 0 = command, 1 = data
// Enable LCD backlight
let _bl = Output::new(bl, Level::High);
// display interface abstraction from SPI and DC
let di = SPIInterface::new(spi, dcx, display_cs);
// Define the display from the display interface and initialize it
let mut display = Builder::gc9a01(di)
.with_display_size(240, 240)
.with_color_order(mipidsi::ColorOrder::Bgr)
.with_invert_colors(mipidsi::ColorInversion::Inverted)
.init(&mut Delay, Some(rst))
.unwrap();
display.clear(Rgb565::BLACK).unwrap();
let raw_image_data = ImageRawLE::new(include_bytes!("../../assets/ferris.raw"), FERRIS_WIDTH);
let mut ferris = Image::new(&raw_image_data, Point::zero());
let r = rng.next_u32();
let mut delta = Point {
x: ((r % 10) + 5) as i32,
y: (((r >> 8) % 10) + 5) as i32,
};
loop {
// Move Ferris
let bb = ferris.bounding_box();
let tl = bb.top_left;
let br = bb.bottom_right().unwrap();
if tl.x < 0 || br.x > LCD_X_RES {
delta.x = -delta.x;
}
if tl.y < 0 || br.y > LCD_Y_RES {
delta.y = -delta.y;
}
// Erase ghosting
let style = PrimitiveStyleBuilder::new().fill_color(Rgb565::BLACK).build();
let mut off = Point { x: 0, y: 0 };
if delta.x < 0 {
off.x = FERRIS_WIDTH as i32;
}
Rectangle::new(tl + off, Size::new(delta.x as u32, FERRIS_HEIGHT))
.into_styled(style)
.draw(&mut display)
.unwrap();
off = Point { x: 0, y: 0 };
if delta.y < 0 {
off.y = FERRIS_HEIGHT as i32;
}
Rectangle::new(tl + off, Size::new(FERRIS_WIDTH, delta.y as u32))
.into_styled(style)
.draw(&mut display)
.unwrap();
// Translate Ferris
ferris.translate_mut(delta);
// Display the image
ferris.draw(&mut display).unwrap();
Timer::after(Duration::from_millis(50)).await;
}
}