<?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>nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx</link><description>Hi everyone, 
 We design an application using the nRF52840 and SDK16. This application is intended to be used for gait analysis and one of the requirements is a real-time data process. We are using nRF52832 as a central device to receive raw data and</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 10 Aug 2021 10:00:11 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx" /><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/324173?ContentTypeID=1</link><pubDate>Tue, 10 Aug 2021 10:00:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:99953bc4-dbe0-4b9f-86c2-60cfc96fc2c1</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Sure Nikos, Have a nice summer break and hope to have promising results when you come back. The ticket will be open and visible to me once you reply with some results after the summer break.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/324159?ContentTypeID=1</link><pubDate>Tue, 10 Aug 2021 08:47:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:31741450-972e-4eb5-99d3-480ee74b89ef</guid><dc:creator>Nikosant03</dc:creator><description>&lt;p&gt;Thank you for your assistance Susheel, I will change the conenction parameters and I will let you know.&lt;/p&gt;
&lt;p&gt;However, today I go to&amp;nbsp;annual leave&amp;nbsp;and I will return in the last week of August. So please keep the ticket open since then :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/324141?ContentTypeID=1</link><pubDate>Tue, 10 Aug 2021 08:01:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7264cc7e-8eab-4a14-ace8-e977fe7086a2</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Hi Nick,&lt;/p&gt;
&lt;p&gt;Thanks for very detail explanation. I am starting to get a good picture of your app design.&amp;nbsp;I am starting to believe this is more related to your connection parameters than your processing time in the timer callbacks.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First thing to check is reduce connection interval, increase NRF_SDH_BLE_GAP_EVENT_LENGTH and update the phy to 2M. Using AUTO could sometimes change the PHY to 2M if your peer also supports and prefers that PHY.&amp;nbsp; Use DLE(Data Length Extension) with bigger&amp;nbsp;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;NRF_SDH_BLE_GATT_MAX_MTU_SIZE (minimum of the size of the packet you send) and increase&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;NRF_SDH_BLE_GAP_EVENT_LENGTH to fit maybe have atleast two events in one connection interval with the selected MTU size.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Just a correction App_timer definitions &lt;a href="https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v17.0.2%2Fgroup__app__timer.html&amp;amp;anchor=gaf8712d5f21788ee57a694e9d3303d9ee"&gt;APP_TIMER_DEF&lt;/a&gt;&amp;nbsp;still uses the same RTC1 hardware instance and give application multiple software emulated timers to be able to use. In the core, you are still using RTC1 for both the timers. Which means that the RTC1 ISR will be processing both your SAADC sampling&amp;nbsp;timeout processing&amp;nbsp;+ IMU timeout processing..&lt;/li&gt;
&lt;li&gt;It seems like the IMU callback is too frequent than the ability of softdevice to handle HVX, most common reason is that the softdevice is unable to send enough data in one connection interval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Change the connection parameters as suggested and please let me know how it goes.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I can suggest the connection parameters of&lt;/p&gt;
&lt;p&gt;Connection interval 7.5ms,&lt;br /&gt;MTU size of of atleast m_array&lt;br /&gt;event length of 6.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323922?ContentTypeID=1</link><pubDate>Mon, 09 Aug 2021 07:51:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a3c858df-0a8c-4bd6-8692-f147725a2926</guid><dc:creator>Nikosant03</dc:creator><description>&lt;p&gt;&lt;span&gt;Hi Susheel,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Let me give a brief description of my application: The application reads 8 x analog pressure sensors by multiplexing them and it also acquires the position information from an IMU. I use two RTC timers to accomplish that.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;RTC timer 1&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I use this timer to read the pressure sensors. It expires every&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;800us&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;and every time it expires I trigger sampling, convert the analog input and buffer it (meaning that I need approximately 800us x 8 sensors = 6.4ms to read all the sensors).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;RTC timer 2&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;I use this timer to get the IMU data, buffer them, prepare the payload and finally notify the attribute value. This timer expires every&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;10ms (100Hz)&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
[quote userid="6207" url="~/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx/323244#323244"]Yes, but the application probably is also preparing the packet to be sent? it would become a bit easier if you can share some code snippets of how you are getting/preparing your data to be transmitted[/quote]
&lt;p&gt;Yes, here some code snippets:&lt;/p&gt;
&lt;p&gt;I use 2 x timers for sampling the sensors, get the IMU data and notify the attribute value:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;APP_TIMER_DEF(m_SAADC_timer_id);        // na - app_timer for SAADC captures
APP_TIMER_DEF(m_notification_timer_id); // na - app_timer for IMU capturs and BLE notifications

