<?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>BLUETOOTH &amp;amp; USBD CDC ACM WRITE PACKETS LOSS</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/39704/bluetooth-usbd-cdc-acm-write-packets-loss</link><description>Hi I&amp;#39;m new with programming nrf52840 dongle (I&amp;#39;m using Ubuntu), 
 
 I try to wrote this code taking inspiration from the nRF5_SDK_15.0.0_a53641a (peripheral/usbd_cdc_acm and peripheral/radio/trasmitter) because I want to capture bluetooth data and send</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 23 Oct 2018 14:25:32 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/39704/bluetooth-usbd-cdc-acm-write-packets-loss" /><item><title>RE: BLUETOOTH &amp; USBD CDC ACM WRITE PACKETS LOSS</title><link>https://devzone.nordicsemi.com/thread/154143?ContentTypeID=1</link><pubDate>Tue, 23 Oct 2018 14:25:32 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9dca6ee3-683a-4400-8dec-635fae2c5bb7</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;Can you please test your application with SDK 15.2.0? There was an issue in SDK 15.0.0 related to size passed to&amp;nbsp;app_usbd_cdc_acm_write and the endpoint size. This should have been fixed in SDK 15.1.0.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: BLUETOOTH &amp; USBD CDC ACM WRITE PACKETS LOSS</title><link>https://devzone.nordicsemi.com/thread/154115?ContentTypeID=1</link><pubDate>Tue, 23 Oct 2018 13:01:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2690ca0d-640b-4984-88cc-d0808ca37e74</guid><dc:creator>Pietro Bonardi</dc:creator><description>&lt;p&gt;Hi Jorgen,&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What are you seeing, and what are you expecting to see?&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;[113]:packet: 42 25 A9 35 49 16 15 31 1E FF 06 00 01 09 20 02 9D C1 12 2D&lt;br /&gt;[114]:packet: 42 25 A9 35 49 16 15 31 1E FF 06 00 01 09 20 02 9D C1 12 2D&lt;br /&gt;[117]:packet: 42 25 A9 35 49 16 15 31 1E FF 06 00 01 09 20 02 9D C1 12 2D&lt;br /&gt;[118]:packet: 42 25 A9 35 49 16 15 31 1E FF 06 00 01 09 20 02 9D C1 12 2D&lt;br /&gt;[119]:packet: 40 14 F6 4A 5F 8E B5 6C 02 01 1A 0A FF 4C 00 10 05 03 1C 95&lt;/p&gt;
&lt;p&gt;this is an example of output using screen, the packets 115/116 were not captured.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Have you tested it with another OS or terminal software?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No I tried only with Ubuntu because I found it difficult to program the dongle with other operating system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Can you provide the entire project?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes of course! &lt;span class="tlid-translation translation"&gt;&lt;span class="" title=""&gt;thanks for the quick response&lt;/span&gt;&lt;/span&gt;!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;
#include &amp;lt;stddef.h&amp;gt;

#include &amp;quot;radio_config.h&amp;quot;

#include &amp;quot;nrf.h&amp;quot;
#include &amp;quot;nrf_drv_clock.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;

#include &amp;quot;app_timer.h&amp;quot;

#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;app_util.h&amp;quot;

#include &amp;quot;nrf_cli.h&amp;quot;
#include &amp;quot;nrf_cli_rtt.h&amp;quot;
#include &amp;quot;nrf_cli_types.h&amp;quot;

#include &amp;quot;boards.h&amp;quot;

#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;

#include &amp;quot;nrf_cli_cdc_acm.h&amp;quot;
#include &amp;quot;nrf_drv_usbd.h&amp;quot;
#include &amp;quot;app_usbd_core.h&amp;quot;
#include &amp;quot;app_usbd.h&amp;quot;
#include &amp;quot;app_usbd_string_desc.h&amp;quot;
#include &amp;quot;app_usbd_cdc_acm.h&amp;quot;

