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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
//! Common SPI sequences.
use imxrt_drivers_flexspi::{Instr, Pads, SDR_CMD, SDR_DUMMY, SDR_RADDR, SDR_READ, SDR_WRITE};
pub use crate::flexspi::Sequence;
/// Enable write access.
///
/// This should be sequenced before configuration register
/// updates, page programs, and erases.
pub const SEQ_WRITE_ENABLE: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x06);
Sequence(instr)
};
/// Program a page using four output data signals.
pub const SEQ_PAGE_PROGRAM_QUAD_INPUT: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x32);
instr[1] = Instr::new(SDR_RADDR, Pads::One, 24);
instr[2] = Instr::new(SDR_WRITE, Pads::Four, 0);
Sequence(instr)
};
/// Erase a 4KiB sector.
pub const SEQ_ERASE_SECTOR: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x20);
instr[1] = Instr::new(SDR_RADDR, Pads::One, 24);
Sequence(instr)
};
/// Erase the entire chip.
pub const SEQ_ERASE_CHIP: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x60);
Sequence(instr)
};
/// Read the status register.
pub const SEQ_READ_STATUS: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x05);
instr[1] = Instr::new(SDR_READ, Pads::One, 0);
Sequence(instr)
};
/// Form a read sequence with a given number of
/// dummy cycles.
///
/// The sequence sends the read address using four signals.
pub const fn seq_fast_read_quad_io(dummy_cycles: u8) -> Sequence {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0xEB);
instr[1] = Instr::new(SDR_RADDR, Pads::Four, 24);
instr[2] = Instr::new(SDR_DUMMY, Pads::Four, dummy_cycles);
instr[3] = Instr::new(SDR_READ, Pads::Four, 0);
Sequence(instr)
}
/// Set parameters for reading data (volatile).
pub const SEQ_SET_READ_PARAMS_VOL: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0xC0);
instr[1] = Instr::new(SDR_WRITE, Pads::One, 0);
Sequence(instr)
};
/// Software reset enable.
pub const SEQ_RSTEN: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x66);
Sequence(instr)
};
/// Software reset.
pub const SEQ_RST: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x99);
Sequence(instr)
};
/// Read product ID by JEDEC ID.
pub const SEQ_READ_ID_JEDEC_ID: Sequence = {
let mut instr = [Instr::STOP; _];
instr[0] = Instr::new(SDR_CMD, Pads::One, 0x9F);
instr[1] = Instr::new(SDR_READ, Pads::One, 0);
Sequence(instr)
};
|