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

SD card and app_timer()

Hi,

I try to create program which will save same data on SD card,  I'm using evaluation board nrf52 (nrf52832) and using SDK 13 (nRF5_SDK_13.0.0_04a0bfd) and programing it using eclipse. Here is the code:

/**
 * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 * 
 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 * 
 * 4. This software, with or without modification, must only be used with a
 *    Nordic Semiconductor ASA integrated circuit.
 * 
 * 5. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 * 
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */
/** @file
 * @defgroup fatfs_example_main main.c
 * @{
 * @ingroup fatfs_example
 * @brief FATFS Example Application main file.
 *
 * This file contains the source code for a sample application using FAT filesystem and SD card library.
 *
 */

#include "app_timer.h"
#include "nrf.h"
#include "bsp.h"
#include "ff.h"
#include "diskio_blkdev.h"
#include "nrf_block_dev_sdc.h"
#include "nrf_drv_clock.h"

#define NRF_LOG_MODULE_NAME "APP"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_drv_clock.h"


#define FILE_NAME   "NORDIC.TXT"
#define TEST_STRING "SD card example.\r\n"

#define SDC_SCK_PIN     ARDUINO_13_PIN  ///< SDC serial clock (SCK) pin.
#define SDC_MOSI_PIN    ARDUINO_11_PIN  ///< SDC serial data in (DI) pin.
#define SDC_MISO_PIN    ARDUINO_12_PIN  ///< SDC serial data out (DO) pin.
#define SDC_CS_PIN      ARDUINO_10_PIN  ///< SDC chip select (CS) pin.

//Timer
#define SD_SAVE_DATA_INTERVAL     APP_TIMER_TICKS(5000)                   /**< Tick / Ms */
APP_TIMER_DEF(sd_timer_id);

/**
 * @brief  SDC block device definition
 * */
NRF_BLOCK_DEV_SDC_DEFINE(
		m_block_dev_sdc,
		NRF_BLOCK_DEV_SDC_CONFIG(
				SDC_SECTOR_SIZE,
				APP_SDCARD_CONFIG(SDC_MOSI_PIN, SDC_MISO_PIN, SDC_SCK_PIN, SDC_CS_PIN)
		),
		NFR_BLOCK_DEV_INFO_CONFIG("Nordic", "SDC", "1.00")
);

// Init for LFCLK
static void lfclk_request(void)
{
    ret_code_t err_code = nrf_drv_clock_init();
    APP_ERROR_CHECK(err_code);
    nrf_drv_clock_lfclk_request(NULL);

    if(nrf_drv_clock_lfclk_is_running()){
		NRF_LOG_INFO("LFCLK: ON \r\n ");
	}
}

/**
 * @brief Function for demonstrating FAFTS usage.
 */
static void fatfs_example()
{
	static uint32_t i;
	uint32_t id_sd = (i++);

	NRF_LOG_INFO("\r\n DO IT :%d \r\n\r\n",id_sd);

	static FATFS fs;
	static DIR dir;
	static FILINFO fno;
	static FIL file;

	uint32_t bytes_written;
	FRESULT ff_result;
	DSTATUS disk_state = STA_NOINIT;

	// Initialize FATFS disk I/O interface by providing the block device.
	static diskio_blkdev_t drives[] =
	{
			DISKIO_BLOCKDEV_CONFIG(NRF_BLOCKDEV_BASE_ADDR(m_block_dev_sdc, block_dev), NULL)
	};

	diskio_blockdev_register(drives, ARRAY_SIZE(drives));

	NRF_LOG_INFO("Initializing disk 0 (SDC)...\r\n");
	for (uint32_t retries = 3; retries && disk_state; --retries)
	{
		NRF_LOG_INFO("Retries: %d \r\n",retries);
		disk_state = disk_initialize(0);
	}
	NRF_LOG_INFO("You are here. \r\n"); // <- Freez here
	if (disk_state)
	{
		NRF_LOG_INFO("Disk initialization failed.\r\n");
		return;
	}

	uint32_t blocks_per_mb = (1024uL * 1024uL) / m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_size;
	uint32_t capacity = m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_count / blocks_per_mb;
	NRF_LOG_INFO("Capacity: %d MB\r\n", capacity);

	NRF_LOG_INFO("Mounting volume...\r\n");
	ff_result = f_mount(&fs, "", 1);
	if (ff_result)
	{
		NRF_LOG_INFO("Mount failed.\r\n");
		return;
	}

	NRF_LOG_INFO("\r\n Listing directory: /\r\n");
	ff_result = f_opendir(&dir, "/");
	if (ff_result)
	{
		NRF_LOG_INFO("Directory listing failed!\r\n");
		bsp_board_led_invert(0);
		return;
	}

	do
	{
		ff_result = f_readdir(&dir, &fno);
		if (ff_result != FR_OK)
		{
			NRF_LOG_INFO("Directory read failed.");
			return;
		}

		if (fno.fname[0])
		{
			if (fno.fattrib & AM_DIR)
			{
				NRF_LOG_RAW_INFO("   <DIR>   %s\r\n",(uint32_t)fno.fname);
			}
			else
			{
				NRF_LOG_RAW_INFO("%9lu  %s\r\n", fno.fsize, (uint32_t)fno.fname);
			}
		}
	}
	while (fno.fname[0]);
	NRF_LOG_RAW_INFO("\r\n");

	NRF_LOG_INFO("Writing to file " FILE_NAME "...\r\n");
	ff_result = f_open(&file, FILE_NAME, FA_READ | FA_WRITE | FA_OPEN_APPEND);
	if (ff_result != FR_OK)
	{
		NRF_LOG_INFO("Unable fatfs_example()to open or create file: " FILE_NAME ".\r\n");
		return;
	}

	ff_result = f_write(&file, TEST_STRING, sizeof(TEST_STRING) - 1, (UINT *) &bytes_written);
	if (ff_result != FR_OK)
	{
		NRF_LOG_INFO("Write failed\r\n.");
	}
	else
	{
		NRF_LOG_INFO("%d bytes written.\r\n", bytes_written);
	}

	(void) f_close(&file);
	bsp_board_led_invert(0);
	return;
}

