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
  • 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

Children
  • Yes I have connected the SD card.

    OK I will not change the zephyr branch. I will try to ask in the Zephyr community. Thanks for the help.

  • Instead of disk_access_spi_sdhc, can I use app_sdcard on nRF9160? I guess app_sdcard uses nrf legacy drivers. My collegue has used app_sdcard on nRF52840DK to interface with SD card. So is it possible to use with nRF9160DK instead of Zephyr drivers?

  • Hello,

    I downloaded the merged.hex file which you provided and I think it is working. LED on SD card is continuously blinking which means it is continuously receiving the clock signal.

    When I download my merged.hex file, LED stops working after 10-15sec indicating that SD card is not mounted and it stops receiving clock signal.

    I compared both merged.hex files and they are different.

    I am using the same ncs tag, overlay file and prj.conf file as yours. Still it is different.

    I think in my program, spi is never initialized. Can you please guide me for this problem?

  • Hello, 

    Jagruti said:
    Instead of disk_access_spi_sdhc, can I use app_sdcard on nRF9160? I guess app_sdcard uses nrf legacy drivers. My collegue has used app_sdcard on nRF52840DK to interface with SD card. So is it possible to use with nRF9160DK instead of Zephyr drivers?

     The app_sdcard is a library from the nRF5 SDK. You can use this but will need to port to nRF9160.

    Can you please provide more information about your setup? Can you take a picture to show how you have connected?

    Have you ensured that the pins are correctly configured in the board controller? P0.13 on the board controller must be set to enable these pins.

    To minimize editing the board controller, can you please route SPI3 to P0.10 - P0.13  instead? These are found on P19 and should be directly available.

    Kind regards,
    Øyvind

  • Hello,

    Attached is a working project using SPI3. The output is shown in the image.

    &spi3 {
            compatible = "nordic,nrf-spim";
            status = "okay";
            sck-pin = <10>;
            mosi-pin = <11>;
            miso-pin = <12>;
    
            cs-gpios = <&gpio0 13 0>;
    
            sdhc0: sdhc@0 {
                    compatible = "zephyr,mmc-spi-slot";
                    reg = <0>;
                    status = "okay";
                    label = "SDHC0";
                    spi-max-frequency = <24000000>;
            };
    };

    fat_fs.zip


    Let me know how it works for you!

    Kind regards,
    Øyvind

Related