diff options
| author | chemicstry <[email protected]> | 2023-02-18 01:35:35 +0200 |
|---|---|---|
| committer | chemicstry <[email protected]> | 2023-02-18 01:37:06 +0200 |
| commit | a53f525f510de07e8c35d38ecc575cb8ea929dd9 (patch) | |
| tree | cda725bead4d8504d15d68e2b275fa529e5531d8 /examples | |
| parent | e3f8020c3bdf726dfa451b5b190f27191507a18f (diff) | |
stm32/sdmmc: Fix SDIOv1 writes
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/stm32f4/src/bin/sdmmc.rs | 39 |
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 | ||
| 5 | use defmt::*; | 5 | use defmt::*; |
| 6 | use embassy_executor::Spawner; | 6 | use embassy_executor::Spawner; |
| 7 | use embassy_stm32::sdmmc::Sdmmc; | 7 | use embassy_stm32::sdmmc::{DataBlock, Sdmmc}; |
| 8 | use embassy_stm32::time::mhz; | 8 | use embassy_stm32::time::mhz; |
| 9 | use embassy_stm32::{interrupt, Config}; | 9 | use embassy_stm32::{interrupt, Config}; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {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. | ||
| 14 | const ALLOW_WRITES: bool = false; | ||
| 15 | |||
| 12 | #[embassy_executor::main] | 16 | #[embassy_executor::main] |
| 13 | async fn main(_spawner: Spawner) -> ! { | 17 | async 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 | } |