#define SAADC_INTERVAL APP_TIMER_TICKS_US(800)           /**&amp;lt; interval to read flexi force in us */
#define NOTIFICATION_INTERVAL APP_TIMER_TICKS(10)        /**&amp;lt; notification interval in ms */&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;When the m_SAADC_timer_id expires (&lt;strong&gt;every 800us&lt;/strong&gt;):&lt;/p&gt;
&lt;p&gt;1. I&amp;nbsp;trigger the sampling&lt;/p&gt;
&lt;p&gt;2. Convert the analog input&lt;/p&gt;
&lt;p&gt;3. Multiplexing the pressure sensors&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;// Trigger sampling
void saadc_sample() {
  ret_code_t err_code;
  err_code = nrf_drv_saadc_sample();
  APP_ERROR_CHECK(err_code);
}

// Convert samples from analog to digital and buffer the digital values
void saadc_callback(nrf_drv_saadc_evt_t const *p_event) {

  if (p_event-&amp;gt;type == NRF_DRV_SAADC_EVT_DONE) { // na - when the buffer is filled then the NRF_DRV_SAADC_EVT_DONE is generated
    ret_code_t err_code;

    err_code = nrf_drv_saadc_buffer_convert(p_event-&amp;gt;data.done.p_buffer, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);

    ADC_RawData[callback_counter] = p_event-&amp;gt;data.done.p_buffer[0]; // na - Buffer the ADC values from flexi force sensors (8 x sensors)

    if (callback_counter == NO_SENSORS - 1) {
    
      memset(ADC_RawData, 0, sizeof(ADC_RawData)); // na - Initialize the ADC_RawData buffer to 0
      callback_counter = 0;
      
    }

    else {
      callback_counter++;
    }
    selectMuxPin(callback_counter); // na - change MUX channel to read the next sensor
  }
}

