aboutsummaryrefslogtreecommitdiff
path: root/src/sequences/common.rs
blob: 4bb9493ce7c8d0fc75020bf44694163d15a96313 (plain)
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)
};