STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include "main.h"
2
3#include <Arduino.h>
4#include <SPIMemory.h>
5
6namespace {
7
8SPIFlash flash(MX25_PIN_CS);
9
11 Serial.println();
12 for (uint8_t i = 0; i < 80; i++)
13 Serial.print('-');
14 Serial.println();
15}
16
17bool fillTestPattern(uint8_t* buf, size_t len) {
18 for (size_t i = 0; i < len; i++)
19 buf[i] = static_cast<uint8_t>(0xA5U ^ (i * 131U));
20 return true;
21}
22
23bool verifyPattern(const uint8_t* buf, size_t len) {
24 for (size_t i = 0; i < len; i++) {
25 if (buf[i] != static_cast<uint8_t>(0xA5U ^ (i * 131U)))
26 return false;
27 }
28 return true;
29}
30
31} // namespace
32
33void setup() {
34 Serial.begin(115200);
35 while (!Serial)
36 delay(10);
37 delay(50);
38
40 Serial.println("MX25L25645 — write / readback test (SPIMemory)");
42
44
45 if (!flash.begin()) {
46 Serial.println("FAIL: flash.begin() — check wiring, CS, and power.");
47 if (flash.error())
48 Serial.println(flash.error(VERBOSE));
49 while (true)
50 delay(1000);
51 }
52
53 const uint32_t jedec = flash.getJEDECID();
54 Serial.printf("JEDEC ID: 0x%06lX\r\n", static_cast<unsigned long>(jedec));
55 if (jedec != MX25_EXPECTED_JEDEC)
56 Serial.printf(
57 "WARN: expected 0x%06lX for MX25L25645G; continuing anyway.\r\n",
58 static_cast<unsigned long>(MX25_EXPECTED_JEDEC));
59
60 const uint32_t cap = flash.getCapacity();
61 Serial.printf("Reported capacity: %lu bytes (%.2f MiB)\r\n",
62 static_cast<unsigned long>(cap),
63 static_cast<double>(cap) / (1024.0 * 1024.0));
64
65 if (cap < 4096U || MX25_TEST_BYTES > 4096U) {
66 Serial.println("FAIL: capacity or test size invalid.");
67 while (true)
68 delay(1000);
69 }
70
71 // Use last 4 KiB sector so we stay away from low addresses other tooling
72 // might use.
73 const uint32_t sectorBase = cap - 4096U;
74 Serial.printf("Test sector base: 0x%08lX\r\n",
75 static_cast<unsigned long>(sectorBase));
76
77 if (!flash.eraseSector(sectorBase)) {
78 Serial.println("FAIL: eraseSector");
79 if (flash.error())
80 Serial.println(flash.error(VERBOSE));
81 while (true)
82 delay(1000);
83 }
84 Serial.println("Sector erase OK.");
85
86 uint8_t writeBuf[MX25_TEST_BYTES];
87 uint8_t readBuf[MX25_TEST_BYTES];
89
90 if (!flash.writeByteArray(sectorBase, writeBuf, MX25_TEST_BYTES)) {
91 Serial.println("FAIL: writeByteArray");
92 if (flash.error())
93 Serial.println(flash.error(VERBOSE));
94 while (true)
95 delay(1000);
96 }
97 Serial.printf("Wrote %u bytes at 0x%08lX\r\n",
98 static_cast<unsigned>(MX25_TEST_BYTES),
99 static_cast<unsigned long>(sectorBase));
100
101 memset(readBuf, 0, sizeof(readBuf));
102 if (!flash.readByteArray(sectorBase, readBuf, MX25_TEST_BYTES)) {
103 Serial.println("FAIL: readByteArray");
104 if (flash.error())
105 Serial.println(flash.error(VERBOSE));
106 while (true)
107 delay(1000);
108 }
109
110 const bool ok = verifyPattern(readBuf, MX25_TEST_BYTES);
111 if (ok) {
112 Serial.println("PASS: readback matches written pattern.");
113 } else {
114 Serial.println("FAIL: readback mismatch.");
115 for (unsigned i = 0; i < MX25_TEST_BYTES; i++) {
116 if (readBuf[i] != writeBuf[i]) {
117 Serial.printf(" first diff @ %u: wrote 0x%02X read 0x%02X\r\n",
118 i, writeBuf[i], readBuf[i]);
119 break;
120 }
121 }
122 }
123
124 // Second check: Arduino String round-trip (same idea as storage-test
125 // Flash_Storage.ino)
126 const char* msg = "MX25 OK";
127 String sIn = msg;
128 const uint16_t strBytes =
129 static_cast<uint16_t>(sizeof(char) * (sIn.length() + 1U));
130 const uint32_t strAddr = flash.getAddress(strBytes);
131 if (strAddr == 0 && strBytes > 0) {
132 Serial.println("WARN: getAddress failed for string test; skipping.");
133 } else {
134 if (!flash.eraseSector(strAddr)) {
135 Serial.println("FAIL: eraseSector (string test)");
136 } else if (!flash.writeStr(strAddr, sIn, strBytes)) {
137 Serial.println("FAIL: writeStr");
138 } else {
139 String sOut;
140 sOut.reserve(sIn.length() + 1U);
141 if (!flash.readStr(strAddr, sOut, strBytes))
142 Serial.println("FAIL: readStr");
143 else if (sOut == sIn)
144 Serial.println("PASS: String readback OK.");
145 else
146 Serial.println("FAIL: String readback mismatch.");
147 }
148 }
149
150 printDivider();
151 Serial.println("Done.");
152 printDivider();
153}
154
155void loop() {
156 delay(1000);
157}
static SerialStub Serial
Definition Arduino.h:128
#define MX25_EXPECTED_JEDEC
Definition main.h:11
#define MX25_TEST_BYTES
Definition main.h:15
#define MX25_PIN_SCK
Definition main.h:5
#define MX25_PIN_MOSI
Definition main.h:7
#define MX25_PIN_MISO
Definition main.h:6
#define MX25_PIN_CS
Definition main.h:8
void delay(int ms)
void setup()
Definition main.cpp:142
void loop()
Definition main.cpp:201
static bool ok
Definition flight_e2e.c:435
bool fillTestPattern(uint8_t *buf, size_t len)
Definition main.cpp:17
bool verifyPattern(const uint8_t *buf, size_t len)
Definition main.cpp:23
SPIFlash flash(MX25_PIN_CS)