// Timeout handler for the repeated timer
static void timer_sd_handler(void * p_context)
{
	NRF_LOG_INFO("\r\n Timer_SD_Handler.\r\n\r\n");

	UNUSED_PARAMETER(p_context);
	bsp_board_led_invert(0);
	fatfs_example();
}

// Create timers
static void timers_init()
{
	NRF_LOG_INFO("\r\n Timer_INIT.\r\n\r\n");
	ret_code_t err_code;

	// Initialize timer module.
	err_code = app_timer_init();
	APP_ERROR_CHECK(err_code);

	    if(NRF_SUCCESS!=err_code){
	    	NRF_LOG_INFO("Error while init. \r\n");
	    }else {
	    	NRF_LOG_INFO("App timer init. \r\n");
	    }

	 //Create timers
	err_code = app_timer_create(&sd_timer_id,
			APP_TIMER_MODE_REPEATED ,
			timer_sd_handler);


	NRF_LOG_INFO("\r\n Init and create timer.\r\n\r\n");

	APP_ERROR_CHECK(err_code);
	bsp_board_led_invert(0);

}


/**@brief Function for initializing the nrf log module.
 */
static void log_init(void)
{
	ret_code_t err_code = NRF_LOG_INIT(NULL);
	APP_ERROR_CHECK(err_code);
}


/**@brief Function for starting timers.
 */
static void application_timers_start(void)
{
	NRF_LOG_INFO("\r\n Timer_sd_start.\r\n\r\n");
	ret_code_t err_code;
	err_code = app_timer_start(sd_timer_id, SD_SAVE_DATA_INTERVAL, NULL);
	APP_ERROR_CHECK(err_code);

	//Error gate
	if(NRF_SUCCESS == err_code){
		NRF_LOG_INFO("Timer was successfully started. \r\n");
	}
	if(NRF_ERROR_INVALID_PARAM == err_code){
		NRF_LOG_INFO("Parameter was invalid. \r\n");
	}
	if(NRF_ERROR_INVALID_STATE == err_code){
		 NRF_LOG_INFO("The application timer module has not been initialized or the timer has not been created. \r\n");
	}

}


/**
 * @brief Function for main application entry.
 */
int main(void)
{
	bsp_board_leds_init();
	log_init();


	NRF_LOG_INFO("\r\nFATFS.\r\n\r\n");

	// Request LF clock.
	lfclk_request();

	// Init timers.
	timers_init();

	// Timers starts
	application_timers_start();

	while (true)
	{
		__WFE();
	}
}

/** @} */

and the log is : 

APP:INFO:
FATFS.

CLOCK:INFO:Function: nrf_drv_clock_init, error code: NRF_SUCCESS.
APP:INFO:
 Timer_INIT.

APP:INFO:App timer init. 
APP:INFO:
 Init and create timer.

APP:INFO:
 Timer_sd_start.

APP:INFO:Timer was successfully started. 
APP:INFO:
 Timer_SD_Handler.

APP:INFO:
 DO IT :0 

APP:INFO:Initializing disk 0 (SDC)...
APP:INFO:Retries: 3 

1. Is it possible that i make bad implementation off app_timer()?

Parents Reply Children
No Data
Related