Move sd card work to task

This commit is contained in:
Frederik Menke 2024-07-14 21:00:42 +02:00
parent f2bf073676
commit 5ef267736b

View file

@ -10,8 +10,10 @@ use byteorder::ByteOrder;
use defmt::*; use defmt::*;
use embassy_embedded_hal::SetConfig; use embassy_embedded_hal::SetConfig;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_rp::peripherals::{PIN_10, PIN_11, PIN_12, PIN_16, SPI1};
use embassy_rp::spi::Spi; use embassy_rp::spi::Spi;
use embassy_rp::{gpio, spi}; use embassy_rp::{gpio, spi};
use embassy_time::{Duration, Timer};
use embedded_hal_bus::spi::ExclusiveDevice; use embedded_hal_bus::spi::ExclusiveDevice;
use embedded_sdmmc::sdcard::{DummyCsPin, SdCard}; use embedded_sdmmc::sdcard::{DummyCsPin, SdCard};
use embedded_sdmmc::{Block, BlockDevice, BlockIdx, VolumeIdx}; use embedded_sdmmc::{Block, BlockDevice, BlockIdx, VolumeIdx};
@ -34,20 +36,32 @@ impl embedded_sdmmc::TimeSource for DummyTimesource {
} }
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(spawner: Spawner) {
embassy_rp::pac::SIO.spinlock(31).write_value(1); embassy_rp::pac::SIO.spinlock(31).write_value(1);
let p = embassy_rp::init(Default::default()); let p = embassy_rp::init(Default::default());
spawner
.spawn(write_to_sd(p.SPI1, p.PIN_10, p.PIN_11, p.PIN_12, p.PIN_16))
.unwrap();
debug!("TASK ENDED: Main")
}
#[embassy_executor::task]
async fn write_to_sd(spi1: SPI1, pin10: PIN_10, pin11: PIN_11, pin12: PIN_12, pin16: PIN_16) {
Timer::after(Duration::from_secs(2)).await;
// SPI clock needs to be running at <= 400kHz during initialization // SPI clock needs to be running at <= 400kHz during initialization
let mut config = spi::Config::default(); let mut config = spi::Config::default();
config.frequency = 400_000; config.frequency = 400_000;
let spi = Spi::new_blocking(p.SPI1, p.PIN_10, p.PIN_11, p.PIN_12, config); let spi = Spi::new_blocking(spi1, pin10, pin11, pin12, config);
// Use a dummy cs pin here, for embedded-hal SpiDevice compatibility reasons // Use a dummy cs pin here, for embedded-hal SpiDevice compatibility reasons
let spi_dev = ExclusiveDevice::new_no_delay(spi, DummyCsPin); let spi_dev = ExclusiveDevice::new_no_delay(spi, DummyCsPin);
// Real cs pin // Real cs pin
let cs = Output::new(p.PIN_16, Level::High); let cs = Output::new(pin16, Level::High);
let sdcard = SdCard::new(spi_dev, cs, embassy_time::Delay); let sdcard = SdCard::new(spi_dev, cs, embassy_time::Delay);
info!("Card size is {} bytes", sdcard.num_bytes().unwrap()); info!("Card size is {} bytes", sdcard.num_bytes().unwrap());
// Now that the card is initialized, the SPI clock can go faster // Now that the card is initialized, the SPI clock can go faster
@ -102,8 +116,7 @@ async fn main(_spawner: Spawner) {
my_file.write(b"Another one\n").unwrap(); my_file.write(b"Another one\n").unwrap();
} }
debug!("TASK ENDED: SdCard")
info!("Program end")
} }
pub fn valid_volumes<D>(block_device: &mut D) -> [Option<(VolumeIdx, [u8; 11])>; 4] pub fn valid_volumes<D>(block_device: &mut D) -> [Option<(VolumeIdx, [u8; 11])>; 4]
@ -111,12 +124,12 @@ where
D: BlockDevice, D: BlockDevice,
{ {
let mut res = [None; 4]; let mut res = [None; 4];
for i in 0..4 { (0..4).for_each(|i| {
let index_and_label = read_volume_label(block_device, VolumeIdx(i)) let index_and_label = read_volume_label(block_device, VolumeIdx(i))
.ok() .ok()
.map(|label| (VolumeIdx(i), label)); .map(|label| (VolumeIdx(i), label));
res[i] = index_and_label; res[i] = index_and_label;
} });
res res
} }
/// Read out the volume label a partition /// Read out the volume label a partition