Skip to content

Commit 1224239

Browse files
committed
memory/spi_mem: add read check after write/erase
This adds a read back of the modified data to check that the write or erase operation completed successfully.
1 parent 7d497c0 commit 1224239

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/memory/spi_mem.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,21 @@ bool spi_mem_sector_erase(uint32_t sector_addr)
174174
// --- Wait for write to end ---
175175
_spi_mem_wait();
176176

177+
// --- Check that sector has been actually erased ---
178+
uint8_t page_data[SPI_MEM_PAGE_SIZE];
179+
for (size_t i = 0; i < SPI_MEM_SECTOR_SIZE / SPI_MEM_PAGE_SIZE; i++) {
180+
uint32_t page_addr = sector_addr + i * SPI_MEM_PAGE_SIZE;
181+
if (!spi_mem_page_read(page_addr, page_data)) {
182+
util_log("Read after sector erase at %p failed", (void*)(uintptr_t)page_addr);
183+
return false;
184+
}
185+
for (size_t j = 0; j < SPI_MEM_PAGE_SIZE; j++) {
186+
if (page_data[j] != 0xFF) {
187+
util_log("Sector erase at %p failed", (void*)(uintptr_t)(page_addr + j));
188+
return false;
189+
}
190+
}
191+
}
177192
return true;
178193
}
179194

@@ -242,6 +257,16 @@ static bool _spi_mem_page_write(uint32_t page_addr, const uint8_t* input)
242257
// --- Wait for write to end ---
243258
_spi_mem_wait();
244259

260+
// --- Check that input data has been properly written ---
261+
uint8_t read_data[SPI_MEM_PAGE_SIZE];
262+
if (!spi_mem_page_read(page_addr, read_data)) {
263+
util_log("Read after page write at %p failed", (void*)(uintptr_t)page_addr);
264+
return false;
265+
}
266+
if (memcmp(read_data, input, SPI_MEM_PAGE_SIZE) != 0) {
267+
util_log("Write page at %p failed", (void*)(uintptr_t)page_addr);
268+
return false;
269+
}
245270
return true;
246271
}
247272

0 commit comments

Comments
 (0)