/* If enabled then CYCCNT (high resolution) timestamp is used for the logger. */
#define USE_CYCCNT_TIMESTAMP_FOR_LOG 0

/**
 * @brief Enable power USB detection
 *
 * Configure if example supports USB port connection
 */
#ifndef USBD_POWER_DETECTION
#define USBD_POWER_DETECTION true
#endif

static int cnt = 0;

static void usbd_user_ev_handler(app_usbd_event_type_t event)
{
    switch (event)
    {
        case APP_USBD_EVT_STOPPED:
            app_usbd_disable();
            break;
        case APP_USBD_CDC_ACM_USER_EVT_TX_DONE:
	    cnt ++;
	    break;
        case APP_USBD_EVT_POWER_DETECTED:
            if (!nrf_drv_usbd_is_enabled())
            {
                app_usbd_enable();
            }
            break;
        case APP_USBD_EVT_POWER_REMOVED:
            app_usbd_stop();
            break;
        case APP_USBD_EVT_POWER_READY:
            app_usbd_start();
            break;
        default:
            break;
    }
}

/**
 * @brief Command line interface instance
 * */
#define CLI_EXAMPLE_LOG_QUEUE_SIZE  (4)

NRF_CLI_CDC_ACM_DEF(m_cli_cdc_acm_transport);
NRF_CLI_DEF(m_cli_cdc_acm,
            &amp;quot;usb_cli:~$ &amp;quot;,
            &amp;amp;m_cli_cdc_acm_transport.transport,
            &amp;#39;\r&amp;#39;,
            CLI_EXAMPLE_LOG_QUEUE_SIZE);

/*
NRF_CLI_RTT_DEF(m_cli_rtt_transport);
NRF_CLI_DEF(m_cli_rtt,
            &amp;quot;rtt_cli:~$ &amp;quot;,
            &amp;amp;m_cli_rtt_transport.transport,
            &amp;#39;\n&amp;#39;,
            CLI_EXAMPLE_LOG_QUEUE_SIZE);
*/

static void usbd_init(void)
{
    ret_code_t ret;
    static const app_usbd_config_t usbd_config = {
        .ev_handler = app_usbd_event_execute,
        .ev_state_proc = usbd_user_ev_handler
    };
    ret = app_usbd_init(&amp;amp;usbd_config);
    APP_ERROR_CHECK(ret);

    app_usbd_class_inst_t const * class_cdc_acm =
            app_usbd_cdc_acm_class_inst_get(&amp;amp;nrf_cli_cdc_acm);
    ret = app_usbd_class_append(class_cdc_acm);
    APP_ERROR_CHECK(ret);

    if (USBD_POWER_DETECTION)
    {
        ret = app_usbd_power_events_enable();
        APP_ERROR_CHECK(ret);
    }
    else
    {
        NRF_LOG_INFO(&amp;quot;No USB power detection enabled\r\nStarting USB now&amp;quot;);

        app_usbd_enable();
        app_usbd_start();
    }

    /* Give some time for the host to enumerate and connect to the USB CDC port */
    nrf_delay_ms(1000);
}

uint32_t cyccnt_get(void)
{
    return DWT-&amp;gt;CYCCNT;
}

#define m_packetHeaderS1len 0
#define m_packetHeaderS0len 1
#define m_packetHeaderLFlen 8

typedef enum {
	BLE_1MB,
	BLE_2MB,
	BLE_CODED_FAST,
	BLE_CODED_SLOW,
} radio_mode_t;

#define PACKET_S1_FIELD_SIZE      (2UL)  /**&amp;lt; Packet S1 field size in bits. */
#define PACKET_S0_FIELD_SIZE      (1UL)  /**&amp;lt; Packet S0 field size in bits. */
#define PACKET_LENGTH_FIELD_SIZE  (6UL)  /**&amp;lt; Packet length field size in bits. */
#define MAX_PDU_SIZE    (64UL)
#define MY_SET_BIT(n)      (1UL &amp;lt;&amp;lt; n)

