<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>fstorage write&amp;amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/92799/fstorage-write-erase-interrupt-not-triggered-when-ble-init-called</link><description>I have written a word (32 bites) in 0xFF000 using nrf_fstorage_write(), When BLEInit(), nrf_fstorage_evt() callback not trigged, 
 
 BLE_Sleept() 
 nrf_storage_write() 
 BLE_wakeup()</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 18 Oct 2022 09:16:35 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/92799/fstorage-write-erase-interrupt-not-triggered-when-ble-init-called" /><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391132?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 09:16:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5a0af4bd-cb00-474e-929a-3579a6c06eb9</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you for reviewing, i will check&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391089?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 07:18:34 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f96b8dc5-285e-4227-8635-09631c6f6e8c</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;I noticed a few problems with your&amp;nbsp;write_to_flash() implementation, please see diff below for details. I did not review the other functions in your code.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="diff"&gt;diff --git a/source/Infa.c b/source/Infa.c
index 2168665..bca5633 100644
--- a/source/Infa.c
+++ b/source/Infa.c
@@ -38,7 +38,7 @@ NRF_FSTORAGE_DEF(nrf_fstorage_t my_instance) = {
 bool write_to_flash(uint32_t SAddr,uint32_t dLen,uint8_t *wData)
 {
  ret_code_t rc=0;
- NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Wen;
+ //NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Wen; // Remove. NVMC cannot be accessed when Softdevice is enabled
  
      rc = nrf_fstorage_write(&amp;amp;my_instance, /* The instance to use. */
 	 SAddr, /* 
@@ -49,10 +49,14 @@ bool write_to_flash(uint32_t SAddr,uint32_t dLen,uint8_t *wData)
 	 NULL   /* Optional parameter, backend-dependent. */
 	);
  
-     app_sched_execute();
+    // app_sched_execute(); // This function is meant to be called from the main loop
     //  nrf_delay_ms(1000);
     //iDebug(&amp;quot;\r\nflash write.... \r\n&amp;quot;);
-    while(nrf_fstorage_is_busy(&amp;amp;my_instance));
+    /* Remove while loop here. It will block forever if called from an interrupt context. 
+     * Note that fstorage can queue up multiple write operations so a wait loop like this should normally
+     * be reduntant
+     * /
+    //while(nrf_fstorage_is_busy(&amp;amp;my_instance)); 
     
     if (rc == NRF_SUCCESS) {
         //iDebug(&amp;quot;\r\nflash write success&amp;quot;);
@@ -508,7 +512,10 @@ void StartRadarApp()
    iDebug(&amp;quot; fs pgnum %ul&amp;quot;,pgnum);
    iDebug(&amp;quot; fs pgsize %ul &amp;quot;,pgsize);  
    read_from_flash(0xFF064,42);
-  
+    
+    static uint32_t data = 0xAAAAAAAA;
+    /* Test write */
+    write_to_flash(0xFF064, sizeof(uint32_t), (uint8_t *) &amp;amp;data);
    
     nrf_delay_ms(100);
     for (;;)

&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391082?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 06:05:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:af449b4b-2015-4c67-80e8-a368a0fd7ff5</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;Thank you for your reply, Can you check &amp;amp; reply&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/InfaRadar.zip"&gt;devzone.nordicsemi.com/.../InfaRadar.zip&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391080?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 05:50:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4680dd69-f14d-44bd-beb3-10c6d091efda</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Please upload your full project as a .zip file here. &lt;/p&gt;
&lt;p&gt;Here is how you upload attachments:&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" src="https://devzone.nordicsemi.com/resized-image/__size/640x480/__key/communityserver-discussions-components-files/4/pastedimage1666072224133v1.png" alt=" " /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391076?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 04:26:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:baaf532e-c686-40d3-9d55-1ff6bb41a6f3</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am&amp;nbsp;debugging using UART.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/391075?ContentTypeID=1</link><pubDate>Tue, 18 Oct 2022 04:25:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:cc5c751f-7853-4989-9e86-8799af4bd007</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;This is my code as follows:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;Infa.h&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;#define IMG_SIZE 16 //4096&lt;br /&gt;#define IMG_SIZE1 4 //4096&lt;/p&gt;
&lt;p&gt;__ALIGN(32) uint8_t img[4] = {12,13,14,15};&lt;br /&gt;__ALIGN(32) uint8_t img1[4] = {15,16,17,18};&lt;br /&gt;__ALIGN(32) uint8_t img_copy[IMG_SIZE] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};&lt;/p&gt;
&lt;p&gt;#define FLASH_START_ADDR 0xFF000//0x30000 //0x10001000 //0x3F000 //0x30000&lt;br /&gt;#define FLASH_START_ADDR1 0xFF000 //0x10001000 //0x3F000 //0x30000&lt;br /&gt;#define FLASH_START_ADDR2 0xFF008 &lt;br /&gt;bool write_finished = false, erase_finished = false;&lt;br /&gt;void callback(nrf_fstorage_evt_t *p_evt)&lt;br /&gt;{&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash result event&amp;quot;);&lt;br /&gt; /*if (p_evt-&amp;gt;id == FDS_EVT_INIT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash write result event&amp;quot;);&lt;br /&gt; write_finished = true;&lt;br /&gt; } */&lt;br /&gt; if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_WRITE_RESULT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash write result event&amp;quot;);&lt;br /&gt; write_finished = true;&lt;br /&gt; }&lt;br /&gt; if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_ERASE_RESULT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; erase write result event&amp;quot;);&lt;br /&gt; erase_finished = true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;NRF_FSTORAGE_DEF(nrf_fstorage_t my_instance) = {&lt;br /&gt; .evt_handler = callback,&lt;br /&gt; .start_addr = FLASH_START_ADDR,&lt;br /&gt; .end_addr = 0xFFFFF , //FLASH_START_ADDR + 32, //0x3ffff-1, // 10,&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;bool write_to_flash(int SAddr)&lt;br /&gt;{&lt;br /&gt; ret_code_t rc=0;&lt;br /&gt; NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Wen;&lt;br /&gt; if(SAddr==1){&lt;br /&gt; rc = nrf_fstorage_write(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR1, /* The address in flash where to store the data. */&lt;br /&gt; img, /* A pointer to the data. */&lt;br /&gt; IMG_SIZE1, /* IMG_SIZE, Lenght of the data, in bytes. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; else if(SAddr==2){&lt;br /&gt; rc = nrf_fstorage_write(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR2, /* The address in flash where to store the data. */&lt;br /&gt; img1, /* A pointer to the data. */&lt;br /&gt; IMG_SIZE1, /* IMG_SIZE, Lenght of the data, in bytes. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; app_sched_execute();&lt;br /&gt; // nrf_delay_ms(1000);&lt;br /&gt; iDebug(&amp;quot;\r\nflash write.... \r\n&amp;quot;);&lt;br /&gt; while(nrf_fstorage_is_busy(&amp;amp;my_instance));&lt;br /&gt; &lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; iDebug(&amp;quot;\r\nflash write success&amp;quot;);&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;\r\nflash write failure&amp;quot;);&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool read_from_flash(int rType)&lt;br /&gt;{&lt;br /&gt; ret_code_t rc = 0; &lt;br /&gt; &lt;br /&gt; if(rType==1){&lt;br /&gt; rc = nrf_fstorage_read(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR1, /* The address in flash where to read data from. */&lt;br /&gt; img_copy, /* A buffer to copy the data into. */&lt;br /&gt; 4 /* Lenght of the data, in bytes. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; else if(rType==2){&lt;br /&gt; rc = nrf_fstorage_read(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR2, /* The address in flash where to read data from. */&lt;br /&gt; img_copy, /* A buffer to copy the data into. */&lt;br /&gt; 4 /* Lenght of the data, in bytes. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; //iDebug(&amp;quot;\r\nflash read success - Size %d&amp;quot;,IMG_SIZE);&lt;br /&gt; for (int i = 0; i &amp;lt; 4; i++) {&lt;br /&gt; iDebug(&amp;quot;\r\nflash read [%d] = %d&amp;quot;, i,img_copy[i]);&lt;br /&gt; //if (img[i] != img_copy[i]) {&lt;br /&gt; // iDebug(&amp;quot;\r\nflash read unequal at index %d&amp;quot;, i);&lt;br /&gt; // return false;&lt;br /&gt; // }&lt;br /&gt; }&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;\r\nflash read Not success&amp;quot;);&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool erase_from_flash()&lt;br /&gt;{&lt;br /&gt;iDebug(&amp;quot;flash erase start..&amp;quot;);&lt;br /&gt; ret_code_t rc = nrf_fstorage_erase(&amp;amp;my_instance,/* The instance to use. */&lt;br /&gt; FLASH_START_ADDR, /* The address of the flash pages to erase. */&lt;br /&gt; 1, /* The number of pages to erase. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; &lt;br /&gt; );&lt;br /&gt; app_sched_execute();&lt;br /&gt; while(nrf_fstorage_is_busy(&amp;amp;my_instance));&lt;br /&gt; NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Een;&lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; iDebug(&amp;quot;flash erase success&amp;quot;);&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;flash erase failure %u&amp;quot; + rc );&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;//======================= TWI - DIO ====================================&lt;/p&gt;
&lt;p&gt;/* TWI instance ID. */&lt;br /&gt;#if TWI0_ENABLED&lt;br /&gt;#define TWI_INSTANCE_ID 0&lt;br /&gt;#elif TWI1_ENABLED&lt;br /&gt;#define TWI_INSTANCE_ID 1&lt;br /&gt;#endif&lt;/p&gt;
&lt;p&gt;/* Number of possible TWI addresses. */&lt;br /&gt;#define TWI_ADDRESSES 127&lt;br /&gt; /* Common addresses definition for temperature sensor. */&lt;br /&gt;#define MAX5805_ADDR (0x18)&lt;/p&gt;
&lt;p&gt;#define MAX5805_REG_REF_CMD 0x50U&lt;br /&gt;#define MAX5805_REG_REF_HI 0x00U&lt;br /&gt;#define MAX5805_REG_REF_LO 0x38U&lt;/p&gt;
&lt;p&gt;#define MAX5805_REG_POW_CMD 0x40U&lt;br /&gt;#define MAX5805_REG_POW_HI 0x00U&lt;br /&gt;#define MAX5805_REG_POW_LO 0x00U&lt;/p&gt;
&lt;p&gt;#define MAX5805_REG_CODELODE_CMD 0xB0U //0xA0U //0xB0U&lt;br /&gt;#define MAX5805_REG_CODELODE_HI 0x00 //0x08//0xFFU&lt;br /&gt;#define MAX5805_REG_CODELODE_LO 0x00 //0x00//0xF0U&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;#define MAX5805_REG_CONF 0x01U&lt;br /&gt;#define MAX5805_REG_POWER 0x02U&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/* Mode for LM75B. */&lt;br /&gt;#define NORMAL_MODE 0U&lt;br /&gt; &lt;br /&gt;#define SDA_PIN NRF_GPIO_PIN_MAP(0, 21)&lt;br /&gt;#define SCL_PIN NRF_GPIO_PIN_MAP(0, 23)&lt;/p&gt;
&lt;p&gt;/* Indicates if operation on TWI has ended. */&lt;br /&gt;static volatile bool m_xfer_done = false;&lt;/p&gt;
&lt;p&gt;/* Buffer for samples read from temperature sensor. */&lt;br /&gt;static uint8_t m_sample;&lt;/p&gt;
&lt;p&gt;/* TWI instance. */&lt;br /&gt;static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);&lt;br /&gt;//static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0);&lt;br /&gt;//=====================================================================&lt;br /&gt;/**Global variable declaration***/&lt;br /&gt;bool GetCurrentValue, PeriodicRead,GetModbusValue,SendMode;&lt;br /&gt;TransportMode_t IncomingTransportMode;&lt;br /&gt;uint16_t ModDataLen,ModStartAddr;&lt;br /&gt;uint16_t CalibValue4mA,CalibValue20mA,ProcessValue4mA,ProcessValue20mA;&lt;br /&gt;/*******************************/&lt;/p&gt;
&lt;p&gt;static void read_sensor_data()&lt;br /&gt;{&lt;br /&gt; m_xfer_done = false;&lt;/p&gt;
&lt;p&gt;/* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */&lt;br /&gt; ret_code_t err_code = nrf_drv_twi_rx(&amp;amp;m_twi, MAX5805_ADDR, &amp;amp;m_sample, sizeof(m_sample));&lt;br /&gt; uint8_t lenData= sizeof(m_sample);&lt;br /&gt; iDebug(&amp;quot;%d -- %d,%d&amp;quot;, m_sample,lenData,err_code);&lt;br /&gt; //APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; * @brief Function for setting active mode on MMA7660 accelerometer.&lt;br /&gt; */&lt;br /&gt;void MAX5805_set_mode(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;/* Writing to LM75B_REG_CONF &amp;quot;0&amp;quot; set temperature sensor in NORMAL mode. */&lt;br /&gt; //uint8_t reg[2] = {LM75B_REG_CONF, NORMAL_MODE};&lt;br /&gt; uint8_t reg[3] = {MAX5805_REG_CODELODE_CMD,MAX5805_REG_CODELODE_HI,MAX5805_REG_CODELODE_LO};&lt;br /&gt; //iDebug(&amp;quot;MAX5805_set_mode 1 &amp;quot; );&lt;br /&gt; err_code = nrf_drv_twi_tx(&amp;amp;m_twi, MAX5805_ADDR, reg, sizeof(reg), false);&lt;br /&gt; //iDebug(&amp;quot;MAX5805_set_mode 1 %d&amp;quot; ,err_code);&lt;br /&gt; //APP_ERROR_CHECK(err_code);&lt;br /&gt; if(err_code) {}&lt;br /&gt; while (m_xfer_done == false); &lt;br /&gt; &lt;br /&gt; /* Writing to pointer byte. */&lt;br /&gt; /* reg[0] = LM75B_REG_TEMP;&lt;br /&gt; m_xfer_done = false;&lt;br /&gt; err_code = nrf_drv_twi_tx(&amp;amp;m_twi, MAX5805_ADDR, reg, 1, false);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; while (m_xfer_done == false); */&lt;br /&gt; iDebug(&amp;quot;MAX5805_set_mode Write Success&amp;quot;);&lt;br /&gt; //uint8_t i=0;&lt;br /&gt; //if(i) &lt;br /&gt; read_sensor_data();&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt; * @brief Function for handling data from temperature sensor.&lt;br /&gt; *&lt;br /&gt; * @param[in] temp Temperature in Celsius degrees read from sensor.&lt;br /&gt; */&lt;br /&gt;__STATIC_INLINE void data_handler(uint8_t temp)&lt;br /&gt;{&lt;br /&gt; //NRF_LOG_INFO(&amp;quot;Temperature: %d Celsius degrees.&amp;quot;, temp);&lt;br /&gt; iDebug(&amp;quot;TWI device Read Value 0x%d.&amp;quot;, temp);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; * @brief TWI events handler.&lt;br /&gt; */&lt;br /&gt;void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)&lt;br /&gt;{&lt;br /&gt; //iDebug(&amp;quot;TWI handler 0x%d.&amp;quot;, p_event-&amp;gt;type);&lt;br /&gt; switch (p_event-&amp;gt;type)&lt;br /&gt; {&lt;br /&gt; case NRF_DRV_TWI_EVT_DONE:&lt;br /&gt; if (p_event-&amp;gt;xfer_desc.type == NRF_DRV_TWI_XFER_RX)&lt;br /&gt; {&lt;br /&gt; data_handler(m_sample);&lt;br /&gt; }&lt;br /&gt; m_xfer_done = true;&lt;br /&gt; break;&lt;br /&gt; default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; * @brief TWI initialization.&lt;br /&gt; */&lt;br /&gt;void twi_init (void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;const nrf_drv_twi_config_t twi_config = {&lt;br /&gt; .scl = SCL_PIN,&lt;br /&gt; .sda = SDA_PIN,&lt;br /&gt; .frequency = NRF_DRV_TWI_FREQ_100K,&lt;br /&gt; .interrupt_priority = APP_IRQ_PRIORITY_HIGH,&lt;br /&gt; .clear_bus_init = false&lt;br /&gt; };&lt;/p&gt;
&lt;p&gt;err_code = nrf_drv_twi_init(&amp;amp;m_twi, &amp;amp;twi_config, twi_handler, NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;nrf_drv_twi_enable(&amp;amp;m_twi);&lt;br /&gt;}&lt;br /&gt;/**&lt;br /&gt; * @brief Function for reading data from temperature sensor.&lt;br /&gt; */&lt;/p&gt;
&lt;p&gt;void ScanTWI(){ &lt;br /&gt; twi_init(); &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;void DataFilter(uint8_t *data, uint16_t len)&lt;br /&gt;{ &lt;br /&gt; SendMode=0;&lt;br /&gt; GetModbusValue = 0;&lt;br /&gt; //iDebug(&amp;quot;DataFilter \n&amp;quot;);&lt;br /&gt; if(!strncmp((char *)data, &amp;quot;getcurrent&amp;quot;, 10))&lt;br /&gt; {&lt;br /&gt; PeriodicRead = 0;&lt;br /&gt; GetCurrentValue = 1;&lt;br /&gt; }&lt;br /&gt; else if(!strncmp((char *)data, &amp;quot;getperiodic&amp;quot;, 11))&lt;br /&gt; {&lt;br /&gt; PeriodicRead = 1;&lt;br /&gt; }&lt;br /&gt; else if(!strncmp((char *)data, &amp;quot;stop&amp;quot;, 4))&lt;br /&gt; {&lt;br /&gt; PeriodicRead = 0;&lt;br /&gt; }&lt;br /&gt; else if(data[0] == 0x01) //Slave ID&lt;br /&gt; {&lt;br /&gt; //iDebug(&amp;quot;DataFilter 1 \n&amp;quot;);&lt;br /&gt; if(data[1] == 0x03) //Read Holding Reg.&lt;br /&gt; {&lt;br /&gt; //Start Address data[2] &amp;amp; data[3] &lt;br /&gt; ModStartAddr = data[3] |(data[2] &amp;lt;&amp;lt; 8);&lt;br /&gt; //iDebug(&amp;quot;ModStartAddr : %d, data[2] : %d, data[3] : %d \n&amp;quot;, ModStartAddr, data[2], data[3]);&lt;br /&gt; //Length data[4] &amp;amp; data[5] &lt;br /&gt; ModDataLen = data[5] | (data[4] &amp;lt;&amp;lt; 8);&lt;br /&gt; //iDebug(&amp;quot;ModDataLen : %d, data[4] : %d, data[5] : %d \n&amp;quot;,ModDataLen,data[4], data[5]); &lt;br /&gt; //CRC data[6] &amp;amp; data[7] &lt;br /&gt; &lt;br /&gt; PeriodicRead = 0;&lt;br /&gt; GetCurrentValue = 0;&lt;br /&gt; GetModbusValue = 1;&lt;br /&gt; SendMode=1;&lt;br /&gt; &lt;br /&gt; } &lt;br /&gt; else if(data[1] == 0x06) //Write Holding Reg.&lt;br /&gt; {&lt;br /&gt; //BLEdeInit();&lt;br /&gt; //bluetooth_sleep();&lt;br /&gt; //nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot;Write Start :&amp;quot;);&lt;br /&gt; &lt;br /&gt; img[0] = data[2] ;&lt;br /&gt; img[1] = data[3] ;&lt;br /&gt; img[2] = data[4] ;&lt;br /&gt; img[3] = data[5] ;&lt;br /&gt; img1[0] = data[6] ;&lt;br /&gt; img1[1] = data[7] ;&lt;br /&gt; img1[2] = data[8] ;&lt;br /&gt; img1[3] = data[9] ; &lt;br /&gt; for (int i = 0; i &amp;lt; 4; i++){&lt;br /&gt; iDebug(&amp;quot; %d, &amp;quot;,img[i]);&lt;br /&gt; }&lt;br /&gt; for (int i = 0; i &amp;lt; 4; i++){&lt;br /&gt; iDebug(&amp;quot; %d, &amp;quot;,img1[i]);&lt;br /&gt; }&lt;br /&gt; CalibValue4mA = data[3] |(data[2] &amp;lt;&amp;lt; 8);&lt;br /&gt; CalibValue20mA = data[5] |(data[4] &amp;lt;&amp;lt; 8);&lt;br /&gt; ProcessValue4mA = data[7] |(data[6] &amp;lt;&amp;lt; 8);&lt;br /&gt; ProcessValue20mA = data[9] |(data[8] &amp;lt;&amp;lt; 8);&lt;br /&gt; iDebug(&amp;quot;CalibValue4mA %d, &amp;quot;,CalibValue4mA);&lt;br /&gt; iDebug(&amp;quot;CalibValue20mA %d, &amp;quot;,CalibValue20mA);&lt;br /&gt; iDebug(&amp;quot;ProcessValue4mA %d, &amp;quot;,ProcessValue4mA);&lt;br /&gt; iDebug(&amp;quot;ProcessValue20mA %d, &amp;quot;,ProcessValue20mA);&lt;br /&gt; &lt;br /&gt; iDebug(&amp;quot;\r\nfs erase started.&amp;quot;); &lt;br /&gt; erase_from_flash();&lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; write_to_flash(1); &lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot;Write 1 &amp;quot;);&lt;br /&gt; write_to_flash(2); &lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot;Write Finished &amp;quot;);&lt;br /&gt; read_from_flash(1);&lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; read_from_flash(2);&lt;br /&gt; } &lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;uint8_t Bit_test(uint32_t var, uint8_t var_bit)&lt;br /&gt;{&lt;br /&gt; if((var &amp;amp; ((uint32_t)1 &amp;lt;&amp;lt; var_bit)))&lt;br /&gt; return 1;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;uint16_t CalcCRC(uint8_t *Logbuffer, uint8_t MsgLen)&lt;br /&gt;{&lt;br /&gt; uint16_t CRC, i;&lt;br /&gt; uint8_t j, *Ptr8, Val, CRCLSB;&lt;/p&gt;
&lt;p&gt;i = 0;&lt;br /&gt; CRC = 0xffff;&lt;br /&gt; Ptr8 = Logbuffer; // Preload with ffff&lt;br /&gt; do{&lt;br /&gt; Val = *Ptr8;&lt;br /&gt; CRC = CRC ^ Val;&lt;br /&gt; Ptr8++;&lt;br /&gt; j = 0;&lt;br /&gt; do{&lt;br /&gt; if(Bit_test(CRC, 0))CRCLSB = 1;&lt;br /&gt; else CRCLSB = 0;&lt;br /&gt; CRC &amp;gt;&amp;gt;= 1; // Shift one bit to the right&lt;br /&gt; if(CRCLSB) CRC = CRC ^ 0xa001;&lt;br /&gt; }while(++j &amp;lt; 8);&lt;br /&gt; i++;&lt;br /&gt; }while(--MsgLen); // For all message bytes&lt;br /&gt; return CRC;&lt;br /&gt;}&lt;br /&gt;void SendValue(TransportMode_t Mode)&lt;br /&gt;{&lt;br /&gt; dist_meas_result_t dist_meas_result;&lt;br /&gt; ReadDetection(&amp;amp;dist_meas_result);&lt;br /&gt; if(Mode == Ble)&lt;br /&gt; {&lt;br /&gt; BLEPrintf(&amp;quot;Distance = %u mm \n&amp;quot;,(unsigned int)(dist_meas_result.distance * 1000));&lt;br /&gt; BLEPrintf(&amp;quot;Signal Strength = %u\n&amp;quot;,dist_meas_result.signal_strength);&lt;br /&gt; BLEPrintf(&amp;quot;Data Saturated = %d \n&amp;quot;,dist_meas_result.data_saturated);&lt;br /&gt; }&lt;br /&gt; else if(Mode == Serial)&lt;br /&gt; {&lt;br /&gt; if(SendMode==0){&lt;br /&gt; char temp[128] = {0};&lt;br /&gt; sprintf(temp, &amp;quot;Distance = %u mm \nSignal Strength = %lu\nData Saturated = %ld \n&amp;quot;,(unsigned int)(dist_meas_result.distance * 1000), dist_meas_result.signal_strength, dist_meas_result.data_saturated);&lt;br /&gt; SendData(temp, strlen(temp));&lt;br /&gt; }&lt;br /&gt; else if(SendMode==1){&lt;br /&gt; uint8_t idx=0,SendData[64] = {0xff}, DataCRC[2] = {0xff}; &lt;br /&gt; uint16_t DataDistance = 0,DataSaturated=0,DataSignalStrength=0;&lt;br /&gt; uint16_t CRCVal=0;&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx 0 : %d\n&amp;quot;,idx);&lt;br /&gt; SendData[idx++] = 0x01; // Salve Address&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx 1 : %d\n&amp;quot;,idx);&lt;br /&gt; SendData[idx++] = 0x03; // Function code - Read Holding Reg&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx 2 : %d\n&amp;quot;,idx);&lt;br /&gt; SendData[idx++] = ModDataLen * 2; // Length &lt;br /&gt; //iDebug(&amp;quot;Modbuas idx 3 : %d\n&amp;quot;,idx);&lt;br /&gt; DataDistance = dist_meas_result.distance * 1000; &lt;br /&gt; DataSaturated = dist_meas_result.data_saturated;&lt;br /&gt; DataSignalStrength = dist_meas_result.signal_strength;&lt;br /&gt; if(ModDataLen ==1){&lt;br /&gt; SendData[idx++] = (DataDistance &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = DataDistance &amp;amp; 0xFF; // Data&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx 4 : %d\n&amp;quot;,idx); &lt;br /&gt; }&lt;br /&gt; if(ModDataLen ==2){&lt;br /&gt; SendData[idx++] = (DataDistance &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = DataDistance &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = (DataSignalStrength &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; //Signal Hi&lt;br /&gt; SendData[idx++] = (DataSignalStrength) &amp;amp; 0xFF;//SignalStrength Lo &lt;br /&gt; }&lt;br /&gt; if(ModDataLen ==3){&lt;br /&gt; SendData[idx++] = (DataDistance &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = DataDistance &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = (DataSignalStrength &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; //Signal Hi&lt;br /&gt; SendData[idx++] = (DataSignalStrength) &amp;amp; 0xFF;//SignalStrength Lo&lt;br /&gt; SendData[idx++] = (DataSaturated &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;//Saturated Hi&lt;br /&gt; SendData[idx++] = (DataSaturated) &amp;amp; 0xFF; ; // SaturatedLo &lt;br /&gt; }&lt;br /&gt; else{&lt;br /&gt; SendData[idx++] = (DataDistance &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = DataDistance &amp;amp; 0xFF; // Data &lt;br /&gt; SendData[idx++] = (DataSignalStrength &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; //Signal Hi&lt;br /&gt; SendData[idx++] = (DataSignalStrength) &amp;amp; 0xFF;//SignalStrength Lo&lt;br /&gt; SendData[idx++] = (DataSaturated &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;//Saturated Hi&lt;br /&gt; SendData[idx++] = (DataSaturated) &amp;amp; 0xFF; ; // SaturatedLo &lt;br /&gt; SendData[idx++] = (DataSaturated &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;//Saturated Hi&lt;br /&gt; SendData[idx++] = (DataSaturated) &amp;amp; 0xFF; ; // SaturatedLo&lt;br /&gt; }&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx : %d\n&amp;quot;,idx);&lt;br /&gt; CRCVal = CalcCRC(&amp;amp;SendData[0],idx );&lt;br /&gt; DataCRC[0] = (CRCVal &amp;gt;&amp;gt; 8) &amp;amp; 0xFF; &lt;br /&gt; DataCRC[1] = (CRCVal) &amp;amp; 0xFF; &lt;br /&gt; SendData[idx++] = DataCRC[1];// CRC Hi&lt;br /&gt; SendData[idx++] = DataCRC[0]; // CRC Lo&lt;br /&gt; //iDebug(&amp;quot;Modbuas idx - 1 : %d\n&amp;quot;,idx);&lt;br /&gt; SendModData(SendData,idx);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;void StartRadarApp()&lt;br /&gt;{&lt;br /&gt; InitRadar(); &lt;br /&gt; iDebug(&amp;quot;Application started.&amp;quot;);&lt;br /&gt; // Initialize&lt;br /&gt; nrf_fstorage_api_t * p_fs_api; &lt;br /&gt; p_fs_api = &amp;amp;nrf_fstorage_sd; &lt;br /&gt; iDebug(&amp;quot;fs Init started.&amp;quot;); &lt;br /&gt; nrf_fstorage_init(&amp;amp;my_instance,/*fstorage instance,previously defined. */&lt;br /&gt; p_fs_api, /* Name of the backend. */&lt;br /&gt; NULL /* Optional parameter, backend-dependant. */&lt;br /&gt; );&lt;/p&gt;
&lt;p&gt;nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot; BLE started. &amp;quot;); &lt;br /&gt; BLEInit();&lt;br /&gt; iDebug(&amp;quot; fs read started. &amp;quot;); &lt;br /&gt; uint32_t pgnum = NRF_FICR-&amp;gt;CODESIZE-1;&lt;br /&gt; uint32_t pgsize = NRF_FICR-&amp;gt;CODEPAGESIZE;&lt;br /&gt; iDebug(&amp;quot; fs pgnum %ul&amp;quot;,pgnum);&lt;br /&gt; iDebug(&amp;quot; fs pgsize %ul &amp;quot;,pgsize);&amp;nbsp; &lt;br /&gt; read_from_flash(1);&lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; read_from_flash(2);&lt;br /&gt;&lt;br /&gt; nrf_delay_ms(100);&lt;br /&gt; for (;;)&lt;br /&gt; { &lt;br /&gt; uint8_t buff[128] = {0};&lt;br /&gt; uint16_t bufflen = 0;&lt;br /&gt; if(BleReceiveData(buff, &amp;amp;bufflen))&lt;br /&gt; {&lt;br /&gt; DataFilter(buff, bufflen);&lt;br /&gt; memset(buff, 0 ,sizeof(buff));&lt;br /&gt; bufflen = 0;&lt;br /&gt; IncomingTransportMode = Ble;&lt;br /&gt; }&lt;br /&gt; if(RecvData(buff, &amp;amp;bufflen))&lt;br /&gt; {&lt;br /&gt; //iDebug(&amp;quot;Application started 1 &amp;quot;);&lt;br /&gt; //nrf_delay_ms(500);&lt;br /&gt; DataFilter(buff, bufflen);&lt;br /&gt; memset(buff, 0 ,sizeof(buff));&lt;br /&gt; bufflen = 0;&lt;br /&gt; IncomingTransportMode = Serial;&lt;br /&gt; }&lt;br /&gt; if(GetCurrentValue)&lt;br /&gt; {&lt;br /&gt; SendValue(IncomingTransportMode);&lt;br /&gt; GetCurrentValue = 0;&lt;br /&gt; }&lt;br /&gt; if(GetModbusValue){&lt;br /&gt; IncomingTransportMode = Serial;&lt;br /&gt; SendValue(IncomingTransportMode);&lt;br /&gt; GetModbusValue=0;&lt;br /&gt; }&lt;br /&gt; if(PeriodicRead)&lt;br /&gt; {&lt;br /&gt; SendValue(IncomingTransportMode);&lt;br /&gt; nrf_delay_ms(1000);&lt;br /&gt; }&lt;br /&gt; //Function for running power management. Should run in the main loop.&lt;br /&gt; nrf_pwr_mgmt_run();&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;==============================================&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;Infa.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#define APP_BLE_CONN_CFG_TAG 1 /**&amp;lt; A tag identifying the SoftDevice BLE configuration. */&lt;/p&gt;
&lt;p&gt;#define DEVICE_NAME &amp;quot;InfaRadar&amp;quot; /**&amp;lt; Name of device. Will be included in the advertising data. */&lt;br /&gt;#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**&amp;lt; UUID type for the Nordic UART Service (vendor specific). */&lt;/p&gt;
&lt;p&gt;#define APP_BLE_OBSERVER_PRIO 3 /**&amp;lt; Application&amp;#39;s BLE observer priority. You shouldn&amp;#39;t need to modify this value. */&lt;/p&gt;
&lt;p&gt;#define APP_ADV_INTERVAL 64 /**&amp;lt; The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */&lt;/p&gt;
&lt;p&gt;#define APP_ADV_DURATION 18000 /**&amp;lt; The advertising duration (180 seconds) in units of 10 milliseconds. */&lt;/p&gt;
&lt;p&gt;#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**&amp;lt; Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */&lt;br /&gt;#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**&amp;lt; Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */&lt;br /&gt;#define SLAVE_LATENCY 0 /**&amp;lt; Slave latency. */&lt;br /&gt;#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**&amp;lt; Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */&lt;br /&gt;#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**&amp;lt; Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */&lt;br /&gt;#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**&amp;lt; Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */&lt;br /&gt;#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**&amp;lt; Number of attempts before giving up the connection parameter negotiation. */&lt;/p&gt;
&lt;p&gt;#define DEAD_BEEF 0xDEADBEEF /**&amp;lt; Value used as error code on stack dump, can be used to identify stack location on stack unwind. */&lt;/p&gt;
&lt;p&gt;#define UART_TX_BUF_SIZE 256 /**&amp;lt; UART TX buffer size. */&lt;br /&gt;#define UART_RX_BUF_SIZE 256 /**&amp;lt; UART RX buffer size. */&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT); /**&amp;lt; BLE NUS service instance. */&lt;br /&gt;NRF_BLE_GATT_DEF(m_gatt); /**&amp;lt; GATT module instance. */&lt;br /&gt;NRF_BLE_QWR_DEF(m_qwr); /**&amp;lt; Context for the Queued Write module.*/&lt;br /&gt;BLE_ADVERTISING_DEF(m_advertising); /**&amp;lt; Advertising module instance. */&lt;/p&gt;
&lt;p&gt;static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**&amp;lt; Handle of the current connection. */&lt;br /&gt;static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**&amp;lt; Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */&lt;br /&gt;static ble_uuid_t m_adv_uuids[] = /**&amp;lt; Universally unique service identifier. */&lt;br /&gt;{&lt;br /&gt; {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;bool IsDataAvail;&lt;br /&gt;uint8_t DataBuff[256] = {0};&lt;br /&gt;uint16_t Datalen = 0;&lt;/p&gt;
&lt;p&gt;/**@brief Function for assert macro callback.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called in case of an assert in the SoftDevice.&lt;br /&gt; *&lt;br /&gt; * @warning This handler is an example only and does not fit a final product. You need to analyse&lt;br /&gt; * how your product is supposed to react in case of Assert.&lt;br /&gt; * @warning On assert from the SoftDevice, the system can only recover on reset.&lt;br /&gt; *&lt;br /&gt; * @param[in] line_num Line number of the failing ASSERT call.&lt;br /&gt; * @param[in] p_file_name File name of the failing ASSERT call.&lt;br /&gt; */&lt;br /&gt;void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)&lt;br /&gt;{&lt;br /&gt; app_error_handler(DEAD_BEEF, line_num, p_file_name);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**@brief Function for initializing the timer module.&lt;br /&gt; */&lt;br /&gt;static void timers_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = app_timer_init();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**@brief Function for the GAP initialization.&lt;br /&gt; *&lt;br /&gt; * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of&lt;br /&gt; * the device. It also sets the permissions and appearance.&lt;br /&gt; */&lt;br /&gt;static void gap_params_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_gap_conn_params_t gap_conn_params;&lt;br /&gt; ble_gap_conn_sec_mode_t sec_mode;&lt;/p&gt;
&lt;p&gt;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&amp;amp;sec_mode);&lt;/p&gt;
&lt;p&gt;err_code = sd_ble_gap_device_name_set(&amp;amp;sec_mode,&lt;br /&gt; (const uint8_t *) DEVICE_NAME,&lt;br /&gt; strlen(DEVICE_NAME));&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;gap_conn_params, 0, sizeof(gap_conn_params));&lt;/p&gt;
&lt;p&gt;gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;&lt;br /&gt; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;&lt;br /&gt; gap_conn_params.slave_latency = SLAVE_LATENCY;&lt;br /&gt; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;&lt;/p&gt;
&lt;p&gt;err_code = sd_ble_gap_ppcp_set(&amp;amp;gap_conn_params);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling Queued Write Module errors.&lt;br /&gt; *&lt;br /&gt; * @details A pointer to this function will be passed to each service which may need to inform the&lt;br /&gt; * application about an error.&lt;br /&gt; *&lt;br /&gt; * @param[in] nrf_error Error code containing information about what went wrong.&lt;br /&gt; */&lt;br /&gt;static void nrf_qwr_error_handler(uint32_t nrf_error)&lt;br /&gt;{&lt;br /&gt; APP_ERROR_HANDLER(nrf_error);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling the data from the Nordic UART Service.&lt;br /&gt; *&lt;br /&gt; * @details This function will process the data received from the Nordic UART BLE Service and send&lt;br /&gt; * it to the UART module.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_evt Nordic UART Service event.&lt;br /&gt; */&lt;br /&gt;/**@snippet [Handling the data received over BLE] */&lt;br /&gt;static void nus_data_handler(ble_nus_evt_t * p_evt)&lt;br /&gt;{&lt;br /&gt; if (p_evt-&amp;gt;type == BLE_NUS_EVT_RX_DATA)&lt;br /&gt; {&lt;br /&gt; memcpy(DataBuff, p_evt-&amp;gt;params.rx_data.p_data, p_evt-&amp;gt;params.rx_data.length);&lt;br /&gt; Datalen = p_evt-&amp;gt;params.rx_data.length;&lt;br /&gt; //PrintData((char *)p_evt-&amp;gt;params.rx_data.p_data, p_evt-&amp;gt;params.rx_data.length);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;/**@snippet [Handling the data received over BLE] */&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing services that will be used by the application.&lt;br /&gt; */&lt;br /&gt;static void services_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_nus_init_t nus_init;&lt;br /&gt; nrf_ble_qwr_init_t qwr_init = {0};&lt;/p&gt;
&lt;p&gt;// Initialize Queued Write Module.&lt;br /&gt; qwr_init.error_handler = nrf_qwr_error_handler;&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_qwr_init(&amp;amp;m_qwr, &amp;amp;qwr_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Initialize NUS.&lt;br /&gt; memset(&amp;amp;nus_init, 0, sizeof(nus_init));&lt;/p&gt;
&lt;p&gt;nus_init.data_handler = nus_data_handler;&lt;/p&gt;
&lt;p&gt;err_code = ble_nus_init(&amp;amp;m_nus, &amp;amp;nus_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling an event from the Connection Parameters Module.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called for all events in the Connection Parameters Module&lt;br /&gt; * which are passed to the application.&lt;br /&gt; *&lt;br /&gt; * @note All this function does is to disconnect. This could have been done by simply setting&lt;br /&gt; * the disconnect_on_fail config parameter, but instead we use the event handler&lt;br /&gt; * mechanism to demonstrate its use.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_evt Event received from the Connection Parameters Module.&lt;br /&gt; */&lt;br /&gt;static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;if (p_evt-&amp;gt;evt_type == BLE_CONN_PARAMS_EVT_FAILED)&lt;br /&gt; {&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling errors from the Connection Parameters module.&lt;br /&gt; *&lt;br /&gt; * @param[in] nrf_error Error code containing information about what went wrong.&lt;br /&gt; */&lt;br /&gt;static void conn_params_error_handler(uint32_t nrf_error)&lt;br /&gt;{&lt;br /&gt; APP_ERROR_HANDLER(nrf_error);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the Connection Parameters module.&lt;br /&gt; */&lt;br /&gt;static void conn_params_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_conn_params_init_t cp_init;&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;cp_init, 0, sizeof(cp_init));&lt;/p&gt;
&lt;p&gt;cp_init.p_conn_params = NULL;&lt;br /&gt; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;&lt;br /&gt; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;&lt;br /&gt; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;&lt;br /&gt; cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;&lt;br /&gt; cp_init.disconnect_on_fail = false;&lt;br /&gt; cp_init.evt_handler = on_conn_params_evt;&lt;br /&gt; cp_init.error_handler = conn_params_error_handler;&lt;/p&gt;
&lt;p&gt;err_code = ble_conn_params_init(&amp;amp;cp_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for putting the chip into sleep mode.&lt;br /&gt; *&lt;br /&gt; * @note This function will not return.&lt;br /&gt; */&lt;br /&gt;static void sleep_mode_enter(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Prepare wakeup buttons.&lt;br /&gt; err_code = bsp_btn_ble_sleep_mode_prepare();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Go to system-off mode (this function will not return; wakeup will cause a reset).&lt;br /&gt; err_code = sd_power_system_off();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling advertising events.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called for advertising events which are passed to the application.&lt;br /&gt; *&lt;br /&gt; * @param[in] ble_adv_evt Advertising event.&lt;br /&gt; */&lt;br /&gt;static void on_adv_evt(ble_adv_evt_t ble_adv_evt)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;switch (ble_adv_evt)&lt;br /&gt; {&lt;br /&gt; case BLE_ADV_EVT_FAST:&lt;br /&gt; err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;br /&gt; case BLE_ADV_EVT_IDLE:&lt;br /&gt; sleep_mode_enter();&lt;br /&gt; break;&lt;br /&gt; default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling BLE events.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_ble_evt Bluetooth stack event.&lt;br /&gt; * @param[in] p_context Unused.&lt;br /&gt; */&lt;br /&gt;static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;switch (p_ble_evt-&amp;gt;header.evt_id)&lt;br /&gt; {&lt;br /&gt; case BLE_GAP_EVT_CONNECTED:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connected&amp;quot;);&lt;br /&gt; err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; m_conn_handle = p_ble_evt-&amp;gt;evt.gap_evt.conn_handle;&lt;br /&gt; err_code = nrf_ble_qwr_conn_handle_assign(&amp;amp;m_qwr, m_conn_handle);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_DISCONNECTED:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Disconnected&amp;quot;);&lt;br /&gt; // LED indication will be changed when advertising starts.&lt;br /&gt; m_conn_handle = BLE_CONN_HANDLE_INVALID;&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_PHY_UPDATE_REQUEST:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;PHY update request.&amp;quot;);&lt;br /&gt; ble_gap_phys_t const phys =&lt;br /&gt; {&lt;br /&gt; .rx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; .tx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; };&lt;br /&gt; err_code = sd_ble_gap_phy_update(p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_SEC_PARAMS_REQUEST:&lt;br /&gt; // Pairing not supported&lt;br /&gt; err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTS_EVT_SYS_ATTR_MISSING:&lt;br /&gt; // No system attributes have been stored.&lt;br /&gt; err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTC_EVT_TIMEOUT:&lt;br /&gt; // Disconnect on GATT Client timeout event.&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gattc_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTS_EVT_TIMEOUT:&lt;br /&gt; // Disconnect on GATT Server timeout event.&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; // No implementation needed.&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for the SoftDevice initialization.&lt;br /&gt; *&lt;br /&gt; * @details This function initializes the SoftDevice and the BLE event interrupt.&lt;br /&gt; */&lt;br /&gt; static void ble_stack_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_sdh_enable_request();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Configure the BLE stack using the default settings.&lt;br /&gt; // Fetch the start address of the application RAM.&lt;br /&gt; uint32_t ram_start = 0;&lt;br /&gt; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Enable BLE stack.&lt;br /&gt; err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; &lt;br /&gt; // Register a handler for BLE events.&lt;br /&gt; NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);&lt;br /&gt;}&lt;br /&gt; /*&lt;br /&gt; #ifdef SOFTDEVICE_PRESENT&lt;br /&gt;static void ble_stack_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_sdh_enable_request();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Configure the BLE stack using the default settings.&lt;br /&gt; // Fetch the start address of the application RAM.&lt;br /&gt; uint32_t ram_start = 0;&lt;br /&gt; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Enable BLE stack.&lt;br /&gt; err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; &lt;br /&gt; // Register a handler for BLE events.&lt;br /&gt; NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);&lt;br /&gt;}&lt;br /&gt;#else&lt;br /&gt;static void clock_init(void){&lt;br /&gt; // Initialize the clock. &lt;br /&gt; ret_code rc = nrf_drv_clock_init();&lt;br /&gt; APP_ERROR_CHECK(rc);&lt;br /&gt; nrf_drv_clock_lfclk_request(NULL);&lt;br /&gt; &lt;br /&gt; while(!nrf_clock_lf_is_running()) {;}&lt;br /&gt;}&lt;br /&gt;#endif*/&lt;br /&gt;/**@brief Function for handling events from the GATT library. */&lt;br /&gt;void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)&lt;br /&gt;{&lt;br /&gt; if ((m_conn_handle == p_evt-&amp;gt;conn_handle) &amp;amp;&amp;amp; (p_evt-&amp;gt;evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))&lt;br /&gt; {&lt;br /&gt; m_ble_nus_max_data_len = p_evt-&amp;gt;params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Data len is set to 0x%X(%d)&amp;quot;, m_ble_nus_max_data_len, m_ble_nus_max_data_len);&lt;br /&gt; }&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;ATT MTU exchange completed. central 0x%x peripheral 0x%x&amp;quot;,&lt;br /&gt; p_gatt-&amp;gt;att_mtu_desired_central,&lt;br /&gt; p_gatt-&amp;gt;att_mtu_desired_periph);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the GATT library. */&lt;br /&gt;void gatt_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, gatt_evt_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_gatt_att_mtu_periph_set(&amp;amp;m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling events from the BSP module.&lt;br /&gt; *&lt;br /&gt; * @param[in] event Event generated by button press.&lt;br /&gt; */&lt;br /&gt;void bsp_event_handler(bsp_event_t event)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; switch (event)&lt;br /&gt; {&lt;br /&gt; case BSP_EVENT_SLEEP:&lt;br /&gt; sleep_mode_enter();&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BSP_EVENT_DISCONNECT:&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; if (err_code != NRF_ERROR_INVALID_STATE)&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BSP_EVENT_WHITELIST_OFF:&lt;br /&gt; if (m_conn_handle == BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; err_code = ble_advertising_restart_without_whitelist(&amp;amp;m_advertising);&lt;br /&gt; if (err_code != NRF_ERROR_INVALID_STATE)&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the Advertising functionality.&lt;br /&gt; */&lt;br /&gt;static void advertising_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_advertising_init_t init;&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;init, 0, sizeof(init));&lt;/p&gt;
&lt;p&gt;init.advdata.name_type = BLE_ADVDATA_FULL_NAME;&lt;br /&gt; init.advdata.include_appearance = false;&lt;br /&gt; init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;&lt;/p&gt;
&lt;p&gt;init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);&lt;br /&gt; init.srdata.uuids_complete.p_uuids = m_adv_uuids;&lt;/p&gt;
&lt;p&gt;init.config.ble_adv_fast_enabled = true;&lt;br /&gt; init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;&lt;br /&gt; init.config.ble_adv_fast_timeout = APP_ADV_DURATION;&lt;br /&gt; init.evt_handler = on_adv_evt;&lt;/p&gt;
&lt;p&gt;err_code = ble_advertising_init(&amp;amp;m_advertising, &amp;amp;init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;ble_advertising_conn_cfg_tag_set(&amp;amp;m_advertising, APP_BLE_CONN_CFG_TAG);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing buttons and leds.&lt;br /&gt; *&lt;br /&gt; * @param[out] p_erase_bonds Will be true if the clear bonding button was pressed to wake the application up.&lt;br /&gt; */&lt;br /&gt;static void buttons_leds_init(bool * p_erase_bonds)&lt;br /&gt;{&lt;br /&gt; bsp_event_t startup_event;&lt;/p&gt;
&lt;p&gt;uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = bsp_btn_ble_init(NULL, &amp;amp;startup_event);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for starting advertising.&lt;br /&gt; */&lt;br /&gt;static uint32_t advertising_start(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code = ble_advertising_start(&amp;amp;m_advertising, BLE_ADV_MODE_FAST);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; return err_code;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;uint32_t bluetooth_sleep(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; iDebug(&amp;quot;sd_ble_gap_disconnect 1 \n&amp;quot;);&lt;br /&gt; // If connected, disconnect&lt;br /&gt; if (m_conn_handle != BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;br /&gt; }&lt;br /&gt; iDebug(&amp;quot;sd_ble_gap_adv_stop 1 \n&amp;quot;);&lt;br /&gt; // Stop advertising&lt;br /&gt; err_code = sd_ble_gap_adv_stop(m_advertising.adv_handle);&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;br /&gt; iDebug(&amp;quot;TASKS_DISABLE 1 \n&amp;quot;);&lt;br /&gt; // Disable the radio tasks as scytulip suggested&lt;br /&gt; // devzone.nordicsemi.com/.../&lt;br /&gt; //NRF_RADIO-&amp;gt;TASKS_DISABLE =1;&lt;br /&gt; &lt;br /&gt; //NRF_RADIO-&amp;gt;POWER=0;&lt;br /&gt; iDebug(&amp;quot;NRF_SUCCESS 1 \n&amp;quot;);&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;uint32_t bluetooth_wake(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = advertising_start();&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;/p&gt;
&lt;p&gt;return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;void BLEInit()&lt;br /&gt;{&lt;br /&gt; bool erase_bonds;&lt;/p&gt;
&lt;p&gt;timers_init();&lt;br /&gt; buttons_leds_init(&amp;amp;erase_bonds);&lt;br /&gt; ////power_management_init();&lt;br /&gt; ble_stack_init();&lt;br /&gt; /*#ifdef SOFTDEVICE_PRESENT&lt;br /&gt; ble_stack_init();&lt;br /&gt; #else&lt;br /&gt; clock_init();&lt;br /&gt; #endif */&lt;br /&gt; iDebug(&amp;quot;gap_params_init \n&amp;quot;);&lt;br /&gt; gap_params_init();&lt;br /&gt; gatt_init();&lt;br /&gt; services_init();&lt;br /&gt; advertising_init();&lt;br /&gt; conn_params_init();&lt;br /&gt; //Start execution.&lt;br /&gt; advertising_start();&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;uint16_t BLESend(uint8_t *data, uint16_t length)&lt;br /&gt;{&lt;br /&gt; if(m_conn_handle == BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; return 0;&lt;br /&gt; }&lt;br /&gt; ble_nus_data_send(&amp;amp;m_nus, data, &amp;amp;length, m_conn_handle);&lt;br /&gt; nrf_delay_ms(50);&lt;br /&gt; return length;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;void BLEPrintf(const char * format, ... )&lt;br /&gt;{&lt;br /&gt; char buffer[256];&lt;br /&gt; va_list args;&lt;br /&gt; va_start(args, format);&lt;br /&gt; vsnprintf(buffer, 256, format, args);&lt;br /&gt; BLESend((uint8_t *)buffer, strlen(buffer));&lt;br /&gt; va_end(args);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool BleReceiveData(uint8_t *data, uint16_t *length)&lt;br /&gt;{&lt;br /&gt; if(Datalen == 0)&lt;br /&gt; {&lt;br /&gt; return 0;&lt;br /&gt; }&lt;br /&gt; memcpy(data, DataBuff, Datalen);&lt;br /&gt; *length = Datalen;&lt;br /&gt; memset(DataBuff, &amp;#39;0&amp;#39;, Datalen);&lt;br /&gt; Datalen = 0;&lt;br /&gt; return 1;&lt;br /&gt;}&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390956?ContentTypeID=1</link><pubDate>Mon, 17 Oct 2022 10:45:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:37270816-4f61-414b-b9a3-c060ead35849</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;I cannot tell what the program flow is based on the code snippet you posted. Can you upload a minimal version of your project so I can try to run it here?&lt;/p&gt;
[quote userid="120428" url="~/f/nordic-q-a/92799/fstorage-write-erase-interrupt-not-triggered-when-ble-init-called/390945"]But I could not see any improvement.[/quote]
&lt;p&gt;Have you performed any debugging to see if the program gets stuck or crashes?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390945?ContentTypeID=1</link><pubDate>Mon, 17 Oct 2022 09:57:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f8a543b5-af9a-4168-aaae-e50554920403</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>[quote userid="120428" url="~/f/nordic-q-a/92799/fstorage-write-erase-interrupt-not-triggered-when-ble-init-called/390902"]&lt;p&gt;Sorry for the delay, Thank you for your reply. I have changed the code as follows:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;nrf_fstorage_api_t * p_fs_api; &lt;br /&gt; p_fs_api = &amp;amp;nrf_fstorage_nvmc;&amp;nbsp; -- I have changed to&amp;nbsp;&amp;nbsp;&lt;span&gt;p_fs_api = &amp;amp;nrf_fstorage_sd;&amp;nbsp;&lt;/span&gt;&lt;br /&gt; iDebug(&amp;quot;fs Init started.&amp;quot;); &lt;br /&gt; nrf_fstorage_init(&amp;amp;my_instance,/*fstorage instance,previously defined. */&lt;br /&gt; p_fs_api, /* Name of the backend. */&lt;br /&gt; NULL /* Optional parameter, backend-dependant. */&lt;br /&gt; );&lt;/p&gt;
&lt;p&gt;But I could not see any improvement.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Can you share , if i have missed any point that you have given&lt;/p&gt;[/quote]&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390902?ContentTypeID=1</link><pubDate>Mon, 17 Oct 2022 07:12:14 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5b3e9f33-f181-47f3-bbd2-0df86c47908c</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Sorry for the delay, Thank you for your reply. I have changed the code as follows:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;nrf_fstorage_api_t * p_fs_api; &lt;br /&gt; p_fs_api = &amp;amp;nrf_fstorage_nvmc;&amp;nbsp; -- I have changed to&amp;nbsp;&amp;nbsp;&lt;span&gt;p_fs_api = &amp;amp;nrf_fstorage_sd;&amp;nbsp;&lt;/span&gt;&lt;br /&gt; iDebug(&amp;quot;fs Init started.&amp;quot;); &lt;br /&gt; nrf_fstorage_init(&amp;amp;my_instance,/*fstorage instance,previously defined. */&lt;br /&gt; p_fs_api, /* Name of the backend. */&lt;br /&gt; NULL /* Optional parameter, backend-dependant. */&lt;br /&gt; );&lt;/p&gt;
&lt;p&gt;But I could not see any improvement.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Can you share , if i have missed any point that you have given&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390551?ContentTypeID=1</link><pubDate>Thu, 13 Oct 2022 06:25:37 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c42979ff-f3ca-4de8-8f1d-389a901d6871</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;The Softdevice reserves access to the NVMC peripheral so you can&amp;#39;t write directly to its registers directly. Doing so will trigger a fault exception, see &lt;span&gt;&lt;a title="Memory isolation and runtime protection" href="https://infocenter.nordicsemi.com/topic/sds_s140/SDS/s1xx/sd_mgr/mem_isolation_runtime_protection.html?cp=4_7_4_0_4_3"&gt;Memory isolation and runtime protection&lt;/a&gt;.&amp;nbsp; So, to prevent the system from halting, y&lt;/span&gt;ou need to select the &lt;span&gt;&lt;a title="SoftDevice backend" href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/lib_fstorage.html?cp=8_1_3_17_5_0#lib_fstorage_sd"&gt;SoftDevice backend&lt;/a&gt;&lt;/span&gt; for fstorage and remove the write accesses to &amp;quot;NRF_NVMC&amp;quot; in your code.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390536?ContentTypeID=1</link><pubDate>Thu, 13 Oct 2022 03:52:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:18092b05-70c1-4b66-80d7-ad515f8b4df2</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hi Vidar,&lt;/p&gt;
&lt;p&gt;Our SDK Version is:&amp;nbsp;SDK Version nRF_SDK_15.3.0.59ac345&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390535?ContentTypeID=1</link><pubDate>Thu, 13 Oct 2022 03:43:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9885ea6d-af5c-4de9-82ce-1d5b5e47d60f</guid><dc:creator>GSV R&amp;amp;D</dc:creator><description>&lt;p&gt;Hi Vidar,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you for your reply,&lt;/p&gt;
&lt;p&gt;Now I am explaining the code,&amp;nbsp; initially, Init BLE as&lt;/p&gt;
&lt;p&gt;#include &amp;quot;Infa.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#define APP_BLE_CONN_CFG_TAG 1 /**&amp;lt; A tag identifying the SoftDevice BLE configuration. */&lt;/p&gt;
&lt;p&gt;#define DEVICE_NAME &amp;quot;InfaRadar&amp;quot; /**&amp;lt; Name of device. Will be included in the advertising data. */&lt;br /&gt;#define NUS_SERVICE_UUID_TYPE BLE_UUID_TYPE_VENDOR_BEGIN /**&amp;lt; UUID type for the Nordic UART Service (vendor specific). */&lt;/p&gt;
&lt;p&gt;#define APP_BLE_OBSERVER_PRIO 3 /**&amp;lt; Application&amp;#39;s BLE observer priority. You shouldn&amp;#39;t need to modify this value. */&lt;/p&gt;
&lt;p&gt;#define APP_ADV_INTERVAL 64 /**&amp;lt; The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */&lt;/p&gt;
&lt;p&gt;#define APP_ADV_DURATION 18000 /**&amp;lt; The advertising duration (180 seconds) in units of 10 milliseconds. */&lt;/p&gt;
&lt;p&gt;#define MIN_CONN_INTERVAL MSEC_TO_UNITS(20, UNIT_1_25_MS) /**&amp;lt; Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */&lt;br /&gt;#define MAX_CONN_INTERVAL MSEC_TO_UNITS(75, UNIT_1_25_MS) /**&amp;lt; Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */&lt;br /&gt;#define SLAVE_LATENCY 0 /**&amp;lt; Slave latency. */&lt;br /&gt;#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**&amp;lt; Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */&lt;br /&gt;#define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(5000) /**&amp;lt; Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */&lt;br /&gt;#define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(30000) /**&amp;lt; Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */&lt;br /&gt;#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**&amp;lt; Number of attempts before giving up the connection parameter negotiation. */&lt;/p&gt;
&lt;p&gt;#define DEAD_BEEF 0xDEADBEEF /**&amp;lt; Value used as error code on stack dump, can be used to identify stack location on stack unwind. */&lt;/p&gt;
&lt;p&gt;#define UART_TX_BUF_SIZE 256 /**&amp;lt; UART TX buffer size. */&lt;br /&gt;#define UART_RX_BUF_SIZE 256 /**&amp;lt; UART RX buffer size. */&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT); /**&amp;lt; BLE NUS service instance. */&lt;br /&gt;NRF_BLE_GATT_DEF(m_gatt); /**&amp;lt; GATT module instance. */&lt;br /&gt;NRF_BLE_QWR_DEF(m_qwr); /**&amp;lt; Context for the Queued Write module.*/&lt;br /&gt;BLE_ADVERTISING_DEF(m_advertising); /**&amp;lt; Advertising module instance. */&lt;/p&gt;
&lt;p&gt;static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**&amp;lt; Handle of the current connection. */&lt;br /&gt;static uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**&amp;lt; Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */&lt;br /&gt;static ble_uuid_t m_adv_uuids[] = /**&amp;lt; Universally unique service identifier. */&lt;br /&gt;{&lt;br /&gt; {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;bool IsDataAvail;&lt;br /&gt;uint8_t DataBuff[256] = {0};&lt;br /&gt;uint16_t Datalen = 0;&lt;/p&gt;
&lt;p&gt;/**@brief Function for assert macro callback.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called in case of an assert in the SoftDevice.&lt;br /&gt; *&lt;br /&gt; * @warning This handler is an example only and does not fit a final product. You need to analyse&lt;br /&gt; * how your product is supposed to react in case of Assert.&lt;br /&gt; * @warning On assert from the SoftDevice, the system can only recover on reset.&lt;br /&gt; *&lt;br /&gt; * @param[in] line_num Line number of the failing ASSERT call.&lt;br /&gt; * @param[in] p_file_name File name of the failing ASSERT call.&lt;br /&gt; */&lt;br /&gt;void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)&lt;br /&gt;{&lt;br /&gt; app_error_handler(DEAD_BEEF, line_num, p_file_name);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**@brief Function for initializing the timer module.&lt;br /&gt; */&lt;br /&gt;static void timers_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code = app_timer_init();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/**@brief Function for the GAP initialization.&lt;br /&gt; *&lt;br /&gt; * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of&lt;br /&gt; * the device. It also sets the permissions and appearance.&lt;br /&gt; */&lt;br /&gt;static void gap_params_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_gap_conn_params_t gap_conn_params;&lt;br /&gt; ble_gap_conn_sec_mode_t sec_mode;&lt;/p&gt;
&lt;p&gt;BLE_GAP_CONN_SEC_MODE_SET_OPEN(&amp;amp;sec_mode);&lt;/p&gt;
&lt;p&gt;err_code = sd_ble_gap_device_name_set(&amp;amp;sec_mode,&lt;br /&gt; (const uint8_t *) DEVICE_NAME,&lt;br /&gt; strlen(DEVICE_NAME));&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;gap_conn_params, 0, sizeof(gap_conn_params));&lt;/p&gt;
&lt;p&gt;gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;&lt;br /&gt; gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;&lt;br /&gt; gap_conn_params.slave_latency = SLAVE_LATENCY;&lt;br /&gt; gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT;&lt;/p&gt;
&lt;p&gt;err_code = sd_ble_gap_ppcp_set(&amp;amp;gap_conn_params);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling Queued Write Module errors.&lt;br /&gt; *&lt;br /&gt; * @details A pointer to this function will be passed to each service which may need to inform the&lt;br /&gt; * application about an error.&lt;br /&gt; *&lt;br /&gt; * @param[in] nrf_error Error code containing information about what went wrong.&lt;br /&gt; */&lt;br /&gt;static void nrf_qwr_error_handler(uint32_t nrf_error)&lt;br /&gt;{&lt;br /&gt; APP_ERROR_HANDLER(nrf_error);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling the data from the Nordic UART Service.&lt;br /&gt; *&lt;br /&gt; * @details This function will process the data received from the Nordic UART BLE Service and send&lt;br /&gt; * it to the UART module.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_evt Nordic UART Service event.&lt;br /&gt; */&lt;br /&gt;/**@snippet [Handling the data received over BLE] */&lt;br /&gt;static void nus_data_handler(ble_nus_evt_t * p_evt)&lt;br /&gt;{&lt;br /&gt; if (p_evt-&amp;gt;type == BLE_NUS_EVT_RX_DATA)&lt;br /&gt; {&lt;br /&gt; memcpy(DataBuff, p_evt-&amp;gt;params.rx_data.p_data, p_evt-&amp;gt;params.rx_data.length);&lt;br /&gt; Datalen = p_evt-&amp;gt;params.rx_data.length;&lt;br /&gt; //PrintData((char *)p_evt-&amp;gt;params.rx_data.p_data, p_evt-&amp;gt;params.rx_data.length);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;/**@snippet [Handling the data received over BLE] */&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing services that will be used by the application.&lt;br /&gt; */&lt;br /&gt;static void services_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_nus_init_t nus_init;&lt;br /&gt; nrf_ble_qwr_init_t qwr_init = {0};&lt;/p&gt;
&lt;p&gt;// Initialize Queued Write Module.&lt;br /&gt; qwr_init.error_handler = nrf_qwr_error_handler;&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_qwr_init(&amp;amp;m_qwr, &amp;amp;qwr_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Initialize NUS.&lt;br /&gt; memset(&amp;amp;nus_init, 0, sizeof(nus_init));&lt;/p&gt;
&lt;p&gt;nus_init.data_handler = nus_data_handler;&lt;/p&gt;
&lt;p&gt;err_code = ble_nus_init(&amp;amp;m_nus, &amp;amp;nus_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling an event from the Connection Parameters Module.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called for all events in the Connection Parameters Module&lt;br /&gt; * which are passed to the application.&lt;br /&gt; *&lt;br /&gt; * @note All this function does is to disconnect. This could have been done by simply setting&lt;br /&gt; * the disconnect_on_fail config parameter, but instead we use the event handler&lt;br /&gt; * mechanism to demonstrate its use.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_evt Event received from the Connection Parameters Module.&lt;br /&gt; */&lt;br /&gt;static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;if (p_evt-&amp;gt;evt_type == BLE_CONN_PARAMS_EVT_FAILED)&lt;br /&gt; {&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling errors from the Connection Parameters module.&lt;br /&gt; *&lt;br /&gt; * @param[in] nrf_error Error code containing information about what went wrong.&lt;br /&gt; */&lt;br /&gt;static void conn_params_error_handler(uint32_t nrf_error)&lt;br /&gt;{&lt;br /&gt; APP_ERROR_HANDLER(nrf_error);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the Connection Parameters module.&lt;br /&gt; */&lt;br /&gt;static void conn_params_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_conn_params_init_t cp_init;&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;cp_init, 0, sizeof(cp_init));&lt;/p&gt;
&lt;p&gt;cp_init.p_conn_params = NULL;&lt;br /&gt; cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;&lt;br /&gt; cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY;&lt;br /&gt; cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT;&lt;br /&gt; cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID;&lt;br /&gt; cp_init.disconnect_on_fail = false;&lt;br /&gt; cp_init.evt_handler = on_conn_params_evt;&lt;br /&gt; cp_init.error_handler = conn_params_error_handler;&lt;/p&gt;
&lt;p&gt;err_code = ble_conn_params_init(&amp;amp;cp_init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for putting the chip into sleep mode.&lt;br /&gt; *&lt;br /&gt; * @note This function will not return.&lt;br /&gt; */&lt;br /&gt;static void sleep_mode_enter(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Prepare wakeup buttons.&lt;br /&gt; err_code = bsp_btn_ble_sleep_mode_prepare();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Go to system-off mode (this function will not return; wakeup will cause a reset).&lt;br /&gt; err_code = sd_power_system_off();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling advertising events.&lt;br /&gt; *&lt;br /&gt; * @details This function will be called for advertising events which are passed to the application.&lt;br /&gt; *&lt;br /&gt; * @param[in] ble_adv_evt Advertising event.&lt;br /&gt; */&lt;br /&gt;static void on_adv_evt(ble_adv_evt_t ble_adv_evt)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;switch (ble_adv_evt)&lt;br /&gt; {&lt;br /&gt; case BLE_ADV_EVT_FAST:&lt;br /&gt; err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;br /&gt; case BLE_ADV_EVT_IDLE:&lt;br /&gt; sleep_mode_enter();&lt;br /&gt; break;&lt;br /&gt; default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling BLE events.&lt;br /&gt; *&lt;br /&gt; * @param[in] p_ble_evt Bluetooth stack event.&lt;br /&gt; * @param[in] p_context Unused.&lt;br /&gt; */&lt;br /&gt;static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;switch (p_ble_evt-&amp;gt;header.evt_id)&lt;br /&gt; {&lt;br /&gt; case BLE_GAP_EVT_CONNECTED:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Connected&amp;quot;);&lt;br /&gt; err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; m_conn_handle = p_ble_evt-&amp;gt;evt.gap_evt.conn_handle;&lt;br /&gt; err_code = nrf_ble_qwr_conn_handle_assign(&amp;amp;m_qwr, m_conn_handle);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_DISCONNECTED:&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Disconnected&amp;quot;);&lt;br /&gt; // LED indication will be changed when advertising starts.&lt;br /&gt; m_conn_handle = BLE_CONN_HANDLE_INVALID;&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_PHY_UPDATE_REQUEST:&lt;br /&gt; {&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;PHY update request.&amp;quot;);&lt;br /&gt; ble_gap_phys_t const phys =&lt;br /&gt; {&lt;br /&gt; .rx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; .tx_phys = BLE_GAP_PHY_AUTO,&lt;br /&gt; };&lt;br /&gt; err_code = sd_ble_gap_phy_update(p_ble_evt-&amp;gt;evt.gap_evt.conn_handle, &amp;amp;phys);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; } break;&lt;/p&gt;
&lt;p&gt;case BLE_GAP_EVT_SEC_PARAMS_REQUEST:&lt;br /&gt; // Pairing not supported&lt;br /&gt; err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTS_EVT_SYS_ATTR_MISSING:&lt;br /&gt; // No system attributes have been stored.&lt;br /&gt; err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTC_EVT_TIMEOUT:&lt;br /&gt; // Disconnect on GATT Client timeout event.&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gattc_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BLE_GATTS_EVT_TIMEOUT:&lt;br /&gt; // Disconnect on GATT Server timeout event.&lt;br /&gt; err_code = sd_ble_gap_disconnect(p_ble_evt-&amp;gt;evt.gatts_evt.conn_handle,&lt;br /&gt; BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; // No implementation needed.&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for the SoftDevice initialization.&lt;br /&gt; *&lt;br /&gt; * @details This function initializes the SoftDevice and the BLE event interrupt.&lt;br /&gt; */&lt;br /&gt; static void ble_stack_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_sdh_enable_request();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Configure the BLE stack using the default settings.&lt;br /&gt; // Fetch the start address of the application RAM.&lt;br /&gt; uint32_t ram_start = 0;&lt;br /&gt; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Enable BLE stack.&lt;br /&gt; err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; &lt;br /&gt; // Register a handler for BLE events.&lt;br /&gt; NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);&lt;br /&gt;}&lt;br /&gt; /*&lt;br /&gt; #ifdef SOFTDEVICE_PRESENT&lt;br /&gt;static void ble_stack_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_sdh_enable_request();&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Configure the BLE stack using the default settings.&lt;br /&gt; // Fetch the start address of the application RAM.&lt;br /&gt; uint32_t ram_start = 0;&lt;br /&gt; err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;// Enable BLE stack.&lt;br /&gt; err_code = nrf_sdh_ble_enable(&amp;amp;ram_start);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; &lt;br /&gt; // Register a handler for BLE events.&lt;br /&gt; NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);&lt;br /&gt;}&lt;br /&gt;#else&lt;br /&gt;static void clock_init(void){&lt;br /&gt; // Initialize the clock. &lt;br /&gt; ret_code rc = nrf_drv_clock_init();&lt;br /&gt; APP_ERROR_CHECK(rc);&lt;br /&gt; nrf_drv_clock_lfclk_request(NULL);&lt;br /&gt; &lt;br /&gt; while(!nrf_clock_lf_is_running()) {;}&lt;br /&gt;}&lt;br /&gt;#endif*/&lt;br /&gt;/**@brief Function for handling events from the GATT library. */&lt;br /&gt;void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)&lt;br /&gt;{&lt;br /&gt; if ((m_conn_handle == p_evt-&amp;gt;conn_handle) &amp;amp;&amp;amp; (p_evt-&amp;gt;evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))&lt;br /&gt; {&lt;br /&gt; m_ble_nus_max_data_len = p_evt-&amp;gt;params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;&lt;br /&gt; NRF_LOG_INFO(&amp;quot;Data len is set to 0x%X(%d)&amp;quot;, m_ble_nus_max_data_len, m_ble_nus_max_data_len);&lt;br /&gt; }&lt;br /&gt; NRF_LOG_DEBUG(&amp;quot;ATT MTU exchange completed. central 0x%x peripheral 0x%x&amp;quot;,&lt;br /&gt; p_gatt-&amp;gt;att_mtu_desired_central,&lt;br /&gt; p_gatt-&amp;gt;att_mtu_desired_periph);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the GATT library. */&lt;br /&gt;void gatt_init(void)&lt;br /&gt;{&lt;br /&gt; ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_gatt_init(&amp;amp;m_gatt, gatt_evt_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = nrf_ble_gatt_att_mtu_periph_set(&amp;amp;m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for handling events from the BSP module.&lt;br /&gt; *&lt;br /&gt; * @param[in] event Event generated by button press.&lt;br /&gt; */&lt;br /&gt;void bsp_event_handler(bsp_event_t event)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; switch (event)&lt;br /&gt; {&lt;br /&gt; case BSP_EVENT_SLEEP:&lt;br /&gt; sleep_mode_enter();&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BSP_EVENT_DISCONNECT:&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; if (err_code != NRF_ERROR_INVALID_STATE)&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;case BSP_EVENT_WHITELIST_OFF:&lt;br /&gt; if (m_conn_handle == BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; err_code = ble_advertising_restart_without_whitelist(&amp;amp;m_advertising);&lt;br /&gt; if (err_code != NRF_ERROR_INVALID_STATE)&lt;br /&gt; {&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; break;&lt;/p&gt;
&lt;p&gt;default:&lt;br /&gt; break;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing the Advertising functionality.&lt;br /&gt; */&lt;br /&gt;static void advertising_init(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; ble_advertising_init_t init;&lt;/p&gt;
&lt;p&gt;memset(&amp;amp;init, 0, sizeof(init));&lt;/p&gt;
&lt;p&gt;init.advdata.name_type = BLE_ADVDATA_FULL_NAME;&lt;br /&gt; init.advdata.include_appearance = false;&lt;br /&gt; init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;&lt;/p&gt;
&lt;p&gt;init.srdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]);&lt;br /&gt; init.srdata.uuids_complete.p_uuids = m_adv_uuids;&lt;/p&gt;
&lt;p&gt;init.config.ble_adv_fast_enabled = true;&lt;br /&gt; init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;&lt;br /&gt; init.config.ble_adv_fast_timeout = APP_ADV_DURATION;&lt;br /&gt; init.evt_handler = on_adv_evt;&lt;/p&gt;
&lt;p&gt;err_code = ble_advertising_init(&amp;amp;m_advertising, &amp;amp;init);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;ble_advertising_conn_cfg_tag_set(&amp;amp;m_advertising, APP_BLE_CONN_CFG_TAG);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for initializing buttons and leds.&lt;br /&gt; *&lt;br /&gt; * @param[out] p_erase_bonds Will be true if the clear bonding button was pressed to wake the application up.&lt;br /&gt; */&lt;br /&gt;static void buttons_leds_init(bool * p_erase_bonds)&lt;br /&gt;{&lt;br /&gt; bsp_event_t startup_event;&lt;/p&gt;
&lt;p&gt;uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;err_code = bsp_btn_ble_init(NULL, &amp;amp;startup_event);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;/**@brief Function for starting advertising.&lt;br /&gt; */&lt;br /&gt;static uint32_t advertising_start(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code = ble_advertising_start(&amp;amp;m_advertising, BLE_ADV_MODE_FAST);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;br /&gt; return err_code;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;uint32_t bluetooth_sleep(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;br /&gt; iDebug(&amp;quot;sd_ble_gap_disconnect 1 \n&amp;quot;);&lt;br /&gt; // If connected, disconnect&lt;br /&gt; if (m_conn_handle != BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;br /&gt; }&lt;br /&gt; iDebug(&amp;quot;sd_ble_gap_adv_stop 1 \n&amp;quot;);&lt;br /&gt; // Stop advertising&lt;br /&gt; err_code = sd_ble_gap_adv_stop(m_advertising.adv_handle);&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;br /&gt; iDebug(&amp;quot;TASKS_DISABLE 1 \n&amp;quot;);&lt;br /&gt; // Disable the radio tasks as scytulip suggested&lt;br /&gt; // devzone.nordicsemi.com/.../&lt;br /&gt; //NRF_RADIO-&amp;gt;TASKS_DISABLE =1;&lt;br /&gt; &lt;br /&gt; //NRF_RADIO-&amp;gt;POWER=0;&lt;br /&gt; iDebug(&amp;quot;NRF_SUCCESS 1 \n&amp;quot;);&lt;br /&gt; return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;uint32_t bluetooth_wake(void)&lt;br /&gt;{&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;err_code = advertising_start();&lt;br /&gt; if (err_code != NRF_SUCCESS) return err_code;&lt;/p&gt;
&lt;p&gt;return NRF_SUCCESS;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;void BLEInit()&lt;br /&gt;{&lt;br /&gt; bool erase_bonds;&lt;/p&gt;
&lt;p&gt;timers_init();&lt;br /&gt; buttons_leds_init(&amp;amp;erase_bonds);&lt;br /&gt; ////power_management_init();&lt;br /&gt; ble_stack_init();&lt;br /&gt; /*#ifdef SOFTDEVICE_PRESENT&lt;br /&gt; ble_stack_init();&lt;br /&gt; #else&lt;br /&gt; clock_init();&lt;br /&gt; #endif */&lt;br /&gt; iDebug(&amp;quot;gap_params_init \n&amp;quot;);&lt;br /&gt; gap_params_init();&lt;br /&gt; gatt_init();&lt;br /&gt; services_init();&lt;br /&gt; advertising_init();&lt;br /&gt; conn_params_init();&lt;br /&gt; //Start execution.&lt;br /&gt; advertising_start();&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;uint16_t BLESend(uint8_t *data, uint16_t length)&lt;br /&gt;{&lt;br /&gt; if(m_conn_handle == BLE_CONN_HANDLE_INVALID)&lt;br /&gt; {&lt;br /&gt; return 0;&lt;br /&gt; }&lt;br /&gt; ble_nus_data_send(&amp;amp;m_nus, data, &amp;amp;length, m_conn_handle);&lt;br /&gt; nrf_delay_ms(50);&lt;br /&gt; return length;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;void BLEPrintf(const char * format, ... )&lt;br /&gt;{&lt;br /&gt; char buffer[256];&lt;br /&gt; va_list args;&lt;br /&gt; va_start(args, format);&lt;br /&gt; vsnprintf(buffer, 256, format, args);&lt;br /&gt; BLESend((uint8_t *)buffer, strlen(buffer));&lt;br /&gt; va_end(args);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool BleReceiveData(uint8_t *data, uint16_t *length)&lt;br /&gt;{&lt;br /&gt; if(Datalen == 0)&lt;br /&gt; {&lt;br /&gt; return 0;&lt;br /&gt; }&lt;br /&gt; memcpy(data, DataBuff, Datalen);&lt;br /&gt; *length = Datalen;&lt;br /&gt; memset(DataBuff, &amp;#39;0&amp;#39;, Datalen);&lt;br /&gt; Datalen = 0;&lt;br /&gt; return 1;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;Then I Init fstorage as ,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;nrf_fstorage_api_t * p_fs_api; &lt;br /&gt; p_fs_api = &amp;amp;nrf_fstorage_nvmc; &lt;br /&gt; iDebug(&amp;quot;fs Init started.&amp;quot;); &lt;br /&gt; nrf_fstorage_init(&amp;amp;my_instance,/*fstorage instance,previously defined. */&lt;br /&gt; p_fs_api, /* Name of the backend. */&lt;br /&gt; NULL /* Optional parameter, backend-dependant. */&lt;br /&gt; );&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;#define FLASH_START_ADDR 0xFF000//0x30000 //0x10001000 //0x3F000 //0x30000&lt;br /&gt;#define FLASH_START_ADDR1 0xFF000 //0x10001000 //0x3F000 //0x30000&lt;br /&gt;#define FLASH_START_ADDR2 0xFF008 &lt;br /&gt;bool write_finished = false, erase_finished = false;&lt;br /&gt;void callback(nrf_fstorage_evt_t *p_evt)&lt;br /&gt;{&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash result event&amp;quot;);&lt;br /&gt; /*if (p_evt-&amp;gt;id == FDS_EVT_INIT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash write result event&amp;quot;);&lt;br /&gt; write_finished = true;&lt;br /&gt; } */&lt;br /&gt; if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_WRITE_RESULT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; flash write result event&amp;quot;);&lt;br /&gt; write_finished = true;&lt;br /&gt; }&lt;br /&gt; if (p_evt-&amp;gt;id == NRF_FSTORAGE_EVT_ERASE_RESULT) {&lt;br /&gt; iDebug(&amp;quot;======&amp;gt; erase write result event&amp;quot;);&lt;br /&gt; erase_finished = true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;NRF_FSTORAGE_DEF(nrf_fstorage_t my_instance) = {&lt;br /&gt; .evt_handler = callback,&lt;br /&gt; .start_addr = FLASH_START_ADDR,&lt;br /&gt; .end_addr = 0xFFFFF , //FLASH_START_ADDR + 32, //0x3ffff-1, // 10,&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;bool write_to_flash(int SAddr)&lt;br /&gt;{&lt;br /&gt; ret_code_t rc=0;&lt;br /&gt; NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Wen;&lt;br /&gt; if(SAddr==1){&lt;br /&gt; rc = nrf_fstorage_write(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR1, /* The address in flash where to store the data. */&lt;br /&gt; img, /* A pointer to the data. */&lt;br /&gt; IMG_SIZE1, /* IMG_SIZE, Lenght of the data, in bytes. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; else if(SAddr==2){&lt;br /&gt; rc = nrf_fstorage_write(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR2, /* The address in flash where to store the data. */&lt;br /&gt; img1, /* A pointer to the data. */&lt;br /&gt; IMG_SIZE1, /* IMG_SIZE, Lenght of the data, in bytes. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; app_sched_execute();&lt;br /&gt; // nrf_delay_ms(1000);&lt;br /&gt; iDebug(&amp;quot;\r\nflash write.... \r\n&amp;quot;);&lt;br /&gt; while(nrf_fstorage_is_busy(&amp;amp;my_instance));&lt;br /&gt; &lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; iDebug(&amp;quot;\r\nflash write success&amp;quot;);&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;\r\nflash write failure&amp;quot;);&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool read_from_flash(int rType)&lt;br /&gt;{&lt;br /&gt; ret_code_t rc = 0; &lt;br /&gt; &lt;br /&gt; if(rType==1){&lt;br /&gt; rc = nrf_fstorage_read(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR1, /* The address in flash where to read data from. */&lt;br /&gt; img_copy, /* A buffer to copy the data into. */&lt;br /&gt; 4 /* Lenght of the data, in bytes. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; else if(rType==2){&lt;br /&gt; rc = nrf_fstorage_read(&amp;amp;my_instance, /* The instance to use. */&lt;br /&gt; FLASH_START_ADDR2, /* The address in flash where to read data from. */&lt;br /&gt; img_copy, /* A buffer to copy the data into. */&lt;br /&gt; 4 /* Lenght of the data, in bytes. */&lt;br /&gt; );&lt;br /&gt; }&lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; //iDebug(&amp;quot;\r\nflash read success - Size %d&amp;quot;,IMG_SIZE);&lt;br /&gt; for (int i = 0; i &amp;lt; 4; i++) {&lt;br /&gt; iDebug(&amp;quot;\r\nflash read [%d] = %d&amp;quot;, i,img_copy[i]);&lt;br /&gt; //if (img[i] != img_copy[i]) {&lt;br /&gt; // iDebug(&amp;quot;\r\nflash read unequal at index %d&amp;quot;, i);&lt;br /&gt; // return false;&lt;br /&gt; // }&lt;br /&gt; }&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;\r\nflash read Not success&amp;quot;);&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;bool erase_from_flash()&lt;br /&gt;{&lt;br /&gt;iDebug(&amp;quot;flash erase start..&amp;quot;);&lt;br /&gt; ret_code_t rc = nrf_fstorage_erase(&amp;amp;my_instance,/* The instance to use. */&lt;br /&gt; FLASH_START_ADDR, /* The address of the flash pages to erase. */&lt;br /&gt; 1, /* The number of pages to erase. */&lt;br /&gt; NULL /* Optional parameter, backend-dependent. */&lt;br /&gt; &lt;br /&gt; );&lt;br /&gt; app_sched_execute();&lt;br /&gt; while(nrf_fstorage_is_busy(&amp;amp;my_instance));&lt;br /&gt; NRF_NVMC-&amp;gt;CONFIG = NVMC_CONFIG_WEN_Een;&lt;br /&gt; if (rc == NRF_SUCCESS) {&lt;br /&gt; iDebug(&amp;quot;flash erase success&amp;quot;);&lt;br /&gt; return true;&lt;br /&gt; } else {&lt;br /&gt; iDebug(&amp;quot;flash erase failure %u&amp;quot; + rc );&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;When write Bytes in Flash,&lt;/p&gt;
&lt;p&gt;bluetooth_sleep();&lt;br /&gt;nrf_delay_ms(500);&lt;/p&gt;
&lt;p&gt;iDebug(&amp;quot;\r\nfs erase started.&amp;quot;); &lt;br /&gt; erase_from_flash();&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;nbsp; When Erase Call, the erase call back is not triggered and the system is halted. if not BLE Init system works fine.&lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; write_to_flash(1); &lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot;Write 1 &amp;quot;);&lt;br /&gt; write_to_flash(2); &lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; iDebug(&amp;quot;Write Finished &amp;quot;);&lt;br /&gt; read_from_flash(1);&lt;br /&gt; nrf_delay_ms(500);&lt;br /&gt; read_from_flash(2);&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Can you help me to resolve this issue?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: fstorage write&amp; Erase  Interrupt not Triggered when BLE Init Called</title><link>https://devzone.nordicsemi.com/thread/390474?ContentTypeID=1</link><pubDate>Wed, 12 Oct 2022 14:04:07 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e4aea587-31f8-4542-b72c-156c2712169e</guid><dc:creator>Vidar Berg</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;There is not enough information to go on here, unfortunately. I can try to debug your project if you are able to upload a minimal version of it here. &lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Vidar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>