Interfacing FLASH with SPI instead of QSPI

Hi

I am working with nrf52840dk- nrf52840 board to interface the  flash(mx25r64) using spi_flash example code. I wants to use  SPI instead of QSPI in nrf connect sdk .
But I am facing error.

Below I have attached the overlay file I created for SPI flash pin mapping. I haven't changed anything in the main.c and I didn't changed anything in the prj.confg file also.

In the main.c there is if condition

if (!device_is_ready(flash_dev)) {
printk("%s: device not ready.\n", flash_dev->name);
return;
}

When I buid my code and try to debug the code it is coming into this if condition and shows device is not ready.  Can Someone help me with this.

Note:I didn't changed anything in the main.c

OVERLAY FILE:

&qspi {
    status ="disabled";
};

arduino_i2c: &i2c0 {
    status ="disabled";
};

/{
    aliases{
        spi-flash0 = &mx25r641;
    };
};

&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";
    cs-gpios = < &gpio0 16 GPIO_ACTIVE_LOW >;
    mx25r641: mx25r641@0{
        compatible = "jedec,spi-nor";
        reg =<0x0>;
        spi-max-frequency = < 100000 >;
        label = "mx25r64";
        jedec-id = [c2 28 17];
        sfdp-bfp = [
            e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
            ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
            10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 68 44
            30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
        ];
        size = <67108864>;
        has-dpd;
        t-enter-dpd = <10000>;
        t-exit-dpd = <35000>;
    };
};

&pinctrl {
    spi0_default: spi0_default {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                    <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                    <NRF_PSEL(SPIM_MISO, 0, 13)>;
        };
    };

    spi0_sleep: spi0_sleep {
        group1 {
            psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                    <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                    <NRF_PSEL(SPIM_MISO, 0, 13)>;
            low-power-enable;
        };
    };
};
In nrf52840dk_nrf52840.dts there is a node for qspi when I use spi-flash0 = &mx25r64 aliases it is redirecting to the qspi but I want the flash in spi so created above node in the overlay file 
mx25r641: mx25r641@0{
        compatible = "jedec,spi-nor";
        reg =<0x0>;
        spi-max-frequency = < 100000 >;
        label = "mx25r64";
        jedec-id = [c2 28 17];
        sfdp-bfp = [
            e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
            ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
            10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 68 44
            30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
        ];
        size = <67108864>;
        has-dpd;
        t-enter-dpd = <10000>;
        t-exit-dpd = <35000>;
    };
by changing the label name from mx25r64 to mx25r641 and compatible to jedec,spi-nor.
 
