SDK 15, nRF52840, PCA10056
When I read my data in the flash I recover the before last value writen and not the last.
I'm using the es_flash.c source code from eddyston example which use fds.c to write in the flash.
Here is my code to write or read :
__ALIGN(4) static uint8_t nb_charge_buf[sizeof(uint16_t)];
ret_code_t flash_access_nb_charge(uint16_t * p_nb_charge,
es_flash_access_t access_type)
{
flash_access_params_t params = {.record_key = RECORD_KEY_NB_CHARGE,
.file_id = FILE_ID_ES_FLASH,
.p_data_buf = nb_charge_buf,
.p_data = (uint8_t *)p_nb_charge,
.size_bytes = sizeof(uint16_t),
.access_type = access_type};
return access_flash_data(¶ms);
}
and here is the access_flash_data function :
static ret_code_t access_flash_data(const flash_access_params_t * p_params)
{
ret_code_t err_code;
fds_flash_record_t record = {0};
fds_record_desc_t desc = {0};
fds_find_token_t ft = {0};
fds_record_t record_to_write =
{
.data.p_data = p_params->p_data_buf,
.file_id = p_params->file_id
};
err_code = fds_record_find_by_key(p_params->record_key, &desc, &ft);
// If its a read or clear, we can not accept errors on lookup
if (p_params->access_type == ES_FLASH_ACCESS_READ)
{
RETURN_IF_ERROR(err_code);
}
if (p_params->access_type == ES_FLASH_ACCESS_CLEAR && err_code == FDS_ERR_NOT_FOUND)
{
return NRF_SUCCESS;
}
switch (p_params->access_type)
{
case ES_FLASH_ACCESS_READ:
err_code = fds_record_open(&desc, &record);
RETURN_IF_ERROR(err_code);
memcpy(p_params->p_data, record.p_data, p_params->size_bytes);
err_code = fds_record_close(&desc);
RETURN_IF_ERROR(err_code);
break;
case ES_FLASH_ACCESS_WRITE:
memcpy(p_params->p_data_buf, p_params->p_data, p_params->size_bytes);
record_to_write.data.length_words = (p_params->size_bytes +3) / 4;
record_to_write.key = p_params->record_key;
if (err_code == FDS_ERR_NOT_FOUND)
{
err_code = fds_record_write(&desc, &record_to_write);
}
else
{
err_code = fds_record_update(&desc, &record_to_write);
}
RETURN_IF_ERROR(err_code);
m_num_pending_ops++;
break;
case ES_FLASH_ACCESS_CLEAR:
err_code = fds_record_delete(&desc);
RETURN_IF_ERROR(err_code);
m_num_pending_ops++;
break;
default:
break;
}
return NRF_SUCCESS;
}