// Multiplexing the pressure sensors
void selectMuxPin(int channel) {
  for (int i = 0; i &amp;lt; MUX_CTRL_CHA; i++) {

    if (channel &amp;amp; (1 &amp;lt;&amp;lt; i)) {
      nrf_gpio_pin_set(ctrlPins[i]);
    } else {
      nrf_gpio_pin_clear(ctrlPins[i]);
    }
  }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;When the m_notification_timer_id expires (every 10ms):&lt;/p&gt;
&lt;p&gt;1. I get the IMU data&lt;/p&gt;
&lt;p&gt;2. Prepare the payload&lt;/p&gt;
&lt;p&gt;3. Send notification&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void notification_timeout_handler(void *p_context) {

  UNUSED_PARAMETER(p_context);
  ret_code_t err_code;

  m_xfer_done = false;

  bmi160_get_sensor_data((BMI160_ACCEL_SEL | BMI160_GYRO_SEL | BMI160_TIME_SEL), &amp;amp;s_accel, &amp;amp;s_gyro, &amp;amp;sensor);

  packet_counter++;

  int16_t msb_packet_counter = packet_counter &amp;gt;&amp;gt; 16;
  int16_t lsb_packet_counter = packet_counter;

  // Passing an array of data through notification to the central
  int16_t m_array[] = {s_accel.x, s_accel.y, s_accel.z, s_gyro.x, s_gyro.y, s_gyro.z, //bmm150.data.x, bmm150.data.y, bmm150.data.z
      ADC_RawData[0], ADC_RawData[1], ADC_RawData[2], ADC_RawData[3],
      ADC_RawData[4], ADC_RawData[5], ADC_RawData[6], ADC_RawData[7], msb_packet_counter, lsb_packet_counter}; // you can set either decimal or hex values

  err_code = ble_cus_custom_value_update(&amp;amp;m_cus, m_array);
  // Filter out some errors
  if (err_code != NRF_ERROR_INVALID_STATE &amp;amp;&amp;amp; err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING &amp;amp;&amp;amp; err_code != NRF_ERROR_RESOURCES  &amp;amp;&amp;amp; err_code != NRF_ERROR_BUSY) { //
    APP_ERROR_CHECK(err_code);
  }

  err_code = app_timer_start(m_SAADC_timer_id, SAADC_INTERVAL, NULL); // na - Restart the SAADC sampling
  APP_ERROR_CHECK(err_code);
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;and just for reference this if where I implement the notification&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;//This is where we implement the notification
uint32_t ble_cus_custom_value_update(ble_cus_t *p_cus, int16_t custom_value[]) {

  if (p_cus == NULL) {
    return NRF_ERROR_NULL;
  }

  uint32_t err_code = NRF_SUCCESS;

  /** Send value if connected and notifying using sd_ble_gatts_hvx
   *  Verify that we have a valid connection handle, i.e. that we&amp;#39;re actually connected to a peer, 
   *  if not we should return an error indicating that we&amp;#39;re in an invalid state
   */
  if ((p_cus-&amp;gt;conn_handle != BLE_CONN_HANDLE_INVALID)) // Here we check whether or not we are in a valid connection. If you try to send out notifications
                                                       // when not in a connection the SoftDevice will get grumpy and give you errors
  {
    ble_gatts_hvx_params_t hvx_params; // We declare a variable, hvx_params, of type ble_gatts_hvx_params_t
                                       // This will hold the necessary parameters to do a notification and provide them to the sd_ble_gatts_hvx()
                                       // hvx stands for Handle Value X where X symbolize either notification of indication

    memset(&amp;amp;hvx_params, 0, sizeof(hvx_params));

    uint16_t len = 32; // Set the length of bytes to be written. Remember that you must set the same len size for the characteristic attribute

    hvx_params.handle = p_cus-&amp;gt;custom_value_handles.value_handle; // Provide the handle of our characteristic
    hvx_params.type = BLE_GATT_HVX_NOTIFICATION;                  // What &amp;quot;hvx type&amp;quot; we want to do, a notification or indication?
    hvx_params.offset = 0;                                        // Your characteristic value might be a sequence of many bytes. If you want to transmit only a couple
                                                                  // of these bytes and the  bytes are located in the middle of the sequence you can use the offset to extract them.
                                                                  // Since we want to update all of our four bytes we will set the offset to zero.
    hvx_params.p_len = &amp;amp;len;                                      // The current value is 2 bytes (sizeof(uint8_t))
    hvx_params.p_data = custom_value;                             // Here we add a pointer to the actual data

    /*
        After setting the hvx_params, we notify the peer by calling sd_ble_gatts_hvx()
        Parameters
        [in]         conn_handle	Connection handle.
        [in,out]     p_hvx_params	Pointer to an HVx parameters structure. If ble_gatts_hvx_params_t::p_data contains a non-NULL pointer 
                                        the attribute value will be updated with the contents pointed by it before sending the notification or indication. 
                                        If the attribute value is updated, ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to contain the number 
                                        of actual bytes written, else it will be set to 0.

         sd_ble_gatts_hvx() not-only can change the internal value of the characteristic, but also sends it out as a notification/indication 
         to the other side which is subscribed to the characteristic

    */

    err_code = sd_ble_gatts_hvx(p_cus-&amp;gt;conn_handle, &amp;amp;hvx_params); // Notify the peer by passing the connection handle as well as the hvx_params structure
  } else {
    err_code = NRF_ERROR_INVALID_STATE;
    //NRF_LOG_INFO(&amp;quot;sd_ble_gatts_hvx result: NRF_ERROR_INVALID_STATE. \r\n&amp;quot;);
  }

  return err_code;
}&lt;/pre&gt;&lt;/p&gt;
[quote userid="6207" url="~/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx/323244#323244"]Also try to change the PHY to 2M to have higher throughput[/quote]
&lt;p&gt;I will try it, at the moment I use the BLE_GAP_PHY_AUTO&lt;/p&gt;
&lt;p&gt;I hope this helps &lt;span class="emoticon" data-url="https://devzone.nordicsemi.com/cfs-file/__key/system/emoji/1f642.svg" title="Slight smile"&gt;&amp;#x1f642;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323244?ContentTypeID=1</link><pubDate>Wed, 04 Aug 2021 08:23:53 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:1f02eefd-ad4f-46d5-a0ee-b89b756e5f10</guid><dc:creator>Susheel Nuguru</dc:creator><description>[quote user="Nikosant03"]The preprocessing is&amp;nbsp;done by the SD when I call the&amp;nbsp;&lt;strong&gt;&lt;span&gt;sd_ble_gatts_hvx&lt;/span&gt;&lt;/strong&gt;?[/quote]
&lt;p&gt;&amp;nbsp;Yes, but the application probably is also preparing the packet to be sent? it would become a bit easier if you can share some code snippets of how you are getting/preparing your data to be transmitted. Also try to change the PHY to 2M to have higher throughput.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323236?ContentTypeID=1</link><pubDate>Wed, 04 Aug 2021 07:57:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:70bbaef6-e1f7-49ad-82eb-4352e302f154</guid><dc:creator>Nikosant03</dc:creator><description>[quote userid="6207" url="~/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx/323208#323208"]Every notification data packet your application queues, needs some pre processing (and most likely some post processing after sending) apart from other things your application does[/quote]
&lt;p&gt;The preprocessing is&amp;nbsp;done by the SD when I call the&amp;nbsp;&lt;strong&gt;&lt;span&gt;sd_ble_gatts_hvx&lt;/span&gt;&lt;/strong&gt;?&lt;/p&gt;
[quote userid="6207" url="~/f/nordic-q-a/78143/nrf52840-sdk16---high-data-rate-tx/323208#323208"]It seems that the application is sometimes queueing the notifications too fast[/quote]
&lt;p&gt;&lt;span&gt;The&amp;nbsp;queueing time is basically the time intervals between the&amp;nbsp;&lt;strong&gt;sd_ble_gatts_hvx &lt;/strong&gt;calls?&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323208?ContentTypeID=1</link><pubDate>Wed, 04 Aug 2021 06:10:56 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2c1f4871-2ba0-4598-bec4-210176aa52a3</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Every notification data packet your application queues, needs some pre processing (and most likely some post processing after sending) apart from other things your application does. The CPU time used up by the softdevice is mostly fixed per BLE procedure and data transmit/receive. So you need to benchmark how much time your application is using the CPU on preparing each data packet and other logics that needs to maintain the housekeeping of your application.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In short, 6) points to the need to benchmark your application CPU time doing different things, you can use GPIOs to toggle at different logics to get an idea on application CPU usage. It seems that the application is sometimes queueing the notifications too fast (and hence get&amp;nbsp;&lt;span&gt;NRF_ERROR_RESOURCES&amp;nbsp; in the HVX operation) and sometimes have idle periods where it is not utilizing the connection events to transmit data (as the application might be busy doing other stuff).&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323153?ContentTypeID=1</link><pubDate>Tue, 03 Aug 2021 14:59:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9e3559a3-cdbd-46a8-b212-c190f096812b</guid><dc:creator>Nikosant03</dc:creator><description>&lt;p&gt;Thank you for your prompt responce &lt;a href="https://devzone.nordicsemi.com/members/aryan"&gt;Susheel Nuguru&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Could you elaborate more on 6. &amp;quot;&lt;span&gt;minimal application post processing of data transmitted and or recieved&lt;/span&gt;&amp;quot;?&lt;/p&gt;
&lt;p&gt;What do you mean by pre and post processing and how this affect the throughput? Could you provide an example?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 SDK16 - High data rate Tx</title><link>https://devzone.nordicsemi.com/thread/323082?ContentTypeID=1</link><pubDate>Tue, 03 Aug 2021 11:51:42 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:55b00af2-ff27-4388-87c1-37fea76d0f36</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Hi Antoniou,&lt;/p&gt;
&lt;p&gt;nRF52 is a single core chip. And you can have only only one strictly real time thread in it. When using BLE stack, which needs to follow very hard time constrained events, it takes up the highest interrupt priority reserved for it. When there is any BLE activity, there is both pre and post processing of that BLE data transmitted and or received. The throughput greatly depends on&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connection interval&lt;/li&gt;
&lt;li&gt;&lt;a href="https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s140%2FSDS%2Fs1xx%2Fmultilink_scheduling%2Fextend_connection_event.html&amp;amp;cp=4_7_4_0_14_6"&gt;Connect event length&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Data size in the packet (using DLE and bigger packet size needs bigger event length)&lt;/li&gt;
&lt;li&gt;PHY used&lt;/li&gt;
&lt;li&gt;data to be sent out already being queued as fast as they can&lt;/li&gt;
&lt;li&gt;minimal application post processing of data transmitted and or recieved to give maximum CPU time for application to queue data.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The suggestions for event length for a connection can be found &lt;a href="https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsds_s140%2FSDS%2Fs1xx%2Fmultilink_scheduling%2Fsuggested_intervals_windows_s132.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You need to understand how much time your application is spending on pre and post processing of data on notifications.&lt;br /&gt;You also need to understand how many packets you are able to squeeze into one connection interval (how many connection events within a connection interval) based on the data size within a packet. In our thoughput examples we demonstrated that you can achieve very close to theoretical maximum throughput (1.4Mbps) with some room for application pre and post processing. But there is always a balance to make that an Architect of your application will be able to calculate/design and answer.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In your case, if you are getting&amp;nbsp;&lt;span&gt;NRF_ERROR_RESOURCES&amp;nbsp;with that low throughput, means that you application has not calibrated the connection correctly OR spending a lot of time in pre or post precessing of data.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>