aboutsummaryrefslogtreecommitdiff
path: root/src/sequences/common.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sequences/common.rs')
-rw-r--r--src/sequences/common.rs82
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)
+};