static uint8_t packet[256];

static __inline int8_t ch2freq(uint8_t ch)
{
  switch (ch) {
  case 37:
    return 2;
  case 38:
    return 26;
  case 39:
    return 80;
  default:
    if (ch &amp;gt; 39)
      return -1;
    else if (ch &amp;lt; 11)
      return 4 + (2 * ch);
    else
      return 6 + (2 * ch);
  }
}

void my_radio_configure(radio_mode_t rm, int channel)
{
    // Radio config
    NRF_RADIO-&amp;gt;TXPOWER     = (RADIO_TXPOWER_TXPOWER_Pos8dBm &amp;lt;&amp;lt; RADIO_TXPOWER_TXPOWER_Pos);
    NRF_RADIO-&amp;gt;DATAWHITEIV = channel &amp;amp; 0x3F;
    NRF_RADIO-&amp;gt;FREQUENCY   = ch2freq(channel);
    NRF_RADIO-&amp;gt;PREFIX0     = 0x0000008E;
    NRF_RADIO-&amp;gt;BASE0       = 0x89BED600;
    NRF_RADIO-&amp;gt;RXADDRESSES = 0x00000001;

    // Packet configuration
#define m_packetHeaderPlen1MB RADIO_PCNF0_PLEN_8bit
#define m_packetHeaderPlen2MB RADIO_PCNF0_PLEN_16bit
#define m_packetHeaderPlenCODED RADIO_PCNF0_PLEN_LongRange
    switch(rm) {
    case BLE_1MB:
    	NRF_RADIO-&amp;gt;MODE  = (RADIO_MODE_MODE_Ble_1Mbit &amp;lt;&amp;lt; RADIO_MODE_MODE_Pos);
    	NRF_RADIO-&amp;gt;PCNF0 = (m_packetHeaderS1len &amp;lt;&amp;lt; RADIO_PCNF0_S1LEN_Pos) |
    	                   (m_packetHeaderS0len &amp;lt;&amp;lt; RADIO_PCNF0_S0LEN_Pos) |
    	                   (m_packetHeaderLFlen &amp;lt;&amp;lt; RADIO_PCNF0_LFLEN_Pos) |
    	                   (m_packetHeaderPlen1MB &amp;lt;&amp;lt; RADIO_PCNF0_PLEN_Pos);
	break;

    case BLE_2MB:
        NRF_RADIO-&amp;gt;MODE  = (RADIO_MODE_MODE_Ble_2Mbit &amp;lt;&amp;lt; RADIO_MODE_MODE_Pos);
    	NRF_RADIO-&amp;gt;PCNF0 = (m_packetHeaderS1len &amp;lt;&amp;lt; RADIO_PCNF0_S1LEN_Pos) |
    	                   (m_packetHeaderS0len &amp;lt;&amp;lt; RADIO_PCNF0_S0LEN_Pos) |
    	                   (m_packetHeaderLFlen &amp;lt;&amp;lt; RADIO_PCNF0_LFLEN_Pos) |
    	                   (m_packetHeaderPlen2MB &amp;lt;&amp;lt; RADIO_PCNF0_PLEN_Pos);
	break;

    case BLE_CODED_FAST:
    	NRF_RADIO-&amp;gt;MODE  = (RADIO_MODE_MODE_Ble_LR500Kbit &amp;lt;&amp;lt; RADIO_MODE_MODE_Pos);
    	NRF_RADIO-&amp;gt;PCNF0 = (m_packetHeaderS1len &amp;lt;&amp;lt; RADIO_PCNF0_S1LEN_Pos) |
    	                   (m_packetHeaderS0len &amp;lt;&amp;lt; RADIO_PCNF0_S0LEN_Pos) |
    	                   (m_packetHeaderLFlen &amp;lt;&amp;lt; RADIO_PCNF0_LFLEN_Pos) |
    	                   (3 &amp;lt;&amp;lt; RADIO_PCNF0_TERMLEN_Pos) |
    	                   (2 &amp;lt;&amp;lt; RADIO_PCNF0_CILEN_Pos) |
    	                   (m_packetHeaderPlenCODED &amp;lt;&amp;lt; RADIO_PCNF0_PLEN_Pos);
	break;

    case BLE_CODED_SLOW:
    	NRF_RADIO-&amp;gt;MODE  = (RADIO_MODE_MODE_Ble_LR125Kbit &amp;lt;&amp;lt; RADIO_MODE_MODE_Pos);
    	NRF_RADIO-&amp;gt;PCNF0 = (m_packetHeaderS1len &amp;lt;&amp;lt; RADIO_PCNF0_S1LEN_Pos) |
    	                   (m_packetHeaderS0len &amp;lt;&amp;lt; RADIO_PCNF0_S0LEN_Pos) |
    	                   (m_packetHeaderLFlen &amp;lt;&amp;lt; RADIO_PCNF0_LFLEN_Pos) |
    	                   (3 &amp;lt;&amp;lt; RADIO_PCNF0_TERMLEN_Pos) |
    	                   (2 &amp;lt;&amp;lt; RADIO_PCNF0_CILEN_Pos) |
    	                   (m_packetHeaderPlenCODED &amp;lt;&amp;lt; RADIO_PCNF0_PLEN_Pos);
	break;
    }

    // Packet configuration
    NRF_RADIO-&amp;gt;PCNF1 = 3UL &amp;lt;&amp;lt; RADIO_PCNF1_BALEN_Pos;
    NRF_RADIO-&amp;gt;PCNF1 |= RADIO_PCNF1_WHITEEN_Enabled &amp;lt;&amp;lt; RADIO_PCNF1_WHITEEN_Pos;
    NRF_RADIO-&amp;gt;PCNF1 |= MAX_PDU_SIZE &amp;lt;&amp;lt; RADIO_PCNF1_MAXLEN_Pos;

    // CRC Config
    NRF_RADIO-&amp;gt;CRCCNF = RADIO_CRCCNF_LEN_Three &amp;lt;&amp;lt; RADIO_CRCCNF_LEN_Pos |
                        RADIO_CRCCNF_SKIP_ADDR_Skip &amp;lt;&amp;lt; RADIO_CRCCNF_SKIP_ADDR_Pos;
    NRF_RADIO-&amp;gt;CRCINIT = 0x555555UL;
    NRF_RADIO-&amp;gt;CRCPOLY = MY_SET_BIT(24) | MY_SET_BIT(10) | MY_SET_BIT(9) |
                         MY_SET_BIT(6) | MY_SET_BIT(4) | MY_SET_BIT(3) |
                         MY_SET_BIT(1) | MY_SET_BIT(0);
}

