This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Reading SD card on nRF9160dk

Hello,

I want to read two files from SD card using nRF9160dk. I tried this code ncs/zephyr/samples/subsys/fs/fat_fs.

The Code:

/*
 * Copyright (c) 2019 Tavish Naruka <[email protected]>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/* Sample which uses the filesystem API and SDHC driver */

#include <zephyr.h>
#include <device.h>
#include <disk/disk_access.h>
#include <logging/log.h>
#include <fs/fs.h>
#include <ff.h>

LOG_MODULE_REGISTER(main);

static int lsdir(const char *path);

static FATFS fat_fs;
/* mounting info */
static struct fs_mount_t mp = {
	.type = FS_FATFS,
	.fs_data = &fat_fs,
};

/*
*  Note the fatfs library is able to mount only strings inside _VOLUME_STRS
*  in ffconf.h
*/
static const char *disk_mount_pt = "/SD:";

void main(void)
{
	/* raw disk i/o */
	do {
		static const char *disk_pdrv = "SD";
		u64_t memory_size_mb;
		u32_t block_count;
		u32_t block_size;

		if (disk_access_init(disk_pdrv) != 0) {
			LOG_ERR("Storage init ERROR!");
			break;
		}

		if (disk_access_ioctl(disk_pdrv,
				DISK_IOCTL_GET_SECTOR_COUNT, &block_count)) {
			LOG_ERR("Unable to get sector count");
			break;
		}
		LOG_INF("Block count %u", block_count);

		if (disk_access_ioctl(disk_pdrv,
				DISK_IOCTL_GET_SECTOR_SIZE, &block_size)) {
			LOG_ERR("Unable to get sector size");
			break;
		}
		printk("Sector size %u\n", block_size);

		memory_size_mb = (u64_t)block_count * block_size;
		printk("Memory Size(MB) %u\n", (u32_t)memory_size_mb>>20);
	} while (0);

	mp.mnt_point = disk_mount_pt;

	int res = fs_mount(&mp);

	if (res == FR_OK) {
		printk("Disk mounted.\n");
		lsdir(disk_mount_pt);
	} else {
		printk("Error mounting disk.\n");
	}

	while (1) {
		k_sleep(1000);
	}
}

static int lsdir(const char *path)
{
	int res;
	struct fs_dir_t dirp;
	static struct fs_dirent entry;

	/* Verify fs_opendir() */
	res = fs_opendir(&dirp, path);
	if (res) {
		printk("Error opening dir %s [%d]\n", path, res);
		return res;
	}

	printk("\nListing dir %s ...\n", path);
	for (;;) {
		/* Verify fs_readdir() */
		res = fs_readdir(&dirp, &entry);

		/* entry.name[0] == 0 means end-of-dir */
		if (res || entry.name[0] == 0) {
			break;
		}

		if (entry.type == FS_DIR_ENTRY_DIR) {
			printk("[DIR ] %s\n", entry.name);
		} else {
			printk("[FILE] %s (size = %zu)\n",
				entry.name, entry.size);
		}
	}

	/* Verify fs_closedir() */
	fs_closedir(&dirp);

	return res;
}

I am getting the following error:

***** Booting Zephyr OS build v1.14.99-ncs3-snapshot2-2647-gd6e67554cfeb *****
[00:00:00.024,078] <inf> spi_nrfx_spim: CS control inhibited (no GPIO device)
[00:00:05.039,306] <err> main: Storage init ERROR!
Error mounting disk.
[00:00:10.054,565] <err> fs: fs mount error (-5)

nrf9160_pca10090ns.overlay:

