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?

  • 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

  • Hi,

    I am using adafruit micro-sd breakout board and kingston micro sd card 8GB which is formatted to FAT32 Filesystem.

    Connections are as follow:

    SCK (Pin 11) -> CLK

    MOSI (Pin 12) -> DI

    MISO (Pin 13) -> DO

    CS (Pin 10) -> CS

    Picture of the setup:

    I tested zephyr/tests/subsys/fs/multi-fs to check fatfs and it is working properly. It can create the directory and files on the RAM of nRF9160.

    The error is coming from disk_access_init() function. 

    I checked the drivers and it looks correct. I checked the SD card commands, they are also correct. In previous version there was issue but it is fixed now for this version. Still that error comes.

    So the problem is either in disk_access_spi_sdhc file or in the sd card. Because SPI is getting initialized. 

Related