1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use stm32f4xx_hal::{
gpio::{
gpioa::PA15,
gpiob::{PB3, PB4, PB5},
Alternate, Output, PushPull, AF5,
},
rcc::Clocks,
spi::Spi,
stm32::SPI1,
time::MegaHertz,
};
use embedded_hal::{digital::v2::OutputPin, spi::MODE_0};
use spi_memory::{self, series25};
type FlashSpi = Spi<
SPI1,
(
PB3<Alternate<AF5>>,
PB4<Alternate<AF5>>,
PB5<Alternate<AF5>>,
),
>;
type FlashCs = PA15<Output<PushPull>>;
pub struct Flash {
flash: series25::Flash<FlashSpi, FlashCs>,
}
impl Flash {
pub fn new<M0, M1, M2, M3>(
pb3: PB3<M0>,
pb4: PB4<M1>,
pb5: PB5<M2>,
cs: PA15<M3>,
spi1: SPI1,
clocks: Clocks,
) -> Result<Flash, spi_memory::Error<FlashSpi, FlashCs>> {
let spi = {
let sck = pb3.into_alternate_af5();
let miso = pb4.into_alternate_af5();
let mosi = pb5.into_alternate_af5();
Spi::spi1(spi1, (sck, miso, mosi), MODE_0, MegaHertz(1).into(), clocks)
};
let cs = {
let mut cs = cs.into_push_pull_output();
let _ = cs.set_high().ok();
cs
};
let flash = series25::Flash::init(spi, cs)?;
Ok(Flash { flash })
}
pub fn read_id(&mut self) -> series25::Identification {
self.flash.read_jedec_id().unwrap()
}
}