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

BLE and flash write problem

Hello,

I'm using nrf51822/s130/sdk12.1.0. Before adding BLE code there's no problem in writing inner flash. In main I just added below ble_app_uart codes(not modified).

  1. ble_stack_init();
  2. gap_params_init();
  3. services_init();
  4. advertising_init();
  5. conn_params_init();
  • S130 writed already.
  • I use flash area : 2K Bytes area from 0x30000(page 192).

After that reset occurs when writing inner flash. I don't know why. I have to use BLE. How should I do?

thanks,

Parents
  • I add my code.

    static void eraseFlashPage(uint32_t * page_address) { // Turn on flash erase enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos);

    while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
    {
    	// Do nothing.
    }
    
    // Erase page:
    NRF_NVMC->ERASEPAGE = (uint32_t)page_address;
    
    while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
    {
    	// Do nothing.
    }
    
    // Turn off flash erase 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.
    }
    

    }

    static void writeFlashPage(uint32_t * address, uint8_t value[]) { uint16_t i;

    // 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.
    }
    
    for(i=0; i<PAGE_PARAMETER_SIZE; i++)
    {
    	*(address + i) = value[i];
    }
    
    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.
    }
    

    }

    #define PAGE_SIZE 1024 #define PAGE_PARAMETER_SIZE PAGE_SIZE / 4 // 256 Byte / 1 page #define PARAMETER1_ADDR PAGE_SIZE * 192 // page 192, 0x30000 #define PARAMETER2_ADDR PAGE_SIZE * 193 // page 192, 0x30400 #define PARAMETER3_ADDR PAGE_SIZE * 194 // page 192, 0x30800 #define PARAMETER4_ADDR PAGE_SIZE * 195 // page 192, 0x30c00

    #define ERASE_FLASH_DELAY 5 // 5 mS #define WRITE_FLASH_DELAY 5 // 5 mS

    void infoSaveToFlash(void) { uint32_t err_code; uint32_t * addr; uint8_t wrData[PAGE_PARAMETER_SIZE] = {0}; uint16_t i;

    // __disable_irq(); // err_code = sd_softdevice_disable();

    lockInfo.lockStatus = lockPosition;
    
    
    // PARAMETER1_ADDR
    memcpy(wrData, &lockInfo, sizeof(param_t));
    
    addr = (uint32_t *)(PARAMETER1_ADDR);
    eraseFlashPage(addr);
    nrf_delay_ms(ERASE_FLASH_DELAY);
    writeFlashPage(addr, wrData);
    nrf_delay_ms(WRITE_FLASH_DELAY);
    
    
    // PARAMETER2_ADDR
    for(i=0; i<5; i++)
    {
    	memcpy(&wrData[PASSWORD_SIZE * i], &password[i][0], PASSWORD_SIZE);
    }
    
    addr = (uint32_t *)(PARAMETER2_ADDR);
    eraseFlashPage(addr);
    nrf_delay_ms(ERASE_FLASH_DELAY);
    writeFlashPage(addr, wrData);
    nrf_delay_ms(WRITE_FLASH_DELAY);
    
    
    // PARAMETER3_ADDR
    // PARAMETER4_ADDR
    // reserved
    

    // __enable_irq(); }

Reply
  • I add my code.

    static void eraseFlashPage(uint32_t * page_address) { // Turn on flash erase enable and wait until the NVMC is ready: NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Een << NVMC_CONFIG_WEN_Pos);

    while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
    {
    	// Do nothing.
    }
    
    // Erase page:
    NRF_NVMC->ERASEPAGE = (uint32_t)page_address;
    
    while (NRF_NVMC->READY == NVMC_READY_READY_Busy)
    {
    	// Do nothing.
    }
    
    // Turn off flash erase 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.
    }
    

    }

    static void writeFlashPage(uint32_t * address, uint8_t value[]) { uint16_t i;

    // 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.
    }
    
    for(i=0; i<PAGE_PARAMETER_SIZE; i++)
    {
    	*(address + i) = value[i];
    }
    
    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.
    }
    

    }

    #define PAGE_SIZE 1024 #define PAGE_PARAMETER_SIZE PAGE_SIZE / 4 // 256 Byte / 1 page #define PARAMETER1_ADDR PAGE_SIZE * 192 // page 192, 0x30000 #define PARAMETER2_ADDR PAGE_SIZE * 193 // page 192, 0x30400 #define PARAMETER3_ADDR PAGE_SIZE * 194 // page 192, 0x30800 #define PARAMETER4_ADDR PAGE_SIZE * 195 // page 192, 0x30c00

    #define ERASE_FLASH_DELAY 5 // 5 mS #define WRITE_FLASH_DELAY 5 // 5 mS

    void infoSaveToFlash(void) { uint32_t err_code; uint32_t * addr; uint8_t wrData[PAGE_PARAMETER_SIZE] = {0}; uint16_t i;

    // __disable_irq(); // err_code = sd_softdevice_disable();

    lockInfo.lockStatus = lockPosition;
    
    
    // PARAMETER1_ADDR
    memcpy(wrData, &lockInfo, sizeof(param_t));
    
    addr = (uint32_t *)(PARAMETER1_ADDR);
    eraseFlashPage(addr);
    nrf_delay_ms(ERASE_FLASH_DELAY);
    writeFlashPage(addr, wrData);
    nrf_delay_ms(WRITE_FLASH_DELAY);
    
    
    // PARAMETER2_ADDR
    for(i=0; i<5; i++)
    {
    	memcpy(&wrData[PASSWORD_SIZE * i], &password[i][0], PASSWORD_SIZE);
    }
    
    addr = (uint32_t *)(PARAMETER2_ADDR);
    eraseFlashPage(addr);
    nrf_delay_ms(ERASE_FLASH_DELAY);
    writeFlashPage(addr, wrData);
    nrf_delay_ms(WRITE_FLASH_DELAY);
    
    
    // PARAMETER3_ADDR
    // PARAMETER4_ADDR
    // reserved
    

    // __enable_irq(); }

Children
No Data
Related