aboutsummaryrefslogtreecommitdiff
path: root/examples/src/bin/qspi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/src/bin/qspi.rs')
-rw-r--r--examples/src/bin/qspi.rs134
1 files changed, 0 insertions, 134 deletions
diff --git a/examples/src/bin/qspi.rs b/examples/src/bin/qspi.rs
deleted file mode 100644
index a7d47f79c..000000000
--- a/examples/src/bin/qspi.rs
+++ /dev/null
@@ -1,134 +0,0 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5#[path = "../example_common.rs"]
6mod example_common;
7use example_common::*;
8
9use cortex_m_rt::entry;
10use defmt::{assert_eq, panic, *};
11use nrf52840_hal::gpio;
12
13use embassy::executor::{task, Executor};
14use embassy::flash::Flash;
15use embassy::util::Forever;
16use embassy_nrf::{interrupt, qspi};
17
18const PAGE_SIZE: usize = 4096;
19
20// Workaround for alignment requirements.
21// Nicer API will probably come in the future.
22#[repr(C, align(4))]
23struct AlignedBuf([u8; 4096]);
24
25#[task]
26async fn run() {
27 let p = unwrap!(embassy_nrf::pac::Peripherals::take());
28
29 let port0 = gpio::p0::Parts::new(p.P0);
30
31 let pins = qspi::Pins {
32 csn: port0
33 .p0_17
34 .into_push_pull_output(gpio::Level::High)
35 .degrade(),
36 sck: port0
37 .p0_19
38 .into_push_pull_output(gpio::Level::High)
39 .degrade(),
40 io0: port0
41 .p0_20
42 .into_push_pull_output(gpio::Level::High)
43 .degrade(),
44 io1: port0
45 .p0_21
46 .into_push_pull_output(gpio::Level::High)
47 .degrade(),
48 io2: Some(
49 port0
50 .p0_22
51 .into_push_pull_output(gpio::Level::High)
52 .degrade(),
53 ),
54 io3: Some(
55 port0
56 .p0_23
57 .into_push_pull_output(gpio::Level::High)
58 .degrade(),
59 ),
60 };
61
62 let config = qspi::Config {
63 pins,
64 read_opcode: qspi::ReadOpcode::READ4IO,
65 write_opcode: qspi::WriteOpcode::PP4IO,
66 xip_offset: 0,
67 write_page_size: qspi::WritePageSize::_256BYTES,
68 deep_power_down: None,
69 };
70
71 let irq = interrupt::take!(QSPI);
72 let mut q = qspi::Qspi::new(p.QSPI, irq, config);
73
74 let mut id = [1; 3];
75 q.custom_instruction(0x9F, &[], &mut id).await.unwrap();
76 info!("id: {:[u8]}", id);
77
78 // Read status register
79 let mut status = [0; 1];
80 q.custom_instruction(0x05, &[], &mut status).await.unwrap();
81
82 info!("status: {:?}", status[0]);
83
84 if status[0] & 0x40 == 0 {
85 status[0] |= 0x40;
86
87 q.custom_instruction(0x01, &status, &mut []).await.unwrap();
88
89 info!("enabled quad in status");
90 }
91
92 let mut buf = AlignedBuf([0u8; PAGE_SIZE]);
93
94 let pattern = |a: u32| (a ^ (a >> 8) ^ (a >> 16) ^ (a >> 24)) as u8;
95
96 for i in 0..8 {
97 info!("page {:?}: erasing... ", i);
98 q.erase(i * PAGE_SIZE).await.unwrap();
99
100 for j in 0..PAGE_SIZE {
101 buf.0[j] = pattern((j + i * PAGE_SIZE) as u32);
102 }
103
104 info!("programming...");
105 q.write(i * PAGE_SIZE, &buf.0).await.unwrap();
106 }
107
108 for i in 0..8 {
109 info!("page {:?}: reading... ", i);
110 q.read(i * PAGE_SIZE, &mut buf.0).await.unwrap();
111
112 info!("verifying...");
113 for j in 0..PAGE_SIZE {
114 assert_eq!(buf.0[j], pattern((j + i * PAGE_SIZE) as u32));
115 }
116 }
117
118 info!("done!")
119}
120
121static EXECUTOR: Forever<Executor> = Forever::new();
122
123#[entry]
124fn main() -> ! {
125 info!("Hello World!");
126
127 let executor = EXECUTOR.put(Executor::new(cortex_m::asm::sev));
128 unwrap!(executor.spawn(run()));
129
130 loop {
131 executor.run();
132 cortex_m::asm::wfe();
133 }
134}