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

FDS Write: Wrong Written Data

Good Afternoon,

I'm writing some config data on an empty record the first time I turn on my board and updating that same record every next time I turn on the board.

While the writing of the first data is correctly written with fds_record_write() - when I check the data with fds_record_open() -, the data is totally wrongly written when I update the record with new config data, with fds_record_update().

When the board initialises I initialise FDS and call flash_write_record_setup(&DEVICE_struct_w_config2write) after initialising the softdevice.

By looking into the code below, do you have any cue why the data is not correctly written when I update the record?

Thank you,

João Oliveira

/* Declarations in flash.h */

/* File ID and Key used for the configuration record. */

#define CONFIG_FILE     (0xF010)
#define CONFIG_REC_KEY  (0x7010)

typedef struct
{
	uint8_t enable;
	uint8_t time_adv;
}ADVERTISE;

typedef struct
{
	uint8_t state;
	ADVERTISE adv2;
}DEVICE;

/* flash_write_record_setup function in flash.c */

void flash_write_record_setup(DEVICE * config2write)
{
    ret_code_t rc;

    fds_record_desc_t desc = {0};
    fds_find_token_t  tok  = {0};

    //CONFIG_FILE and CONFIG_REC_KEY defined in flash.h
    rc = fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &tok);

    if (rc == FDS_SUCCESS) //record exists => update it
    {
        /* A config file is in flash. Let's update it. */
        fds_flash_record_t config = {0};

        /* Open the record and read its contents. */
        rc = fds_record_open(&desc, &config);
        APP_ERROR_CHECK(rc);

        /* Close the record when done reading. */
        rc = fds_record_close(&desc);
        APP_ERROR_CHECK(rc);
 
        //compare existing config in flash with new one
        uint8_t ret = memcmp(config2write, config.p_data, sizeof(DEVICE));

        if(ret != 0) //if different update config in flash
        {
            /* Write the updated record to flash. */
			fds_record_t const rec =
			{
				.file_id           = CONFIG_FILE,
				.key               = CONFIG_REC_KEY,
				.data.p_data       = config2write,
				.data.length_words = (sizeof(DEVICE) + 3) / sizeof(uint32_t)
			};

            rc = fds_record_update(&desc, &rec);
            APP_ERROR_CHECK(rc);

            m_write_finished = false;
        }
        else
        {
            /* Same config data as previous, nothing to be done */
        }
    }
    else  /* System config not found; write a new one. */
    {
        fds_record_t const rec =
        {
            .file_id           = CONFIG_FILE,
            .key               = CONFIG_REC_KEY,
            .data.p_data       = config2write,
            .data.length_words = (sizeof(DEVICE) + 3) / sizeof(uint32_t)
        };

        rc = fds_record_write(&desc, &rec);
        APP_ERROR_CHECK(rc);

        m_write_finished = false;
    }
}

Parents
  • Hi Rune,

    Thank you for your help.

    I tried the code directly in the flash_fds example as per your code and it works fine.

    Yet, when I use exactly the same code in my app I'm struggling with code alignment erros with the fds_record_update() returning error FDS_ERR_UNALIGNED_ADDR. I guess the same could happen in your code eventually. How can I guarantee that the config2write address I'm trying to save on flash is word aligned?

     

    Thank you,

    João

Reply
  • Hi Rune,

    Thank you for your help.

    I tried the code directly in the flash_fds example as per your code and it works fine.

    Yet, when I use exactly the same code in my app I'm struggling with code alignment erros with the fds_record_update() returning error FDS_ERR_UNALIGNED_ADDR. I guess the same could happen in your code eventually. How can I guarantee that the config2write address I'm trying to save on flash is word aligned?

     

    Thank you,

    João

Children
No Data
Related