External SPI Flash Memory + File System + NRF 52832

Hi,

I am trying to implement a lightweight file system in my external flash memory (ISSI). After the implementation of file system, I want to store a .bin file and later access the file through c program. I am a beginner in nrf52 board and need some assistance in understanding the implementation method for the above.

  1. I need some direction for implementing file system in nrf52832. I am using the following Software/Hardware tools:
  • nRF52832
  • NRF CONNECT SDK 2.5.1
  • SPI FLash Memory: IS25LP128-JBLE
  • vscode
  • Windows 11 64 bits

       2. I would also like to if I can implement FATFS on the SPI flash memory using the nrf 52832. Is there a link for the lastest version of FAT FS code.

       3. I need some help in understanding if I can use supported files from nrf SDK v 2.5.1 for nrf52832 board? IS there some alteration needed before I upload them to my nrf 52832 board.

Best,

AP

Parents
  • Will this work for nrf 52832 board?

    As I have gone through the document and for external flash : "This type of configuration requires external flash device to be available on DK board. Currently following boards support the configuration: nrf52840dk_nrf52840 by nrf52840dk_nrf52840_qspi configuration." . SInce I have a nrf 52832dk board it does not support this board right?

  • Hi Dejan,

    Following your instructions, I have added spi driver and partition to my overlay file but I am having the same few configuration warnings and other errors before building:

    This is my overlay file:

    /delete-node/ &storage_partition;
    
    / {
        chosen {
            nordic,pm-ext-flash = &25lp128;
        };
    };
    
    /*	aliases {
    		ext-flash = &flash_25lp128;
    };*/
    fstab {
        compatible = "zephyr,fstab";
        lfs1: lfs1 {
            compatible = "zephyr,fstab,littlefs";
            mount-point = "/lfs1";
            partition = <&lfs1_part>;
            automount;
            read-size = <16>;
            prog-size = <16>;
            cache-size = <64>;
            lookahead-size = <32>;
            block-cycles = <512>;
        };
    };
    
    &spi2 {
        25lp128: flash_25lp128@0 {
            compatible = "jedec,spi-nor";
            status = "okay";
            label = "25LP128";
            reg = <0>;
            spi-max-frequency = <133000000>; /* Adjust based on your flash specifications */
            size = <0x8000000>; /* Adjust based on your flash size */
            has-dpd;
            t-enter-dpd = <3000>;
            t-exit-dpd = <30000>;
            jedec-id = [ 9D 60 18 ]; /* Adjust based on your flash JEDEC ID */
            };
        };
    
        &pinctrl {
            spi2_default: spi2_default {
                group1 {
                    psels = <NRF_PSEL(SPIM_SCK, 0, 25)>, /* gpio 0 pin P0.25 */
                            <NRF_PSEL(SPIM_MISO, 0, 24)>, /* gpio 0 pin P0.24 */
                            <NRF_PSEL(SPIM_MOSI, 0, 23)>; /* gpio 0 pin P0.23 */
                };
            };
    
            spi2_sleep: spi2_sleep {
                group1 {
                    psels = <NRF_PSEL(SPIM_SCK, 0, 25)>, /* gpio 0 pin P0.25 */
                            <NRF_PSEL(SPIM_MISO, 0, 24)>, /* gpio 0 pin P0.24 */
                            <NRF_PSEL(SPIM_MOSI, 0, 23)>; /* gpio 0 pin P0.23 */
                };
            };
        };
    
    &25lp128 {
        partitions {
    		compatible = "fixed-partitions";
    		#address-cells = <1>;
    		#size-cells = <1>;
    
    		lfs1_part: partition@0 {
    			label = "storage";
    			reg = <0x00000000 0x00800000>;
    		};
    	};
    };
    

    Is my overlay for the external flash partition correct?

    This is my prj.config file :

    # Optionally force the file system to be recreated
    #CONFIG_APP_WIPE_STORAGE=y
    
    # fs_dirent structures are big.
    CONFIG_MAIN_STACK_SIZE=4096
    
    # Let __ASSERT do its job
    CONFIG_DEBUG=y
    
    CONFIG_LOG=y
    CONFIG_LOG_MODE_MINIMAL=y
    
    CONFIG_FLASH=y
    CONFIG_FLASH_MAP=y
    CONFIG_FLASH_PAGE_LAYOUT=y
    
    CONFIG_FILE_SYSTEM=y
    CONFIG_FILE_SYSTEM_LITTLEFS=y
    
    CONFIG_SPI=y
    CONFIG_SPI_NOR=y
    CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096
    
    CONFIG_SETTINGS=y
    CONFIG_SETTINGS_FS=y
    CONFIG_SETTINGS_FS_DIR="/lfs/settings"
    CONFIG_SETTINGS_FS_FILE="/lfs/settings/run"
    
    CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=n
    CONFIG_PARTITION_MANAGER_ENABLED=y
    CONFIG_PM_PARTITION_REGION_LITTLEFS_EXTERNAL=y
    CONFIG_PM_PARTITION_REGION_SETTINGS_STORAGE_EXTERNAL=y
    CONFIG_PM_PARTITION_REGION_NVS_STORAGE_EXTERNAL=y
    CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y

    My nrf52dk_52832.dts file:

    /dts-v1/;
    #include <nordic/nrf52832_qfaa.dtsi>
    #include "nrf52dk_nrf52832-pinctrl.dtsi"
    #include <zephyr/dt-bindings/input/input-event-codes.h>
    
    / {
    	model = "Nordic nRF52 DK NRF52832";
    	compatible = "nordic,nrf52-dk-nrf52832";
    
    	chosen {
    		zephyr,console = &uart0;
    		zephyr,shell-uart = &uart0;
    		zephyr,uart-mcumgr = &uart0;
    		zephyr,bt-mon-uart = &uart0;
    		zephyr,bt-c2h-uart = &uart0;
    		zephyr,sram = &sram0;
    		zephyr,flash = &flash0;
    		zephyr,code-partition = &slot0_partition;
    	};
    
    	leds {
    		compatible = "gpio-leds";
    		led0: led_0 {
    			gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
    			label = "Green LED 0";
    		};
    		led1: led_1 {
    			gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
    			label = "Green LED 1";
    		};
    		led2: led_2 {
    			gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
    			label = "Green LED 2";
    		};
    		led3: led_3 {
    			gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
    			label = "Green LED 3";
    		};
    	};
    
    	pwmleds {
    		compatible = "pwm-leds";
    		pwm_led0: pwm_led_0 {
    			pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
    		};
    	};
    
    	buttons {
    		compatible = "gpio-keys";
    		button0: button_0 {
    			gpios = <&gpio0 13 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    			label = "Push button switch 0";
    			zephyr,code = <INPUT_KEY_0>;
    		};
    		button1: button_1 {
    			gpios = <&gpio0 14 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    			label = "Push button switch 1";
    			zephyr,code = <INPUT_KEY_1>;
    		};
    		button2: button_2 {
    			gpios = <&gpio0 15 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    			label = "Push button switch 2";
    			zephyr,code = <INPUT_KEY_2>;
    		};
    		button3: button_3 {
    			gpios = <&gpio0 16 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
    			label = "Push button switch 3";
    			zephyr,code = <INPUT_KEY_3>;
    		};
    	};
    
    	arduino_header: connector {
    		compatible = "arduino-header-r3";
    		#gpio-cells = <2>;
    		gpio-map-mask = <0xffffffff 0xffffffc0>;
    		gpio-map-pass-thru = <0 0x3f>;
    		gpio-map = <0 0 &gpio0 3 0>,	/* A0 */
    			   <1 0 &gpio0 4 0>,	/* A1 */
    			   <2 0 &gpio0 28 0>,	/* A2 */
    			   <3 0 &gpio0 29 0>,	/* A3 */
    			   <4 0 &gpio0 30 0>,	/* A4 */
    			   <5 0 &gpio0 31 0>,	/* A5 */
    			   <6 0 &gpio0 11 0>,	/* D0 */
    			   <7 0 &gpio0 12 0>,	/* D1 */
    			   <8 0 &gpio0 13 0>,	/* D2 */
    			   <9 0 &gpio0 14 0>,	/* D3 */
    			   <10 0 &gpio0 15 0>,	/* D4 */
    			   <11 0 &gpio0 16 0>,	/* D5 */
    			   <12 0 &gpio0 17 0>,	/* D6 */
    			   <13 0 &gpio0 18 0>,	/* D7 */
    			   <14 0 &gpio0 19 0>,	/* D8 */
    			   <15 0 &gpio0 20 0>,	/* D9 */
    			   <16 0 &gpio0 22 0>,	/* D10 */
    			   <17 0 &gpio0 23 0>,	/* D11 */
    			   <18 0 &gpio0 24 0>,	/* D12 */
    			   <19 0 &gpio0 25 0>,	/* D13 */
    			   <20 0 &gpio0 26 0>,	/* D14 */
    			   <21 0 &gpio0 27 0>;	/* D15 */
    	};
    
    	arduino_adc: analog-connector {
    		compatible = "arduino,uno-adc";
    		#io-channel-cells = <1>;
    		io-channel-map = <0 &adc 1>,	/* A0 = P0.3 = AIN1 */
    				 <1 &adc 2>,	/* A1 = P0.4 = AIN2 */
    				 <2 &adc 4>,	/* A2 = P0.28 = AIN4 */
    				 <3 &adc 5>,	/* A3 = P0.29 = AIN5 */
    				 <4 &adc 6>,	/* A4 = P0.30 = AIN6 */
    				 <5 &adc 7>;	/* A5 = P0.31 = AIN7 */
    	};
    
    	/* These aliases are provided for compatibility with samples */
    	aliases {
    		led0 = &led0;
    		led1 = &led1;
    		led2 = &led2;
    		led3 = &led3;
    		pwm-led0 = &pwm_led0;
    		sw0 = &button0;
    		sw1 = &button1;
    		sw2 = &button2;
    		sw3 = &button3;
    		bootloader-led0 = &led0;
    		mcuboot-button0 = &button0;
    		mcuboot-led0 = &led0;
    		watchdog0 = &wdt0;
    	};
    };
    
    &adc {
    	status = "okay";
    };
    
    &uicr {
    	gpio-as-nreset;
    };
    
    &gpiote {
    	status = "okay";
    };
    
    &gpio0 {
    	status = "okay";
    };
    
    arduino_serial: &uart0 {
    	status = "okay";
    	compatible = "nordic,nrf-uarte";
    	current-speed = <115200>;
    	pinctrl-0 = <&uart0_default>;
    	pinctrl-1 = <&uart0_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    arduino_i2c: &i2c0 {
    	compatible = "nordic,nrf-twi";
    	status = "okay";
    	pinctrl-0 = <&i2c0_default>;
    	pinctrl-1 = <&i2c0_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &i2c1 {
    	compatible = "nordic,nrf-twi";
    	/* Cannot be used together with spi1. */
    	/* status = "okay"; */
    	pinctrl-0 = <&i2c1_default>;
    	pinctrl-1 = <&i2c1_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &pwm0 {
    	status = "okay";
    	pinctrl-0 = <&pwm0_default>;
    	pinctrl-1 = <&pwm0_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &spi0 {
    	compatible = "nordic,nrf-spi";
    	/* Cannot be used together with i2c0. */
    	/* status = "okay"; */
    	pinctrl-0 = <&spi0_default>;
    	pinctrl-1 = <&spi0_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &spi1 {
    	compatible = "nordic,nrf-spi";
    	status = "okay";
    	pinctrl-0 = <&spi1_default>;
    	pinctrl-1 = <&spi1_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    arduino_spi: &spi2 {
    	compatible = "nordic,nrf-spi";
    	status = "okay";
    	cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */
    	pinctrl-0 = <&spi2_default>;
    	pinctrl-1 = <&spi2_sleep>;
    	pinctrl-names = "default", "sleep";
    };
    
    &flash0 {
    
    	partitions {
    		compatible = "fixed-partitions";
    		#address-cells = <1>;
    		#size-cells = <1>;
    
    		boot_partition: partition@0 {
    			label = "mcuboot";
    			reg = <0x00000000 0xc000>;
    		};
    		slot0_partition: partition@c000 {
    			label = "image-0";
    			reg = <0x0000C000 0x37000>;
    		};
    		slot1_partition: partition@43000 {
    			label = "image-1";
    			reg = <0x00043000 0x37000>;
    		};
    		storage_partition: partition@7a000 {
    			label = "storage";
    			reg = <0x0007a000 0x00006000>;
    		};
    	};
    };
    

    How do I solve these configuration problems of assigning "y" to my config variable?

    For my dts file the node type "nordic,nrf52-dk-nrf52832" is not identified?

    After doing a pristine building i am getting a cmake error:

     *  Executing task: nRF Connect: Build [pristine]: littlefs/build (active) 
    
    Building littlefs
    west build --build-dir c:/Users/prasa/Desktop/nrf52dk/littlefs/build c:/Users/prasa/Desktop/nrf52dk/littlefs --pristine --board nrf52dk_nrf52832 --no-sysbuild -- -DNCS_TOOLCHAIN_VERSION=NONE -DBOARD_ROOT=c:/users/prasa/desktop/nrf52dk/littlefs -DCONF_FILE=c:/Users/prasa/Desktop/nrf52dk/littlefs/prj.conf -DDTC_OVERLAY_FILE=c:/Users/prasa/Desktop/nrf52dk/littlefs/nrf52dk_nrf52832.overlay
    
    -- west build: generating a build system
    Loading Zephyr default modules (Zephyr base).
    -- Application: C:/Users/prasa/Desktop/nrf52dk/littlefs
    -- CMake version: 3.20.5
    -- Found Python3: C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/python.exe (found suitable version "3.8.2", minimum required is "3.8") found components: Interpreter 
    -- Cache files will be written to: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/.cache
    -- Zephyr version: 3.4.99 (C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr)
    -- Found west (found suitable version "1.1.0", minimum required is "0.14.0")
    -- Board: nrf52dk_nrf52832
    -- Found host-tools: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found toolchain: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found Dtc: C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/dtc.exe (found suitable version "1.4.7", minimum required is "1.4.6") 
    -- Found BOARD.dts: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts
    -- Found devicetree overlay: c:/Users/prasa/Desktop/nrf52dk/littlefs/nrf52dk_nrf52832.overlay
    devicetree error: c:/Users/prasa/Desktop/nrf52dk/littlefs/nrf52dk_nrf52832.overlay:33 (column 5): parse error: expected node name, property name, or '}'
    -- In: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr, command: C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/python.exe;C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/scripts/dts/gen_defines.py;--dts;C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/zephyr.dts.pre;--dtc-flags;'-Wno-unique_unit_address_if_enabled';--bindings-dirs;C:/Users/prasa/Desktop/nrf52dk/v2.5.0/nrf/dts/bindings;C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/dts/bindings;--header-out;C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/include/generated/devicetree_generated.h.new;--dts-out;C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/zephyr.dts.new;--edt-pickle-out;C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/edt.pickle;--vendor-prefixes;C:/Users/prasa/Desktop/nrf52dk/v2.5.0/nrf/dts/bindings/vendor-prefixes.txt;--vendor-prefixes;C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/dts/bindings/vendor-prefixes.txt
    CMake Error at C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/cmake/modules/dts.cmake:279 (message):
      gen_defines.py failed with return code: 1
    Call Stack (most recent call first):
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/cmake/modules/zephyr_default.cmake:129 (include)
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:66 (include)
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:92 (include_boilerplate)
      CMakeLists.txt:8 (find_package)
    
    
    -- Configuring incomplete, errors occurred!
    FATAL ERROR: command exited with status 1: 'C:\Users\prasa\Desktop\nrf52dk\toolchains\c57af46cb7\opt\bin\cmake.EXE' -DWEST_PYTHON=C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/python.exe '-Bc:\Users\prasa\Desktop\nrf52dk\littlefs\build' -GNinja -DBOARD=nrf52dk_nrf52832 -DNCS_TOOLCHAIN_VERSION=NONE -DBOARD_ROOT=c:/users/prasa/desktop/nrf52dk/littlefs -DCONF_FILE=c:/Users/prasa/Desktop/nrf52dk/littlefs/prj.conf -DDTC_OVERLAY_FILE=c:/Users/prasa/Desktop/nrf52dk/littlefs/nrf52dk_nrf52832.overlay '-Sc:\Users\prasa\Desktop\nrf52dk\littlefs'
    
     *  The terminal process terminated with exit code: 1. 
     *  Terminal will be reused by tasks, press any key to close it. 
    

    Best regards,

    AP

  • Hi AP,

    You could try to add following configuration options to your prj.conf:
    CONFIG_SPI_NOR_SFDP_DEVICETREE=y
    CONFIG_FLASH_JESD216_API=y

    Additionally, please have a look at spi overlay and spi conf (for nrf52840) as a reference.

    Best regards,
    Dejan

  • Hi dejans,

    I cannot add "CONFIG_SPI_NOR_SFDP_DEVICETREE=y and CONFIG_FLASH_JESD216_API=y" because the external spi_nor flash issi,is25lp128 doesnit have an SFDP table. Therefore I have avoided these parameters.

    I was able to resolve the errors for littlefs in spi_nor flash memory and flash the files to my device.

    This is my build and flash log to my device:1050370044 (nrf52dk) 

     *  Executing task: nRF Connect: Build: littlefs/build (active) 
    
    Building littlefs
    west build --build-dir c:/Users/prasa/Desktop/nrf52dk/littlefs/build c:/Users/prasa/Desktop/nrf52dk/littlefs
    
    [0/1] Re-running CMake...
    Loading Zephyr default modules (Zephyr base (cached)).
    -- Application: C:/Users/prasa/Desktop/nrf52dk/littlefs
    -- CMake version: 3.20.5
    -- Found Python3: C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/python.exe (found suitable version "3.8.2", minimum required is "3.8") found components: Interpreter 
    -- Cache files will be written to: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/.cache
    -- Zephyr version: 3.4.99 (C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr)
    -- Found west (found suitable version "1.1.0", minimum required is "0.14.0")
    -- Board: nrf52dk_nrf52832
    -- Found host-tools: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found toolchain: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found BOARD.dts: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts
    -- Found devicetree overlay: c:/Users/prasa/Desktop/nrf52dk/littlefs/nrf52dk_nrf52832.overlay
    'label' is marked as deprecated in 'properties:' in C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/dts/bindings\mtd\jedec,spi-nor.yaml for node /soc/spi@40023000/IS25LP128@0.
    -- Generated zephyr.dts: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/zephyr.dts
    -- Generated devicetree_generated.h: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/include/generated/devicetree_generated.h
    -- Including generated dts.cmake file: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/dts.cmake
    
    warning: Deprecated symbol SETTINGS_FS is enabled.
    
    Parsing C:/Users/prasa/Desktop/nrf52dk/littlefs/Kconfig
    Loaded configuration 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/.config'
    No change to configuration in 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/.config'
    No change to Kconfig header in 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/zephyr/include/generated/autoconf.h'
    -- Found Python3: C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/bin/python.exe (found version "3.8.2") found components: Interpreter 
    
    === child image mcuboot -  begin ===
    loading initial cache file C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/child_image_preload.cmake
    Loading Zephyr default modules (Zephyr base (cached)).
    -- Application: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/zephyr
    -- CMake version: 3.20.5
    -- Cache files will be written to: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/.cache
    -- Zephyr version: 3.4.99 (C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr)
    -- Found west (found suitable version "1.1.0", minimum required is "0.14.0")
    -- Board: nrf52dk_nrf52832
    -- Found host-tools: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found toolchain: zephyr 0.16.1 (C:/Users/prasa/Desktop/nrf52dk/toolchains/c57af46cb7/opt/zephyr-sdk)
    -- Found BOARD.dts: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts
    -- Found devicetree overlay: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/zephyr/app.overlay
    -- Generated zephyr.dts: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/zephyr.dts
    -- Generated devicetree_generated.h: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/include/generated/devicetree_generated.h
    -- Including generated dts.cmake file: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/dts.cmake
    Parsing C:/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/zephyr/Kconfig
    Loaded configuration 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/.config'
    No change to configuration in 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/.config'
    No change to Kconfig header in 'C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot/zephyr/include/generated/autoconf.h'
    CMake Warning at C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/CMakeLists.txt:893 (message):
      No SOURCES given to Zephyr library: drivers__spi
    
      Excluding target from build.
    
    
    MCUBoot bootloader key file: C:/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/root-rsa-2048.pem
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/Users/prasa/Desktop/nrf52dk/littlefs/build/mcuboot
    === child image mcuboot -  end ===
    
    CMake Warning at C:/Users/prasa/Desktop/nrf52dk/v2.5.0/nrf/modules/mcuboot/CMakeLists.txt:320 (message):
      
    
              ---------------------------------------------------------
              --- WARNING: Using default MCUBoot key, it should not ---
              --- be used for production.                           ---
              ---------------------------------------------------------
              
    
    
    
    CMake Warning at C:/Users/prasa/Desktop/nrf52dk/v2.5.0/nrf/cmake/partition_manager.cmake:79 (message):
      
    
              ---------------------------------------------------------------------
              --- WARNING: Using a bootloader without pm_static.yml.            ---
              --- There are cases where a deployed product can consist of       ---
              --- multiple images, and only a subset of these images can be     ---
              --- upgraded through a firmware update mechanism. In such cases,  ---
              --- the upgradable images must have partitions that are static    ---
              --- and are matching the partition map used by the bootloader     ---
              --- programmed onto the device.                                   ---
              ---------------------------------------------------------------------
              
    
    Call Stack (most recent call first):
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/cmake/modules/kernel.cmake:247 (include)
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/cmake/modules/zephyr_default.cmake:138 (include)
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:66 (include)
      C:/Users/prasa/Desktop/nrf52dk/v2.5.0/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:97 (include_boilerplate)
      CMakeLists.txt:8 (find_package)
    
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: C:/Users/prasa/Desktop/nrf52dk/littlefs/build
    [0/149] Performing build step for 'mcuboot_subimage'
    [1/29] Generating misc/generated/syscalls.json, misc/generated/struct_tags.json
    [2/29] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/storage/flash_map/flash_map_layout.c.obj
    [3/29] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/storage/flash_map/flash_map.c.obj
    [4/29] Building C object zephyr/CMakeFiles/zephyr.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/nrf/subsys/partition_manager/flash_map_partition_manager.c.obj
    [5/29] Generating linker_zephyr_pre0.cmd
    [6/29] Building C object zephyr/lib/libc/common/CMakeFiles/lib__libc__common.dir/source/stdlib/malloc.c.obj
    [7/29] Building C object CMakeFiles/app.dir/main.c.obj
    [8/29] Building C object CMakeFiles/app.dir/flash_map_extended.c.obj
    [9/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/image_validate.c.obj
    [10/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/tlv.c.obj
    [11/29] Linking C static library zephyr\libzephyr.a
    [12/29] Linking C static library zephyr\lib\libc\common\liblib__libc__common.a
    [13/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/image_rsa.c.obj
    [14/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/bootutil_misc.c.obj
    [15/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/swap_misc.c.obj
    [16/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/loader.c.obj
    [17/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/swap_scratch.c.obj
    [18/29] Building C object CMakeFiles/app.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/swap_move.c.obj
    [19/29] Building C object CMakeFiles/app.dir/nrf_cleanup.c.obj
    [20/29] Linking C static library app\libapp.a
    [21/29] Building C object zephyr/soc/soc/arm/common/cortex_m/CMakeFiles/soc__arm__common__cortex_m.dir/arm_mpu_regions.c.obj
    [22/29] Linking C static library zephyr\soc\soc\arm\common\cortex_m\libsoc__arm__common__cortex_m.a
    [23/29] Building C object modules/mcuboot/boot/bootutil/zephyr/CMakeFiles/mcuboot_util.dir/C_/Users/prasa/Desktop/nrf52dk/v2.5.0/bootloader/mcuboot/boot/bootutil/src/bootutil_public.c.obj
    [24/29] Linking C static library modules\mcuboot\boot\bootutil\zephyr\libmcuboot_util.a
    [25/29] Linking C executable zephyr\zephyr_pre0.elf
    [26/29] Generating linker.cmd
    [27/29] Generating isr_tables.c, isrList.bin
    [28/29] Building C object zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
    [29/29] Linking C executable zephyr\zephyr.elf
    Memory region         Used Size  Region Size  %age Used
               FLASH:       32120 B        48 KB     65.35%
                 RAM:       23744 B        64 KB     36.23%
            IDT_LIST:          0 GB         2 KB      0.00%
    [85/149] Building C object zephyr/drivers/console/CMakeFiles/drivers__console.dir/uart_console.c.obj
    [87/147] Linking C static library zephyr\drivers\console\libdrivers__console.a
    [88/147] Building C object zephyr/drivers/flash/CMakeFiles/drivers__flash.dir/soc_flash_nrf.c.obj
    [89/147] Building C object zephyr/drivers/flash/CMakeFiles/drivers__flash.dir/spi_nor.c.obj
    [90/147] Building C object zephyr/drivers/flash/CMakeFiles/drivers__flash.dir/flash_page_layout.c.obj
    [91/147] Building C object zephyr/drivers/flash/CMakeFiles/drivers__flash.dir/jesd216.c.obj
    [92/147] Linking C static library zephyr\drivers\flash\libdrivers__flash.a
    [93/147] Building C object zephyr/drivers/pinctrl/CMakeFiles/drivers__pinctrl.dir/pinctrl_nrf.c.obj
    [94/147] Building C object zephyr/drivers/pinctrl/CMakeFiles/drivers__pinctrl.dir/common.c.obj
    [95/147] Linking C static library zephyr\drivers\pinctrl\libdrivers__pinctrl.a
    [96/147] Building C object zephyr/drivers/gpio/CMakeFiles/drivers__gpio.dir/gpio_nrfx.c.obj
    [97/147] Linking C static library zephyr\drivers\gpio\libdrivers__gpio.a
    [98/147] Building C object zephyr/drivers/serial/CMakeFiles/drivers__serial.dir/uart_nrfx_uarte.c.obj
    [99/147] Building C object zephyr/drivers/spi/CMakeFiles/drivers__spi.dir/spi_nrfx_common.c.obj
    [100/147] Linking C static library zephyr\drivers\serial\libdrivers__serial.a
    [101/147] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/sys_clock_init.c.obj
    [102/147] Building C object zephyr/drivers/spi/CMakeFiles/drivers__spi.dir/spi_nrfx_spi.c.obj
    [103/147] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/nrf_rtc_timer.c.obj
    [104/147] Linking C static library zephyr\drivers\spi\libdrivers__spi.a
    [105/147] Building C object modules/segger/CMakeFiles/modules__segger.dir/SEGGER_RTT_zephyr.c.obj
    [106/147] Linking C static library zephyr\drivers\timer\libdrivers__timer.a
    [107/147] Linking C static library modules\segger\libmodules__segger.a
    [108/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/banner.c.obj
    [109/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/main_weak.c.obj
    [110/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/busy_wait.c.obj
    [111/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/init.c.obj
    [112/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mem_slab.c.obj
    [113/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/errno.c.obj
    [114/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/device.c.obj
    [115/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/fatal.c.obj
    [116/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/kheap.c.obj
    [117/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/idle.c.obj
    [118/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/msg_q.c.obj
    [119/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/thread.c.obj
    [120/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mailbox.c.obj
    [121/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mutex.c.obj
    [122/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/queue.c.obj
    [123/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/system_work_q.c.obj
    [124/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/work.c.obj
    [125/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sem.c.obj
    [126/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sched.c.obj
    [127/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/stack.c.obj
    [128/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/condvar.c.obj
    [129/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/xip.c.obj
    [130/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mempool.c.obj
    [131/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timer.c.obj
    [132/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timeout.c.obj
    [133/147] Building C object zephyr/kernel/CMakeFiles/kernel.dir/dynamic_disabled.c.obj
    [134/147] Linking C static library zephyr\kernel\libkernel.a
    [135/147] Linking C executable zephyr\zephyr_pre0.elf
    [136/147] Generating linker.cmd
    [137/147] Generating isr_tables.c, isrList.bin
    [138/147] Building C object zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
    [139/147] Linking C executable zephyr\zephyr.elf
    Memory region         Used Size  Region Size  %age Used
               FLASH:       62132 B     237056 B     26.21%
                 RAM:       11372 B        64 KB     17.35%
            IDT_LIST:          0 GB         2 KB      0.00%
    [140/147] Generating zephyr/mcuboot_primary.hex
    [141/147] Generating zephyr/mcuboot_primary_app.hex
    [142/147] Generating ../../zephyr/app_signed.hex
    image.py: sign the payload
    [143/147] Generating ../../zephyr/app_update.bin
    image.py: sign the payload
    [144/147] Generating ../../zephyr/dfu_application.zip
    [145/147] Generating ../../zephyr/app_test_update.hex
    image.py: sign the payload
    [146/147] Generating ../../zephyr/app_moved_test_update.hex
    [147/147] Generating zephyr/merged.hex
     *  Terminal will be reused by tasks, press any key to close it. 
    
     *  Executing task: nRF Connect: Flash: littlefs/build (active) 
    
    Flashing build to 1050370044
    west flash -d c:\Users\prasa\Desktop\nrf52dk\littlefs\build --skip-rebuild --dev-id 1050370044 --erase
    
    -- west flash: using runner nrfjprog
    -- runners.nrfjprog: mass erase requested
    -- runners.nrfjprog: Flashing file: c:\Users\prasa\Desktop\nrf52dk\littlefs\build\zephyr\merged.hex
    [ #################### ]   0.150s | Erase file - Done erasing                                                          
    [ #################### ]   1.724s | Program file - Done programming                                                    
    [ #################### ]   0.639s | Verify file - Done verifying                                                       
    Enabling pin reset.
    Applying pin reset.
    -- runners.nrfjprog: Board with serial number 1050370044 flashed successfully.
     *  Terminal will be reused by tasks, press any key to close it. 


    The external flash memory is not properly connected with my nrf52dk device as I noticed some warning in the above flash log and device log.

    vCOM0 (COM4) log:

    *** Booting nRF Connect SDK v2.5.0 ***
    I: Starting bootloader
    I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
    I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
    I: Boot source: none
    I: Image index: 0, Swap type: none
    I: Bootloader chainload address offset: 0xc000
    �E: Device id 00 00 00 does not match config 9d 60 18
    I: littlefs partition at /lfs1
    I: LittleFS version 2.5, disk version 2.0
    E: can't open flash area 0
    E: fs mount error (-19)
    E: Automount /lfs1 failed: -19
    *** Booting nRF Connect SDK v2.5.0 ***
    Sample program to r/w files on littlefs
    E: FAIL: unable to find flash area 0: -19


    The flash memory was not accessed during this flash. How do I correct this error and connect my external flash to nrf52dk? (the pins are connect to SCK=P0.22,SO=P0.23,SI=P0.24,CE=P0.25)

    MY OVERLAY:

    /delete-node/ &storage_partition;
    
    
    / {
        chosen {
            nordic,pm-ext-flash = &IS25LP128;
        };
    };
    
    
    &spi2 {
        compatible = "nordic,nrf-spi";
    
        status = "okay";
    
        pinctrl-0 = <&spi2_default>;
    
        pinctrl-1 = <&spi2_sleep>;
    
        pinctrl-names = "default", "sleep";
    
        cs-gpios = <&gpio0 25 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
        
        IS25LP128: IS25LP128@0 {
            compatible = "jedec,spi-nor";
            status = "okay";
            label = "25LP128";
            reg = <0>;
            spi-max-frequency = <8000000>; /* Adjust based on your flash specifications */
            size = <0x8000000>; /* Adjust based on your flash size */
            has-dpd;
            t-enter-dpd = <3000>;
            t-exit-dpd = <30000>;
            jedec-id = [ 9D 60 18 ]; /* Adjust based on your flash JEDEC ID */
            //page_size = <2048>;
            //block_size = <131072>;
    
            };
        };
    
    &pinctrl {
        spi2_default: spi2_default {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 22)>, /* gpio 0 pin P0.25 */
                        <NRF_PSEL(SPIM_MISO, 0, 24)>, /* gpio 0 pin P0.24 */
                        <NRF_PSEL(SPIM_MOSI, 0, 23)>; /* gpio 0 pin P0.23 */
            };
        };
    
        spi2_sleep: spi2_sleep {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 22)>, /* gpio 0 pin P0.25 */
                        <NRF_PSEL(SPIM_MISO, 0, 24)>, /* gpio 0 pin P0.24 */
                        <NRF_PSEL(SPIM_MOSI, 0, 23)>; /* gpio 0 pin P0.23 */
            };
        };
    };
    
    
    &IS25LP128 {
        partitions {
    		compatible = "fixed-partitions";
    		#address-cells = <1>;
    		#size-cells = <1>;
    
    		lfs1_part: partition@0 {
    			label = "storage";
    			reg = <0x00000000 0x00800000>;
    		};
    	};
    };
    / {
    	fstab {
    		compatible = "zephyr,fstab";
    		lfs1: lfs1 {
    			compatible = "zephyr,fstab,littlefs";
    			mount-point = "/lfs1";
    			partition = <&lfs1_part>;
    			automount;
    			read-size = <16>;
    			prog-size = <16>;
    			cache-size = <64>;
    			lookahead-size = <32>;
    			block-cycles = <512>;
    		};
    	};
    };
    /delete-node/ &{/pin-controller/pwm0_default/group1/};
    /delete-node/ &{/pin-controller/pwm0_sleep/group1/};
    


    Best regards,

    Aditi Prasad

  • Hi,

    Could you connect your pins SCK=P0.22, SO=P0.23, SI=P0.24 and CE=P0.25 to the logic analyzer and provide logic trace?

    Best regards,
    Dejan

  • Hi,

    At the moment I do not have access to a logic analyzer but I will try to aquire one. Meanwhile I was checking if my flash memory connection directly to the microcontroller could cause some error?

    As there is no resistors attached to the spi pins but as far I have seen in the flash memory a voltage range of 1.7v to 3.6v of the microcontroller should be enough to function the spi pins of the flash (https://www.mouser.de/datasheet/2/198/IS25LP032-064-128-463542.pdf). 

    Should I connect the HOLD and RESET pins to P0.11, P0.12 resp or conenct them to VDD here.

    This is the connection I have right now.
       

    Best regards,

    Aditi Prasad

Reply Children
Related