/*
 * Copyright (c) 2019 Tavish Naruka <[email protected]>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

&spi3 {
        status = "okay";
        cs-gpios = <&gpio0 16 0>;

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

&spi3 {
        status = "okay";
        sck-pin = <19>;
        mosi-pin = <18>;
        miso-pin = <17>;
};

I checked the voltage levels at SPI_3 pins. Pin 16, 17, 18 shows 3V but 19 which is SCK is at 0V. I am not understanding why it is at 0V.

Why there is error? What else I need to do?

Parents Reply Children
  • prj.conf file:

    CONFIG_SPI=y
    CONFIG_SPI_3=y
    CONFIG_DISK_ACCESS=y
    CONFIG_DISK_ACCESS_SDHC=y
    CONFIG_DISK_ACCESS_SPI_SDHC=y
    CONFIG_LOG=y
    CONFIG_FILE_SYSTEM=y
    CONFIG_FAT_FILESYSTEM_ELM=y
    CONFIG_PRINTK=y
    CONFIG_MAIN_STACK_SIZE=2048

    nrf9160_pca10090ns.overlay file:

    /*
     * Copyright (c) 2019 Tavish Naruka <[email protected]>
     *
     * SPDX-License-Identifier: Apache-2.0
     */
    
    &spi3 {
            status = "okay";
            cs-gpios = <&gpio0 16 0>;
    
            sdhc0: sdhc@0 {
                    compatible = "zephyr,mmc-spi-slot";
                    reg = <0>;
                    status = "okay";
                    label = "SDHC0";
                    spi-max-frequency = <24000000>;
            };
    };
    
    &spi3 {
            status = "okay";
            sck-pin = <19>;
            mosi-pin = <18>;
            miso-pin = <17>;
    };

  • Ok, so I've tested here and I was able to remove the first error: spi_nrfx_spim: CS control inhibited (no GPIO device) I added CONFIG_GPIO = y to the top of prj.conf.

    2020-03-20T11:37:29.810Z DEBUG modem << *** Booting Zephyr OS build v2.1.99-ncs1  ***\x0D\x0A
    2020-03-20T11:37:29.811Z DEBUG modem << Error mounting disk.\x0D\x0A
    2020-03-20T11:37:29.814Z DEBUG modem << [00:00:00.004,180] \x1B[1;31m<err> main: Storage init ERROR!\x1B[0m\x0D\x0A
    2020-03-20T11:37:29.819Z DEBUG modem << [00:00:00.004,211] \x1B[1;31m<err> fs: fs mount error (-5)\x1B[0m\x0D\x0A

    Have you connected the SD card? I am currently in my home office and do not have access to any SD cards or measuring devices.

  • The error is still there. When I remove the overlay file, I get the same output like you. I am not understanding what is the problem. I referred to other questions likehttps://devzone.nordicsemi.com/f/nordic-q-a/57194/nrf9160-and-sd-card-example and https://devzone.nordicsemi.com/f/nordic-q-a/51379/fat-file-error. They are also getting this same error. I tried with zephyr branch v2.2, but using it with ncs tag v1.2.0 shows error. So I am using v2.1.99-ncs1 zephyr. I don't know what else to try.

    For this example how the spi drivers are initialized I am not getting. Normally to use any drivers we use device get binding() function. For this example where it is done?

    Is there any other way to interface SD card with nRF9160dk?

  • Hi,

    Can you please provide your merged.hex file? So that I will check it on my DK. Thank you in advance.

  • Jagruti said:
    Can you please provide your merged.hex file? So that I will check it on my DK. Thank you in advance.

     Yes, here is my merged.hex. merged.hex

     

    Øyvind said:
    Have you connected the SD card?

     I did not get a clear answer to this. How have you connected your SD card? As mentioned, I do not have access to an SD card at the moment.

    Jagruti said:
    They are also getting this same error. I tried with zephyr branch v2.2, but using it with ncs tag v1.2.0 shows error. So I am using v2.1.99-ncs1 zephyr. I don't know what else to try.

     There is no need to change the Zephyr branch from what is recommended in NCS. However, please note that this example is not made by Nordic, it is made by the Zephyr community and for another board than nRF9160. It may be worth a try to ask for help in the Zephyr community, e.g. this thread.

    Thanks!

    -Øyvind

Related