When I change 
CONFIG_NORDIC_QSPI_NOR=y this to 
CONFIG_NORDIC_QSPI_NOR=n and adds CONFIG_SPI_NOR =y in nrf52840dk_nrf52840.conf file It is throwing error like this "Aborting the code due to kconfig".
If someone finds the  process what I am doing wrong please correct me with the right process and help to interface the flash with spi.
Parents
  • Hmm, you can try to remove the old mx25r64 node before adding your own, try the following:

    #include "nrf52840.dtsi"
    /{
        &soc {
            &qspi{
                /delete-node/ &mx25r64;
            };
        };
    };
    
    &qspi {
        status ="disabled";
    };
    
    arduino_i2c: &i2c0 {
        status ="disabled";
    };
    
    &spi0 {
        compatible = "nordic,nrf-spim"; // use the nrfx spim driver for async api
        /* Cannot be used together with i2c0. */
        status = "okay";
        pinctrl-0 = <&spi0_default>;
        pinctrl-1 = <&spi0_sleep>;
        pinctrl-names = "default", "sleep";
        cs-gpios = < &gpio0 16 GPIO_ACTIVE_LOW >;
        mx25r64: mx25r64@0{
            compatible = "jedec,spi-nor";
            reg =<0x0>;
            spi-max-frequency = < 100000 >;
            label = "mx25r64";
            jedec-id = [c2 28 17];
            sfdp-bfp = [
                e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
                ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
                10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 68 44
                30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
            ];
            size = <67108864>;
            has-dpd;
            t-enter-dpd = <10000>;
            t-exit-dpd = <35000>;
        };
    };
    
    &pinctrl {
        spi0_default: spi0_default {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                        <NRF_PSEL(SPIM_MISO, 0, 13)>;
            };
        };
    
        spi0_sleep: spi0_sleep {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                        <NRF_PSEL(SPIM_MISO, 0, 13)>;
                low-power-enable;
            };
        };
    };

    If that does not work, try this: 

    #include "nrf52840.dtsi"
    
    /delete-node/ &mx25r64;
    
    &qspi {
        status ="disabled";
    };
    
    arduino_i2c: &i2c0 {
        status ="disabled";
    };
    
    &spi0 {
        compatible = "nordic,nrf-spim"; // use the nrfx spim driver for async api
        /* Cannot be used together with i2c0. */
        status = "okay";
        pinctrl-0 = <&spi0_default>;
        pinctrl-1 = <&spi0_sleep>;
        pinctrl-names = "default", "sleep";
        cs-gpios = < &gpio0 16 GPIO_ACTIVE_LOW >;
        mx25r64: mx25r64@0{
            compatible = "jedec,spi-nor";
            reg =<0x0>;
            spi-max-frequency = < 100000 >;
            label = "mx25r64";
            jedec-id = [c2 28 17];
            sfdp-bfp = [
                e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
                ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
                10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 68 44
                30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
            ];
            size = <67108864>;
            has-dpd;
            t-enter-dpd = <10000>;
            t-exit-dpd = <35000>;
        };
    };
    
    &pinctrl {
        spi0_default: spi0_default {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                        <NRF_PSEL(SPIM_MISO, 0, 13)>;
            };
        };
    
        spi0_sleep: spi0_sleep {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK, 0, 15)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 14)>,
                        <NRF_PSEL(SPIM_MISO, 0, 13)>;
                low-power-enable;
            };
        };
    };

  • The solution you have suggested was not working

    I have tried both the overlays you have shared, with and without changing the CONFIG_NORDIC_QSPI_NOR=y this to CONFIG_NORDIC_QSPI_NOR=n and adds CONFIG_SPI_NOR =y in nrf52840dk_nrf52840.conf file 

    When I change  CONFIG_NORDIC_QSPI_NOR=y to CONFIG_NORDIC_QSPI_NOR=n I got these errors

    1. error: Aborting due to Kconfig warnings
    2. CMake Error at C:/ncs/v2.3.0/zephyr/cmake/modules/kconfig.cmake:328 (message): command failed with return code: 1
    3. -- Configuring incomplete, errors occurred!

    FATAL ERROR: command exited with status 1: 'c:\ncs\toolchains\v2.3.0\opt\bin\cmake.EXE' '-DWEST_PYTHON=c:\ncs\toolchains\v2.3.0\opt\bin\python.exe' '-Bc:\nrf_workspace\spi_flash\build' -GNinja -DBOARD=nrf52840dk_nrf52840 -DNCS_TOOLCHAIN_VERSION:STRING=NONE -DBOARD_ROOT:STRING=c:/nrf_workspace/spi_flash '-DCONF_FILE:STRING=c:/nrf_workspace/spi_flash/prj.conf;c:/nrf_workspace/spi_flash/boards/nrf52840dk_nrf52840.conf' -DDTC_OVERLAY_FILE:STRING=c:/nrf_workspace/spi_flash/nrf52840dk_nrf52840.overlay '-Sc:\nrf_workspace\spi_flash'

    Without any changes in nrf52840dk_nrf52840.conf file also I got cmake error and -- Configuring incomplete, errors occurred!

  • Then I think you should:

    1. "Create a new board" (nRF connect plugin's 'WELCOME' page), based on the nRF52840 template.

    2. Copy the zephyr\boards\arm\nrf52840dk_nrf52840 DTS and configs over to your new board.

    3. Change the qspi and spi0 node accordingly.

    This way you won't have to use overlay files and your new devicetree will no longer include the DK's where the qspi  node have the flash device.

  • I have changed the dts file of new project as per your suggestion, but when I buid my code and try to debug the code it is coming into this if condition and shows device is not ready.

    I did not change anything in the main function of SPI_FLASH(example code)

    I have also changed CONFIG_NORDIC_QSPI_NOR=y to CONFIG_NORDIC_QSPI_NOR=n and add on this CONFIG_SPI_NOR=y in nrf52840dk_nrf52840.conf file.

    Below is my DTS FILE:

    /*
     * Copyright (c) 2017 Linaro Limited
     *
     * SPDX-License-Identifier: Apache-2.0
     */

    /dts-v1/;
    #include <nordic/nrf52840_qiaa.dtsi>
    #include "nrf52840dk_nrf52840-pinctrl.dtsi"

    / {
        model = "Nordic nRF52840 DK NRF52840";
        compatible = "nordic,nrf52840-dk-nrf52840";

        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;
            zephyr,ieee802154 = &ieee802154;
        };

        leds {
            compatible = "gpio-leds";
            led0: led_0 {
                gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
                label = "Green LED 0";
            };
            led1: led_1 {
                gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
                label = "Green LED 1";
            };
            led2: led_2 {
                gpios = <&gpio0 15 GPIO_ACTIVE_LOW>;
                label = "Green LED 2";
            };
            led3: led_3 {
                gpios = <&gpio0 16 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 11 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
                label = "Push button switch 0";
            };
            button1: button_1 {
                gpios = <&gpio0 12 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
                label = "Push button switch 1";
            };
            button2: button_2 {
                gpios = <&gpio0 24 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
                label = "Push button switch 2";
            };
            button3: button_3 {
                gpios = <&gpio0 25 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
                label = "Push button switch 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 &gpio1 1 0>,    /* D0 */
                   <7 0 &gpio1 2 0>,    /* D1 */
                   <8 0 &gpio1 3 0>,    /* D2 */
                   <9 0 &gpio1 4 0>,    /* D3 */
                   <10 0 &gpio1 5 0>,   /* D4 */
                   <11 0 &gpio1 6 0>,   /* D5 */
                   <12 0 &gpio1 7 0>,   /* D6 */
                   <13 0 &gpio1 8 0>,   /* D7 */
                   <14 0 &gpio1 10 0>,  /* D8 */
                   <15 0 &gpio1 11 0>,  /* D9 */
                   <16 0 &gpio1 12 0>,  /* D10 */
                   <17 0 &gpio1 13 0>,  /* D11 */
                   <18 0 &gpio1 14 0>,  /* D12 */
                   <19 0 &gpio1 15 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;
            spi-flash0 = &mx25r64;
        };
    };

    &adc {
        status = "okay";
    };

    &gpiote {
        status = "okay";
    };

    &gpio0 {
        status = "okay";
    };

    &gpio1 {
        status = "okay";
    };

    &uart0 {
        compatible = "nordic,nrf-uarte";
        status = "okay";
        current-speed = <115200>;
        pinctrl-0 = <&uart0_default>;
        pinctrl-1 = <&uart0_sleep>;
        pinctrl-names = "default", "sleep";
    };

    arduino_serial: &uart1 {
        status = "okay";
        current-speed = <115200>;
        pinctrl-0 = <&uart1_default>;
        pinctrl-1 = <&uart1_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";
    };

    &spi2 {
        compatible = "nordic,nrf-spi";
        status = "okay";
        pinctrl-0 = <&spi2_default>;
        pinctrl-1 = <&spi2_sleep>;
        pinctrl-names = "default", "sleep";
        cs-gpios = < &gpio0 16 GPIO_ACTIVE_LOW >;
        mx25r64: mx25r6435f@0 {
            compatible = "jedec,spi-nor";
            reg = <0>;
            // /* MX25R64 supports only pp and pp4io */
            // writeoc = "pp4io";
            // /* MX25R64 supports all readoc options */
            // readoc = "read4io";
            spi-max-frequency =<1600000>;
            jedec-id = [c2 28 17];
            sfdp-bfp = [
                e5 20 f1 ff  ff ff ff 03  44 eb 08 6b  08 3b 04 bb
                ee ff ff ff  ff ff 00 ff  ff ff 00 ff  0c 20 0f 52
                10 d8 00 ff  23 72 f5 00  82 ed 04 cc  44 83 68 44
                30 b0 30 b0  f7 c4 d5 5c  00 be 29 ff  f0 d0 ff ff
            ];
            size = <67108864>;
            has-dpd;
            t-enter-dpd = <10000>;
            t-exit-dpd = <35000>;
        };
    };

    &qspi {
        status = "disabled";
        pinctrl-0 = <&qspi_default>;
        pinctrl-1 = <&qspi_sleep>;
        pinctrl-names = "default", "sleep";
       
    };

    arduino_spi: &spi3 {
        status = "okay";
        cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */
        pinctrl-0 = <&spi3_default>;
        pinctrl-1 = <&spi3_sleep>;
        pinctrl-names = "default", "sleep";
    };

    &ieee802154 {
        status = "okay";
    };

    &flash0 {

        partitions {
            compatible = "fixed-partitions";
            #address-cells = <1>;
            #size-cells = <1>;

            boot_partition: partition@0 {
                label = "mcuboot";
                reg = <0x00000000 0x0000C000>;
            };
            slot0_partition: partition@c000 {
                label = "image-0";
                reg = <0x0000C000 0x00067000>;
            };
            slot1_partition: partition@73000 {
                label = "image-1";
                reg = <0x00073000 0x00067000>;
            };
            scratch_partition: partition@da000 {
                label = "image-scratch";
                reg = <0x000da000 0x0001e000>;
            };

            /*
             * The flash starting at 0x000f8000 and ending at
             * 0x000fffff is reserved for use by the application.
             */

            /*
             * Storage partition will be used by FCB/LittleFS/NVS
             * if enabled.
             */
            storage_partition: partition@f8000 {
                label = "storage";
                reg = <0x000f8000 0x00008000>;
            };
        };
    };

    zephyr_udc0: &usbd {
        compatible = "nordic,nrf-usbd";
        status = "okay";
    };
  • The only obvious issue i see here is that you need to change the spi2's compatible field from:

    compatible = "nordic,nrf-spi",

    to:

    compatible = "nordic,nrf-spim";.

    And you need to make sure that CONFIG_SPI=y and CONFIG_NRFX_SPIM2 is set. 

  • I have changed the compatible = "nordic,nrf-spi" to compatible = "nordic,nrf-spim" in my dts file


    below is my proj.conf file 

    CONFIG_STDOUT_CONSOLE=y
    CONFIG_FLASH=y
    CONFIG_SPI=y
    CONFIG_NRFX_SPIM2=y
     
    still it is coming into this if condition and shows device is not ready.
     
Reply Children
Related