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()?