Last active
March 8, 2021 03:29
-
-
Save aw/a989756fe8e65ef0fdda70fe8b51ca1e to your computer and use it in GitHub Desktop.
Rust embedded driver for Microchip 23x SRAM/NVSRAM - https://blog.a1w.ca/p/rust-embedded-driver-microchip-23x-sram/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![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 {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this file to longan nano
examples/sram.rs
to build and flash thissram
firmware.Build with
cargo build --example sram --features=lcd --release
.