I am trying to format an external flash chip with littlefs, but keep getting an MPU fault. I can erase the chip, but not mount or format. I have tried writing and reading to the chip using flash_area_read/write at different areas in the chip and it goes well. I've read several posts here and tried them, but didn't work.
I'm using a small board from HolyIOT with the nrf52832 chip and a W25Q32JV Winbond chip using SPI.
nRF Connect SDK v2.6.1
Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
VSCode v1.88.1
nRF Connect for VSCode v2024.3.25
// Copyright (c) 2024 Nordic Semiconductor ASA
// SPDX-License-Identifier: Apache-2.0
/dts-v1/;
//#include <nordic/nrf52832_ciaa.dtsi>
#include <nordic/nrf52832_qfaa.dtsi>
/ {
model = "ArrowOne_V3";
compatible = "denis,arrowone-v3";
chosen {
zephyr,sram = &sram0;
zephyr,flash = &flash0;
};
cspins {
compatible = "gpio-leds";
csflash: csflash {
label = "CS_FLASH";
gpios = <&gpio0 12 0>;
};
};
};
&gpiote {
status = "okay";
};
&gpio0 {
status = "okay";
};
&pinctrl {
spi2_default: spi2_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 21)>,
<NRF_PSEL(SPIM_MOSI, 0, 18)>,
<NRF_PSEL(SPIM_MISO, 0, 15)>;
};
};
spi2_sleep: spi2_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 21)>,
<NRF_PSEL(SPIM_MOSI, 0, 18)>,
<NRF_PSEL(SPIM_MISO, 0, 15)>;
};
};
};
&spi2 {
compatible = "nordic,nrf-spi";
status = "okay";
pinctrl-0 = <&spi2_default>;
pinctrl-1 = <&spi2_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
spiflash: spiflash@0 {
compatible = "jedec,spi-nor";
status = "okay";
reg = <0>;
spi-max-frequency = <1000000U>;
jedec-id = [ef 40 16];
t-enter-dpd=<3000>;
t-exit-dpd=<3000>;
size = <0x2000000>; //bits, not bytes!
partitions {
compatible="fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
lfs1_part: partition@0 {
label = "littlefs_storage";
reg = <0x00000000 0x00400000>; //bytes
};
};
};
};
/* These aliases are provided for compatibility with samples */
/ {
aliases {
csflash = &csflash;
spiflash = &spiflash;
};
};
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x0 0xc000>;
};
slot0_partition: partition@c000 {
label = "image-0";
reg = <0xc000 0x32000>;
};
slot1_partition: partition@3e000 {
label = "image-1";
reg = <0x3e000 0x32000>;
};
scratch_partition: partition@70000 {
label = "image-scratch";
reg = <0x70000 0xa000>;
};
storage_partition: partition@7a000 {
label = "storage";
reg = <0x7a000 0x6000>;
};
};
};
&ficr {
status = "okay";
};
#math library? CONFIG_NEWLIB_LIBC=y #No external low frequency crystal CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n CONFIG_GPIO_AS_PINRESET=n CONFIG_GPIO=y CONFIG_GPIO_AS_PINRESET=n # Make sure printk is printing to the UART console CONFIG_CONSOLE=y CONFIG_HEAP_MEM_POOL_SIZE=2048 CONFIG_FPU=y CONFIG_CBPRINTF_FP_SUPPORT=y # Config logger CONFIG_LOG=y CONFIG_USE_SEGGER_RTT=y CONFIG_LOG_BACKEND_RTT=y CONFIG_LOG_PRINTK=y CONFIG_RTT_CONSOLE=y CONFIG_UART_CONSOLE=n #Flash NOR CONFIG_SPI=y CONFIG_SPI_NOR=y CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 CONFIG_FLASH_JESD216_API=y CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_FLASH_PAGE_LAYOUT=y #CONFIG_NVS=y #littlefs file system CONFIG_FILE_SYSTEM=y CONFIG_FILE_SYSTEM_MKFS=y CONFIG_FILE_SYSTEM_LITTLEFS=y #partition manager settings CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=n
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <soc.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>
#include <zephyr/storage/flash_map.h>
#include <zephyr/settings/settings.h>
#include <zephyr/logging/log.h>
FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(flash_storage);
static struct fs_mount_t lfs_storage_mnt = {
.type = FS_LITTLEFS,
.fs_data = &flash_storage,
.storage_dev = (void *)FIXED_PARTITION_ID(lfs1_part),
.mnt_point = "/lfs",
};
#define MKFS_FS_TYPE FS_LITTLEFS
#define MKFS_DEV_ID FIXED_PARTITION_ID(lfs1_part)
#define MKFS_FLAGS 0
LOG_MODULE_REGISTER(main, LOG_LEVEL_DBG);
int formatFS(void)
{
int rc;
rc = fs_mkfs(MKFS_FS_TYPE, (uintptr_t)MKFS_DEV_ID, NULL, MKFS_FLAGS);
if (rc < 0) {
LOG_ERR("Format failed");
return 0;
}
LOG_INF("Format successful");
return 0;
}
int eraseFlash()
{
int rc;
struct fs_mount_t *mp = &lfs_storage_mnt;
unsigned int id = (uintptr_t)mp->storage_dev;
const struct flash_area *pfa;
rc = flash_area_open(id, &pfa);
if (rc < 0)
{
printk("FAIL: unable to find flash area %u: %d\n", id, rc);
return 1;
}
printk("Area %u at 0x%x for %u bytes\n", id, (unsigned int)pfa->fa_off, (unsigned int)pfa->fa_size);
rc = flash_area_erase(pfa, 0, pfa->fa_size);
printk("flash erase: %d\n", rc);
flash_area_close(pfa);
return 0;
}
int main(void)
{
printk("\nerasing flash\n");
eraseFlash();
printk("Done.\n\n");
printk("formating flash\n");
formatFS();
printk("Done.\n\n");
printk("Starting main routine\n\n");
while(1)
{
k_sleep(K_MSEC(50));
}
return 0;
}
SEGGER J-Link V7.80c - Real time terminal output J-Link EDU Mini V1 compiled Sep 22 2022 14:55:40 V1.0, SN=801020502 Process: JLink.exe [00:00:00.000,030] <wrn> spi_nor: Waiting until flash is ready *** Booting nRF Connect SDK v3.5.99-ncs1-1 *** erasing flash Area 5 at 0x0 for 4194304 bytes flash erase: 0 Done. formating flash [00:00:25.720,336] <inf> littlefs: LittleFS version 2.5, disk version 2.0 [00:00:25.721,282] <inf> littlefs: FS at spiflash@0:0x0 is 1024 0x1000-byte blocks with 512 cycle [00:00:25.721,282] <inf> littlefs: sizes: rd 16 ; pr 16 ; ca 64 ; la 32 [00:00:25.721,588] <err> os: ***** MPU FAULT ***** [00:00:25.721,588] <err> os: Stacking error (context area might be not valid) [00:00:25.721,588] <err> os: Data Access Violation [00:00:25.721,618] <err> os: MMFAR Address: 0x2000216c [00:00:25.721,649] <err> os: r0/a1: 0xffdc5036 r1/a2: 0x90234921 r2/a3: 0xf7a0bb89 [00:00:25.721,649] <err> os: r3/a4: 0x8c2f424f r12/ip: 0xcbb6f52a r14/lr: 0xdce5aef8 [00:00:25.721,679] <err> os: xpsr: 0xc92d0000 [00:00:25.721,679] <err> os: s[ 0]: 0x651fdac5 s[ 1]: 0x4bcb40c8 s[ 2]: 0x6cb4902d s[ 3]: 0xea9b53c3 [00:00:25.721,710] <err> os: s[ 4]: 0xd7d6866c s[ 5]: 0xc82cc575 s[ 6]: 0x774b11ad s[ 7]: 0x116042b5 [00:00:25.721,710] <err> os: s[ 8]: 0xcb352f2f s[ 9]: 0x8c9f08e0 s[10]: 0x6644993f s[11]: 0xb07a1cd8 [00:00:25.721,740] <err> os: s[12]: 0xc77a3048 s[13]: 0xa48f49fa s[14]: 0xf346350e s[15]: 0x65346337 [00:00:25.721,740] <err> os: fpscr: 0xfc9fc82a [00:00:25.721,740] <err> os: Faulting instruction address (r15/pc): 0x40f822a2 [00:00:25.721,801] <err> os: >>> ZEPHYR FATAL ERROR 2: Stack overflow on CPU 0 [00:00:25.721,832] <err> os: Current thread: 0x200009c0 (main) [00:00:26.292,327] <err> fatal_error: Resetting system *** Booting nRF Connect SDK v3.5.99-ncs1-1 *** erasing flash Area 5 at 0x0 for 4194304 bytes