nRF52832 SD Card with nRFConnect SDK v1.9.1

Hello,

I am trying to save data on an microSD card using SPI1. I am following the firmware in this discussion Working NRF9160 SD Card Example on SDK 1.9.0. In addition I have another peripheral on SPI0 bus which is working correctly. Disk initialization do not work (I am using basically the same code as the link) and returns error code of '-5'. I experimented a bit with the configurations and either I am getting an error code of -5 or the main function resets. 

When
 

&spi1 {
	compatible = "nordic,nrf-spim";
	.
	.
	.
	}

I get rebooted back to the main function.

When

&spi1 {
	compatible = "nordic,nrf-spi";
	.
	.
	.
	}

I get error code of -5

I researched the forum and found lots of topic about SPI SDHC interfacing issues, yet, they did not solve my problem. I tried changing pins since -5 seems to be EIO code ( disk program files return -EIO etc.) but not sure of that actually represents 'EIO' error code.  It also might be FR_NO_PATH


Here is the debugging output,

And the devicetree and .conf files,

// Copyright (c) 2022 Nordic Semiconductor ASA
// SPDX-License-Identifier: Apache-2.0

/dts-v1/;
#include <nordic/nrf52832_qfaa.dtsi>

/ {
	model = "pedal_board";
	compatible = "pedal-board";

	chosen {
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
	};
};

&gpio0 {
	status = "okay";
};

&spi0 {
	compatible = "nordic,nrf-spi";
	/* BMX160 IMU sensor */
	status = "okay";
	sck-pin = <12>;
	mosi-pin = <13>;
	miso-pin = <14>;
	//cs-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
};

&spi1 {
	compatible = "nordic,nrf-spi";
	status = "okay";
	sck-pin = <19>;
	mosi-pin = <24>;
	miso-pin = <22>;
	miso-pull-up;

	cs-gpios = <&gpio0 23 GPIO_ACTIVE_LOW>;

	sdhc0: sdhc@0 {
			compatible = "zephyr,mmc-spi-slot";
			reg = <0x0>;
			status = "okay";
			label = "SDHC0";
			spi-max-frequency = <24000000>;
	};
};




&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>;
		};
	};
};

# enable GPIO
CONFIG_GPIO=y

# Enable hardware stack protection
CONFIG_HW_STACK_PROTECTION=y

#Configure cloock
CONFIG_CLOCK_CONTROL=y

# Console
CONFIG_UART_CONSOLE=n
CONFIG_CONSOLE=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_LOG=y
CONFIG_LOG_MODE_DEFERRED=y
CONFIG_LOG_DEFAULT_LEVEL=4
CONFIG_LOG_BACKEND_RTT=y
CONFIG_LOG_BACKEND_RTT_BUFFER=0

# Heap memory
CONFIG_HEAP_MEM_POOL_SIZE=2048
# Some command handlers require a large stack.
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096

# IMU Stuff...:
CONFIG_SPI=y
CONFIG_MAIN_STACK_SIZE=4096
# IMU 6-axis fusion (enables inclusion of 'math.h' library)
CONFIG_NEWLIB_LIBC=y
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
# additional board options
CONFIG_GPIO_AS_PINRESET=n

# debugging
CONFIG_DEBUG_OPTIMIZATIONS=y
CONFIG_DEBUG_THREAD_INFO=y

#esb
CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_ESB=y


# Beyond base settings
CONFIG_SPI=y
CONFIG_NRFX_SPI=y

CONFIG_NRFX_SPIM=y
CONFIG_NRFX_SPI0=y
CONFIG_NRFX_SPI1=y
CONFIG_NRFX_SPIM0=y
CONFIG_NRFX_SPIM1=y

CONFIG_SPI_NRFX_RAM_BUFFER_SIZE=8
CONFIG_DISK_ACCESS=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y

EDIT1:

I have traced the stacks just before the systes reboots back to the main function, its  'z_impl_spi_transceive()' function. Here is the stack call-list,

Parents
  • Hi,

    I have found the problem, first, changed the device tree to

    &spi1 {
    	compatible = "nordic,nrf-spi";
    	status = "okay";
    	sck-pin = <19>;
    	mosi-pin = <24>;
    	miso-pin = <22>;
    	miso-pull-up;
    
    	cs-gpios = <&gpio0 23 GPIO_ACTIVE_LOW>;
    
    	sdhc0: sdhc@0 {
    			compatible = "zephyr,mmc-spi-slot";
    			reg = <0x0>;
    			status = "okay";
    			label = "SDHC0";
    			spi-max-frequency = <24000000>;
    	};
    };
    

    And the supply voltage of the SD Card module to 5V. Appearently, the modules having AMS1117-3.3 LDO's (or similar) may not work with 3.3Volt supply instead of 5V due to voltage dropout. These modules also houses a data buffer which is not the issue where the dropped out voltage is actually sufficent to run the buffer IC. I think the SDCard might be the issue here when using lower voltages.

  • Hi,

    Thank you for sharing your solution. I am glad that it worked out well for you.

    There is just one small question regarding your device tree &spi1. It seems to be the same as the original one. Which change was required?

    Best regards,
    Dejan

Reply Children
No Data
Related