Hello All,
I am working on nRF51822 use SDK nRF5 12.3.0 version in IAR workbench.
I am write data in the flash so for that i follow below steps,
Step 1: press button to start writing data in to flash.
step 1: write 2 data in to flash. and size of each data is 16-bit.
below I add function(flash_adc_write) of write data in flash,
static void flash_word_write(uint32_t * address, uint32_t value)
{
// Turn on flash write enable and wait until the NVMC is ready:
NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos);
while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
{
// Do nothing.
}
*address = value;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
{
// Do nothing.
}
// Turn off flash write enable and wait until the NVMC is ready:
NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos);
while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
{
// Do nothing.
}
}
void flash_adc_write(uint16_t patwr_max, uint16_t patvr_min)
{
addr = (uint32_t *)(pg_size * pg_num);
// Erase page:
sd_flash_page_erase(pg_num);
//flash_page_erase(addr);
nrf_delay_ms(5);
flash_count++;
if (patold != patvr_min)
{
patold = patvr_min;
addr = addr + 2;
flash_word_write(addr, (uint32_t)patvr_min);
nrf_delay_us(50);
}
if(patold != patwr_max)
{
patold = patwr_max;
addr = addr + 1;
flash_word_write(addr, (uint32_t)patwr_max);
nrf_delay_us(50);
}
}
step 2: write 2 array in to flash and in this first array size is 8 byte and second array size is very from 4 to 20 byte.
below I add function() of write array in flash,
void flash_name_write(char patwr[], char number[])
{
int i = 0;
//uint32_t size = 1;
addr = (uint32_t *)(pg_size * (pg_num - 1));
sd_flash_page_erase(pg_num - 1);
//flash_page_erase(addr);
nrf_delay_ms(5);
flash_count++;
flash_word_write(++addr, 1);
//addr = addr + 1;
for(i=0; patwr[i] != '\0' ;i++)
//for(i=0; i<8 ;i++)
{
addr = addr + 1;
flash_word_write(addr, (uint32_t)patwr[i]);
//APP_ERROR_CHECK(sd_flash_write(addr, (uint32_t *)patwr[i], 1));
nrf_delay_us(50);
}
/*addr = addr + 1;
flash_word_write(addr, '\0');*/
for(i=0; i < 20; i++)
{
addr = addr + 1;
flash_word_write(addr, (uint32_t)number[i]);
//APP_ERROR_CHECK(sd_flash_write(addr, (uint32_t *)number[i], 1));
nrf_delay_us(50);
}
}
step 3: after this step I do soft reset for reset device.
When start application read all the data from flash for that I add function below,
typedef struct flash_variable
{
uint16_t adc_max_value;
uint16_t adc_min_value;
char DEVICE_NAME[9];
uint8_t SERIAL_NUMBER[21];
}FV;
void flash_adc_read(FV *fv)
{
int i = 0;
addr = (uint32_t *)(pg_size * pg_num);
addr = addr + 2;
fv->adc_min_value = (uint16_t)*(addr);
fv->adc_max_value = (uint16_t)*(++addr);
addr = (uint32_t *)(pg_size * (pg_num - 1));
addr = addr + 1;
for(i = 0; i<8; i++)
{
addr = addr + 1;
fv->DEVICE_NAME[i] = (char)*(addr);
}
addr = addr + 1;
fv->SERIAL_NUMBER[0] = (char)*(addr);
for(i = 1; i < 20; i++)
{
addr = addr + 1;
fv->SERIAL_NUMBER[i] = (char)*(addr);
}
}
When I follow below step continuous 20 time it work properly.
But after that i follow same step 21st time at this time I am getting problem in to step no 1 only but step 2 work properly.
so after 21st time I read flash in this my data is lost which is written in step no 1 only.
My question is what is the problem and how can I resolve this issue?
Also i observe that when i am getting below problem in this case i am showing some fix data is present into last page which is not written by me for reference I add below image,
So my question is what is indicate flash data mention in image?
Please give me some solution of it as soon as possible.
Thanks & regards,
Urvisha Andani