diff options
Diffstat (limited to 'src/sequences')
| -rw-r--r-- | src/sequences/common.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/sequences/common.rs b/src/sequences/common.rs new file mode 100644 index 0000000..cd3d573 --- /dev/null +++ b/src/sequences/common.rs @@ -0,0 +1,82 @@ +//! 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) +}; |
