aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorchemicstry <[email protected]>2023-02-18 01:35:35 +0200
committerchemicstry <[email protected]>2023-02-18 01:37:06 +0200
commita53f525f510de07e8c35d38ecc575cb8ea929dd9 (patch)
treecda725bead4d8504d15d68e2b275fa529e5531d8 /examples
parente3f8020c3bdf726dfa451b5b190f27191507a18f (diff)
stm32/sdmmc: Fix SDIOv1 writes
Diffstat (limited to 'examples')
-rw-r--r--examples/stm32f4/src/bin/sdmmc.rs39
1 files changed, 37 insertions, 2 deletions
diff --git a/examples/stm32f4/src/bin/sdmmc.rs b/examples/stm32f4/src/bin/sdmmc.rs
index 0edd8a61a..b57e955f6 100644
--- a/examples/stm32f4/src/bin/sdmmc.rs
+++ b/examples/stm32f4/src/bin/sdmmc.rs
@@ -4,11 +4,15 @@
4 4
5use defmt::*; 5use defmt::*;
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_stm32::sdmmc::Sdmmc; 7use embassy_stm32::sdmmc::{DataBlock, Sdmmc};
8use embassy_stm32::time::mhz; 8use embassy_stm32::time::mhz;
9use embassy_stm32::{interrupt, Config}; 9use embassy_stm32::{interrupt, Config};
10use {defmt_rtt as _, panic_probe as _}; 10use {defmt_rtt as _, panic_probe as _};
11 11
12/// This is a safeguard to not overwrite any data on the SD card.
13/// If you don't care about SD card contents, set this to `true` to test writes.
14const ALLOW_WRITES: bool = false;
15
12#[embassy_executor::main] 16#[embassy_executor::main]
13async fn main(_spawner: Spawner) -> ! { 17async fn main(_spawner: Spawner) -> ! {
14 let mut config = Config::default(); 18 let mut config = Config::default();
@@ -34,11 +38,42 @@ async fn main(_spawner: Spawner) -> ! {
34 // Should print 400kHz for initialization 38 // Should print 400kHz for initialization
35 info!("Configured clock: {}", sdmmc.clock().0); 39 info!("Configured clock: {}", sdmmc.clock().0);
36 40
37 unwrap!(sdmmc.init_card(mhz(25)).await); 41 unwrap!(sdmmc.init_card(mhz(24)).await);
38 42
39 let card = unwrap!(sdmmc.card()); 43 let card = unwrap!(sdmmc.card());
40 44
41 info!("Card: {:#?}", Debug2Format(card)); 45 info!("Card: {:#?}", Debug2Format(card));
46 info!("Clock: {}", sdmmc.clock());
47
48 // Arbitrary block index
49 let block_idx = 16;
50
51 // SDMMC uses `DataBlock` instead of `&[u8]` to ensure 4 byte alignment required by the hardware.
52 let mut block = DataBlock([0u8; 512]);
53
54 sdmmc.read_block(block_idx, &mut block).await.unwrap();
55 info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]);
56
57 if !ALLOW_WRITES {
58 info!("Writing is disabled.");
59 loop {}
60 }
61
62 info!("Filling block with 0x55");
63 block.fill(0x55);
64 sdmmc.write_block(block_idx, &block).await.unwrap();
65 info!("Write done");
66
67 sdmmc.read_block(block_idx, &mut block).await.unwrap();
68 info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]);
69
70 info!("Filling block with 0xAA");
71 block.fill(0xAA);
72 sdmmc.write_block(block_idx, &block).await.unwrap();
73 info!("Write done");
74
75 sdmmc.read_block(block_idx, &mut block).await.unwrap();
76 info!("Read: {=[u8]:X}...{=[u8]:X}", block[..8], block[512 - 8..]);
42 77
43 loop {} 78 loop {}
44} 79}