uint32_t read_packet()
{
    uint32_t result = 0;

    NRF_RADIO-&amp;gt;EVENTS_READY = 0U;
    // Enable radio and wait for ready
    NRF_RADIO-&amp;gt;TASKS_RXEN = 1U;

    while (NRF_RADIO-&amp;gt;EVENTS_READY == 0U)
    {
        // wait
    }
    NRF_RADIO-&amp;gt;EVENTS_END = 0U;
    // Start listening and wait for address received event
    NRF_RADIO-&amp;gt;TASKS_START = 1U;

    // Wait for end of packet or buttons state changed
    while (NRF_RADIO-&amp;gt;EVENTS_END == 0U)
    {
        // wait
    }

    if (NRF_RADIO-&amp;gt;CRCSTATUS == 1U)
    {
        result = 1;
    }
    NRF_RADIO-&amp;gt;EVENTS_DISABLED = 0U;
    // Disable radio
    NRF_RADIO-&amp;gt;TASKS_DISABLE = 1U;

    while (NRF_RADIO-&amp;gt;EVENTS_DISABLED == 0U)
    {
        // wait
    }
    return result;
}


int main(void)
{
    ret_code_t ret;

/*
    if (USE_CYCCNT_TIMESTAMP_FOR_LOG)
    {
        CoreDebug-&amp;gt;DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
        DWT-&amp;gt;CTRL |= DWT_CTRL_CYCCNTENA_Msk;
        DWT-&amp;gt;CYCCNT = 0;
        APP_ERROR_CHECK(NRF_LOG_INIT(cyccnt_get, 64000000));
    }
    else
    {
        APP_ERROR_CHECK(NRF_LOG_INIT(app_timer_cnt_get));
    }
*/

/*
    // DON&amp;#39;T DO THIS, pca10059 would not start
    ret = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(ret);
*/

    ret = nrf_drv_clock_init();
    APP_ERROR_CHECK(ret);

    nrf_drv_clock_lfclk_request(NULL);

    while(!nrf_drv_clock_lfclk_is_running())
    {
        // Just waiting
    }

    ret = app_timer_init();
    APP_ERROR_CHECK(ret);

    ret = nrf_cli_init(&amp;amp;m_cli_cdc_acm, NULL, true, true, NRF_LOG_SEVERITY_INFO);
    APP_ERROR_CHECK(ret);

    usbd_init();

    ret = nrf_cli_start(&amp;amp;m_cli_cdc_acm);
    APP_ERROR_CHECK(ret);

    int channel = 37;
    my_radio_configure(BLE_1MB, channel);

    NRF_RADIO-&amp;gt;PACKETPTR = (uint32_t) packet;

    int last_atts = 0;

    while (true)
    {
        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
#if CLI_OVER_USB_CDC_ACM &amp;amp;&amp;amp; APP_USBD_CONFIG_EVENT_QUEUE_ENABLE
berga
        while (app_usbd_event_queue_process())
        {
            /* Nothing to do */
        }
#endif

        uint32_t received = read_packet();
        if(received == 0) continue;

	// static char m_tx_buffer[NRF_DRV_USBD_EPSIZE];
	//static int frame_counter = 0;

	char m_tx_buffer[2000];
	sprintf(m_tx_buffer, &amp;quot;[%d]:packet: &amp;quot;, cnt);
	cnt++;
    int kk;

	for(kk = 0; kk &amp;lt; 20; kk ++) {
		sprintf(m_tx_buffer + strlen(m_tx_buffer), &amp;quot;%02X &amp;quot;, packet[kk]);
	}

	sprintf(m_tx_buffer + strlen(m_tx_buffer), &amp;quot;\r\n&amp;quot;);
        size_t size = strlen(m_tx_buffer) + 1;

        last_atts = 0;

	do{	last_atts ++;
		ret = app_usbd_cdc_acm_write(&amp;amp;nrf_cli_cdc_acm, m_tx_buffer, size);
        	//        if(ret == NRF_SUCCESS) break;
	}while(ret != NRF_SUCCESS);
	//frame_counter ++;
        //nrf_delay_ms(1000);
        // nrf_cli_process(&amp;amp;m_cli_cdc_acm);
    }
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: BLUETOOTH &amp; USBD CDC ACM WRITE PACKETS LOSS</title><link>https://devzone.nordicsemi.com/thread/154019?ContentTypeID=1</link><pubDate>Tue, 23 Oct 2018 09:08:45 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fdced6c7-0c7a-4752-98a4-1162414426d5</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Can you elaborate on what you mean by:&lt;/p&gt;
[quote user=""]&lt;strong&gt;but I &lt;/strong&gt;&lt;span&gt;&lt;span title=""&gt;&lt;strong&gt;realized I did not capture all the data.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;[/quote]
&lt;ul&gt;
&lt;li&gt;What are you seeing, and what are you expecting to see?&lt;/li&gt;
&lt;li&gt;Have you tested it with another OS or terminal software?&lt;/li&gt;
&lt;li&gt;Can you provide the entire project? This way we can try to reproduce your issues and help debugging it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Jørgen&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>