Skip to content

Instantly share code, notes, and snippets.

@aw
Last active March 8, 2021 03:29
Show Gist options
  • Select an option

  • Save aw/a989756fe8e65ef0fdda70fe8b51ca1e to your computer and use it in GitHub Desktop.

Select an option

Save aw/a989756fe8e65ef0fdda70fe8b51ca1e to your computer and use it in GitHub Desktop.

Revisions

  1. aw revised this gist Mar 8, 2021. No changes.
  2. aw created this gist Jan 17, 2021.
    74 changes: 74 additions & 0 deletions sram.rs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    #![no_std]
    #![no_main]

    use panic_halt as _;

    use embedded_graphics::fonts::{Font12x16, Text};
    use embedded_graphics::pixelcolor::Rgb565;
    use embedded_graphics::prelude::*;
    use embedded_graphics::primitives::Rectangle;
    use embedded_graphics::{primitive_style, text_style};
    use gd32vf103xx_hal::pac;
    use gd32vf103xx_hal::prelude::*;
    use longan_nano::{lcd, lcd_pins};
    use riscv_rt::entry;

    use gd32vf103xx_hal::spi::{Spi, MODE_0};
    use sram23x::*;

    #[entry]
    fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();

    // Configure clocks
    let mut rcu = dp
    .RCU
    .configure()
    .ext_hf_clock(8.mhz())
    .sysclk(108.mhz())
    .freeze();
    let mut afio = dp.AFIO.constrain(&mut rcu);

    let gpioa = dp.GPIOA.split(&mut rcu);
    let gpiob = dp.GPIOB.split(&mut rcu);

    let lcd_pins = lcd_pins!(gpioa, gpiob);
    let mut lcd = lcd::configure(dp.SPI0, lcd_pins, &mut afio, &mut rcu);
    let (width, height) = (lcd.size().width as i32, lcd.size().height as i32);

    // SRAM pins
    let sck = gpiob.pb13.into_alternate_push_pull();
    let miso = gpiob.pb14.into_floating_input();
    let mosi = gpiob.pb15.into_alternate_push_pull();
    let spi1 = Spi::spi1(dp.SPI1, (sck, miso, mosi), MODE_0, 4.mhz(), &mut rcu);
    let hold = gpioa.pa0.into_push_pull_output();
    let cs = gpioa.pa3.into_push_pull_output();

    // Write 'abcdABCD' to SRAM at memory address 0x00
    let mut sram = Sram23x::new(spi1, cs, hold, device_type::M23xv1024).unwrap();
    sram.set_mode(OperatingMode::Sequential as u8).unwrap();
    let mut data: [u8; 8] = ['a' as u8, 'b' as u8, 'c' as u8, 'd' as u8, 65, 66, 67, 68];
    sram.write_sequential(0x00_u32, &mut data).unwrap();

    // Read from SRAM at memory address 0x00
    sram.read_sequential(0x00_u32, &mut data).unwrap();

    // Convert the last 4 bytes into an str, to be displayed on the LCD
    let sramstr = core::str::from_utf8(&data[4..]).unwrap();

    // Clear screen
    Rectangle::new(Point::new(0, 0), Point::new(width - 1, height - 1))
    .into_styled(primitive_style!(fill_color = Rgb565::BLACK))
    .draw(&mut lcd)
    .unwrap();

    let style = text_style!(font=Font12x16, text_color=Rgb565::YELLOW, background_color=Rgb565::BLACK);

    // Create a text at position (20, 30) and draw it using style defined above
    Text::new(&sramstr, Point::new(5, 5))
    .into_styled(style)
    .draw(&mut lcd)
    .unwrap();

    loop {}
    }