<?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>problem with 802.15.4 association</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/71047/problem-with-802-15-4-association</link><description>Hi all, 
 
 I have a problem with 802.15.4 association in beaconned PAN. Basically I have two devices, PAN coordinator and an FFD. FFD is able to find the coordinator (throught scan) and tryies to associate with it. The association is successful only</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 01 Feb 2021 08:52:22 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/71047/problem-with-802-15-4-association" /><item><title>RE: problem with 802.15.4 association</title><link>https://devzone.nordicsemi.com/thread/292139?ContentTypeID=1</link><pubDate>Mon, 01 Feb 2021 08:52:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e541a064-e55e-4939-ae8d-4f079679f150</guid><dc:creator>rozpruwacz</dc:creator><description>&lt;p&gt;Ok, I think I resolved the issue. After careful reading of the protocol&amp;nbsp;standard it apears that for beaconned PAN the&amp;nbsp;mlme_sync_req must be called before&amp;nbsp;mlme_associate_req and further more, before the&amp;nbsp;&lt;span&gt;mlme_sync_req the&amp;nbsp;MAC_BEACON_ORDER PIB must be set acordingly to the value received through&amp;nbsp;mlme_scan_req.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Below isfixed code for case when beacon_order &amp;gt; superframe_order.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Coordinator:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;quot;config.h&amp;quot;
#include &amp;quot;ral_irq_handlers.h&amp;quot;
#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;app_usbd.h&amp;quot;
#include &amp;quot;bsp.h&amp;quot;

#include &amp;quot;nrf_drv_clock.h&amp;quot;

#include &amp;quot;mac_mlme_pib.h&amp;quot;
#include &amp;quot;mac_mlme_reset.h&amp;quot;
#include &amp;quot;mac_mlme_start.h&amp;quot;
#include &amp;quot;mac_mlme_associate.h&amp;quot;
#include &amp;quot;mac_mcps_data.h&amp;quot;
#include &amp;quot;sys_memory_manager.h&amp;quot;
#include &amp;quot;sys_init.h&amp;quot;
#include &amp;quot;sys_task_scheduler.h&amp;quot;
#include &amp;quot;boards.h&amp;quot;

static uint8_t __ALIGN(ALIGN_VALUE) m_heap[CONFIG_POOL_SIZE];
static const size_t m_heap_size = CONFIG_POOL_SIZE;

static void out_of_memory_callback(const void * data);
static void memory_freed_callback(const void * data);

uint16_t last_addr = 0xFFFF;

static sys_event_desc_t m_out_of_memory_desc =
{
    .event_id = SYS_EVENT_OUT_OF_MEMORY,
    .callback = out_of_memory_callback,
};

static sys_event_desc_t m_memory_freed_desc =
{
    .event_id = SYS_EVENT_MEMORY_FREED,
    .callback = memory_freed_callback,
};

void mcps_data_ind(mcps_data_ind_t * p_ind)
{
    bool addresses_match = p_ind-&amp;gt;dst_pan_id == CONFIG_PAN_ID &amp;amp;&amp;amp;
                           p_ind-&amp;gt;dst_addr_mode == MAC_ADDR_SHORT &amp;amp;&amp;amp;
                           p_ind-&amp;gt;dst_addr.short_address == CONFIG_DEVICE_SHORT_ADDRESS &amp;amp;&amp;amp;
                           p_ind-&amp;gt;src_pan_id == CONFIG_PAN_ID &amp;amp;&amp;amp;
                           p_ind-&amp;gt;src_addr_mode == MAC_ADDR_SHORT;

    NRF_LOG_INFO(&amp;quot;received success from %x&amp;quot;, p_ind-&amp;gt;src_addr.short_address);
    if (addresses_match &amp;amp;&amp;amp; p_ind-&amp;gt;msdu_length &amp;gt; 0)
    {
        if (bsp_board_led_state_get(CONFIG_DOWNSTREAM_PIN))
            bsp_board_led_off(CONFIG_DOWNSTREAM_PIN);
        else
            bsp_board_led_on(CONFIG_DOWNSTREAM_PIN);
    }
    mac_mem_msdu_free(&amp;amp;p_ind-&amp;gt;msdu);
}

static void mcps_data_conf(mcps_data_conf_t * conf)
{
    if (conf-&amp;gt;status == MAC_SUCCESS)
    {
        NRF_LOG_INFO(&amp;quot;send success&amp;quot;);
        bsp_board_led_off(CONFIG_UPSTREAM_PIN);
    }
    else
    {
        NRF_LOG_INFO(&amp;quot;send failed&amp;quot;);
    }
}

static void send_data()
{
    static uint8_t m_radio_tx_buffer[PHY_MAX_PACKET_SIZE + MAC_MAX_MHR_SIZE];
    static mcps_data_req_t m_data_req;
    NRF_LOG_INFO(&amp;quot;send_data&amp;quot;);

    if (bsp_board_led_state_get(CONFIG_UPSTREAM_PIN)) {
        NRF_LOG_INFO(&amp;quot;in progress&amp;quot;);
        return;
    }

    m_radio_tx_buffer[MAC_MAX_MHR_SIZE] = &amp;#39;x&amp;#39;;

    m_data_req.dst_addr_mode = MAC_ADDR_SHORT;
    m_data_req.dst_addr.short_address = last_addr;
    m_data_req.dst_pan_id = CONFIG_PAN_ID;
    m_data_req.src_addr_mode = MAC_ADDR_SHORT;
    m_data_req.msdu = (uint8_t *)&amp;amp;m_radio_tx_buffer[MAC_MAX_MHR_SIZE];
    m_data_req.msdu_length = 1;
    m_data_req.msdu_handle++;
    m_data_req.tx_options.ack = true;
    m_data_req.tx_options.gts = false;
    m_data_req.tx_options.indirect = true;
    mcps_data_req(&amp;amp;m_data_req, mcps_data_conf);

    bsp_board_led_on(CONFIG_UPSTREAM_PIN);
}
static void out_of_memory_callback(const void * data)
{
    bsp_board_led_on(CONFIG_ERROR_PIN);
}

static void memory_freed_callback(const void * data)
{
    bsp_board_led_off(CONFIG_ERROR_PIN);
}

static void short_addr_set()
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_SHORT_ADDRESS,
    };
    uint16_t address = CONFIG_DEVICE_SHORT_ADDRESS;
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;address);
    NRF_LOG_INFO(&amp;quot;short_addr_set: %d&amp;quot;, result);
}

static void ext_addr_set()
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_EXTENDED_ADDRESS,
    };
    uint64_t address = CONFIG_IEEE_ADDRESS + CONFIG_DEVICE_SHORT_ADDRESS;
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;address);
    NRF_LOG_INFO(&amp;quot;ext_addr_set: %d&amp;quot;, result);
}

static void association_permit_set()
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_ASSOCIATION_PERMIT,
    };
    uint8_t permit = 1;
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;permit);
    NRF_LOG_INFO(&amp;quot;association_permit_set: %d&amp;quot;, result);
}

static void rx_on_idle_set()
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_RX_ON_WHEN_IDLE,
    };
    uint8_t rx_on_idle = 1;
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;rx_on_idle);
    NRF_LOG_INFO(&amp;quot;rx_on_idle_set: %d&amp;quot;, result);
}

static void mlme_start_conf_cb(mlme_start_conf_t * conf)
{
    NRF_LOG_INFO(&amp;quot;mlme_start_conf %d&amp;quot;, conf-&amp;gt;status);
    if (conf-&amp;gt;status == MAC_SUCCESS)
        bsp_board_led_on(CONFIG_INIT_DONE_PIN);
    else
        bsp_board_led_off(CONFIG_INIT_DONE_PIN);
}

void mlme_reset_conf_cb(mlme_reset_conf_t *conf)
{
    NRF_LOG_INFO(&amp;quot;mlme_reset_conf: %d&amp;quot;, conf-&amp;gt;status);
    if (conf-&amp;gt;status != MAC_SUCCESS) {
        bsp_board_led_off(CONFIG_INIT_DONE_PIN);
        return;
    }

    short_addr_set();
    ext_addr_set();
    association_permit_set();
    rx_on_idle_set();

    static mlme_start_req_t req = {
        .battery_life_extension = false,
        .beacon_order = 7,
        .coord_realignment = false,
        .logical_channel = 15,
        .pan_coordinator = true,
        .pan_id = CONFIG_PAN_ID,
        .start_time = 0,
        .superframe_order = 5
    };
    mlme_start_req(&amp;amp;req, mlme_start_conf_cb);
}

/**@brief   Application task initialization for GPIO test.
 */
static void app_task_init(void)
{
    sys_init(m_heap, m_heap_size);

    sys_event_subscribe(&amp;amp;m_out_of_memory_desc);
    sys_event_subscribe(&amp;amp;m_memory_freed_desc);

    static mlme_reset_req_t req = {
        .set_default_pib = true
    };
    mlme_reset_req(&amp;amp;req, mlme_reset_conf_cb);
}

static mlme_associate_resp_t associate_resp;
bool send_resp = false;
void mlme_associate_ind(mlme_associate_ind_t * ind)
{
    NRF_LOG_INFO(&amp;quot;mlme_associate_ind from %x&amp;quot;, ind-&amp;gt;device_address);
    typedef union {
        mac_capability_t mac_capability;
        uint8_t capability_information;
    } mac_capability_conv_t;
    mac_capability_conv_t caps_conv = {.capability_information = ind-&amp;gt;capability_information};
    NRF_LOG_INFO(&amp;quot;alternate_pan_coordinator: %d&amp;quot;, caps_conv.mac_capability.alternate_pan_coordinator);
    NRF_LOG_INFO(&amp;quot;device_type: %d&amp;quot;, caps_conv.mac_capability.device_type);
    NRF_LOG_INFO(&amp;quot;power_source: %d&amp;quot;, caps_conv.mac_capability.power_source);
    NRF_LOG_INFO(&amp;quot;rx_on_when_idle: %d&amp;quot;, caps_conv.mac_capability.rx_on_when_idle);
    NRF_LOG_INFO(&amp;quot;security_capability: %d&amp;quot;, caps_conv.mac_capability.security_capability);
    NRF_LOG_INFO(&amp;quot;allocate_address: %d&amp;quot;, caps_conv.mac_capability.allocate_address);

    last_addr = ind-&amp;gt;device_address &amp;amp; 0xffff;
    associate_resp = (mlme_associate_resp_t){
        .device_address = ind-&amp;gt;device_address,
        .assoc_short_address = last_addr,
        .status = MAC_ASSOCIATION_SUCCESSFUL
    };
    send_resp = true;
}

static void clock_init(void)
{
    ret_code_t err_code = nrf_drv_clock_init();
    ASSERT((err_code == NRF_SUCCESS) || (err_code == NRF_ERROR_MODULE_ALREADY_INITIALIZED));

    nrf_drv_clock_hfclk_request(NULL);
    while (!nrf_drv_clock_hfclk_is_running())
    {
        // spin lock
    }

    nrf_drv_clock_lfclk_request(NULL);
    while (!nrf_drv_clock_lfclk_is_running())
    {
        // spin lock
    }
}

/**
 * @brief Function for application main entry.
 */
int main(void)
{
    ral_irq_handler_import();
    clock_init();
    APP_ERROR_CHECK(bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, NULL));
    bsp_board_leds_off();
    APP_ERROR_CHECK(app_usbd_init(NULL));
    app_usbd_enable();
    app_usbd_start();
    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();
    for (int i=0; i&amp;lt;300; i++)
    {
        while (app_usbd_event_queue_process());
        if (i % 2)
            bsp_board_leds_off();
        else
            bsp_board_leds_on();
        nrf_delay_ms(10);
    }
    bsp_board_leds_on();
    NRF_LOG_INFO(&amp;quot;Wireless UART example started.&amp;quot;);
    bsp_board_leds_off();

    app_task_init();

    bool prev_button = bsp_board_button_state_get(CONFIG_BTN_DATA_SEND);
    bool curr_button = 0;
    while (true)
    {
        while (app_usbd_event_queue_process());
        sys_task_run();
        if (send_resp) {
            mlme_associate_resp(&amp;amp;associate_resp);
            send_resp = false;
        }
        curr_button = bsp_board_button_state_get(CONFIG_BTN_DATA_SEND);
        if (prev_button == 0 &amp;amp;&amp;amp; curr_button == 1) {
            send_data();
        }
        prev_button = curr_button;
    }
}
&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Device:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;quot;config.h&amp;quot;
#include &amp;quot;ral_irq_handlers.h&amp;quot;
#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;app_usbd.h&amp;quot;
#include &amp;quot;bsp.h&amp;quot;

#include &amp;quot;nrf_drv_clock.h&amp;quot;

#include &amp;quot;mac_mlme_pib.h&amp;quot;
#include &amp;quot;mac_mlme_reset.h&amp;quot;
#include &amp;quot;mac_mlme_scan.h&amp;quot;
#include &amp;quot;mac_mlme_associate.h&amp;quot;
#include &amp;quot;mac_mlme_sync.h&amp;quot;
#include &amp;quot;mac_mcps_data.h&amp;quot;
#include &amp;quot;sys_init.h&amp;quot;
#include &amp;quot;sys_memory_manager.h&amp;quot;
#include &amp;quot;sys_sleep.h&amp;quot;
#include &amp;quot;sys_task_scheduler.h&amp;quot;
#include &amp;quot;boards.h&amp;quot;

static mac_pan_descriptor_t pan_descriptor;
uint16_t my_addr = 0xFFFF;

void mcps_data_ind(mcps_data_ind_t * p_ind)
{
    bool addresses_match = p_ind-&amp;gt;dst_pan_id == pan_descriptor.coord_pan_id &amp;amp;&amp;amp;
                           p_ind-&amp;gt;dst_addr_mode == pan_descriptor.coord_addr_mode &amp;amp;&amp;amp;
                           p_ind-&amp;gt;dst_addr.short_address == my_addr &amp;amp;&amp;amp;
                           p_ind-&amp;gt;src_pan_id == pan_descriptor.coord_pan_id;

    NRF_LOG_INFO(&amp;quot;received success from %x&amp;quot;, p_ind-&amp;gt;src_addr.short_address);
    if (addresses_match &amp;amp;&amp;amp; p_ind-&amp;gt;msdu_length &amp;gt; 0)
    {
        if (bsp_board_led_state_get(CONFIG_DOWNSTREAM_PIN))
            bsp_board_led_off(CONFIG_DOWNSTREAM_PIN);
        else
            bsp_board_led_on(CONFIG_DOWNSTREAM_PIN);
    }
    mac_mem_msdu_free(&amp;amp;p_ind-&amp;gt;msdu);
}

static void mcps_data_conf(mcps_data_conf_t * conf)
{
    if (conf-&amp;gt;status == MAC_SUCCESS)
    {
        NRF_LOG_INFO(&amp;quot;send success&amp;quot;);
        bsp_board_led_off(CONFIG_UPSTREAM_PIN);
    }
    else
    {
        NRF_LOG_INFO(&amp;quot;send failed&amp;quot;);
    }
}

static void send_data()
{
    static uint8_t m_radio_tx_buffer[PHY_MAX_PACKET_SIZE + MAC_MAX_MHR_SIZE];
    static mcps_data_req_t m_data_req;
    NRF_LOG_INFO(&amp;quot;send_data&amp;quot;);

    m_radio_tx_buffer[MAC_MAX_MHR_SIZE] = &amp;#39;x&amp;#39;;

    m_data_req.dst_addr_mode = pan_descriptor.coord_addr_mode;
    m_data_req.dst_addr = pan_descriptor.coord_address;
    m_data_req.dst_pan_id = pan_descriptor.coord_pan_id;
    m_data_req.src_addr_mode = MAC_ADDR_SHORT;
    m_data_req.msdu = (uint8_t *)&amp;amp;m_radio_tx_buffer[MAC_MAX_MHR_SIZE];
    m_data_req.msdu_length = 1;
    m_data_req.msdu_handle++;
    m_data_req.tx_options.ack = true;
    m_data_req.tx_options.gts = false;
    m_data_req.tx_options.indirect = false;
    mcps_data_req(&amp;amp;m_data_req, mcps_data_conf);

    bsp_board_led_on(CONFIG_UPSTREAM_PIN);
}

static void ext_addr_set()
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_EXTENDED_ADDRESS,
    };
    uint64_t address = CONFIG_IEEE_ADDRESS + CONFIG_DEVICE_SHORT_ADDRESS;
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;address);
    NRF_LOG_INFO(&amp;quot;ext_addr_set: %d&amp;quot;, result);
}

//static void auto_request_set()
//{
//    const pib_id_t pib_id =
//    {
//        .mlme_id = MAC_AUTO_REQUEST,
//    };
//    uint8_t auto_request = 0;
//    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;auto_request);
//    NRF_LOG_INFO(&amp;quot;auto_request_set: %d&amp;quot;, result);
//}

static void beacon_order_set(uint8_t beacon_order)
{
    const pib_id_t pib_id =
    {
        .mlme_id = MAC_BEACON_ORDER,
    };
    mac_status_t result = mlme_set(pib_id, 0, &amp;amp;beacon_order);
    NRF_LOG_INFO(&amp;quot;beacon_order_set: %d&amp;quot;, result);
}

static void mlme_associate_conf_cb(mlme_associate_conf_t * conf)
{
    NRF_LOG_INFO(&amp;quot;mlme_associate_conf: %d&amp;quot;, conf-&amp;gt;status);
    if (conf-&amp;gt;status == MAC_SUCCESS)
        bsp_board_led_on(CONFIG_INIT_DONE_PIN);
    else
        bsp_board_led_off(CONFIG_INIT_DONE_PIN);

    my_addr = conf-&amp;gt;assoc_short_address;
    NRF_LOG_INFO(&amp;quot;short_address: %x&amp;quot;, my_addr);
}

static void log_mac_pan_descriptor(const mac_pan_descriptor_t *mac_pan_descriptor)
{
    NRF_LOG_INFO(&amp;quot;coord_addr_mode: %d&amp;quot;, mac_pan_descriptor-&amp;gt;coord_addr_mode);
    NRF_LOG_INFO(&amp;quot;coord_pan_id: %x&amp;quot;, mac_pan_descriptor-&amp;gt;coord_pan_id);
    NRF_LOG_INFO(&amp;quot;coord_address.short_address: %x&amp;quot;, mac_pan_descriptor-&amp;gt;coord_address.short_address);
    NRF_LOG_INFO(&amp;quot;coord_address.long_address: %x&amp;quot;, mac_pan_descriptor-&amp;gt;coord_address.long_address);
    NRF_LOG_INFO(&amp;quot;logical_channel: %d&amp;quot;, mac_pan_descriptor-&amp;gt;logical_channel);
    NRF_LOG_INFO(&amp;quot;superframe_spec.beacon_order %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.beacon_order);
    NRF_LOG_INFO(&amp;quot;superframe_spec.superframe_order %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.superframe_order);
    NRF_LOG_INFO(&amp;quot;superframe_spec.final_cap_slot %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.final_cap_slot);
    NRF_LOG_INFO(&amp;quot;superframe_spec.battery_life_extension %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.battery_life_extension);
    NRF_LOG_INFO(&amp;quot;superframe_spec.pan_coordinator %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.pan_coordinator);
    NRF_LOG_INFO(&amp;quot;superframe_spec.association_permit %d&amp;quot;, mac_pan_descriptor-&amp;gt;superframe_spec.association_permit);
    NRF_LOG_INFO(&amp;quot;gts_permit %d&amp;quot;, mac_pan_descriptor-&amp;gt;gts_permit);
    NRF_LOG_INFO(&amp;quot;link_quality %d&amp;quot;, mac_pan_descriptor-&amp;gt;link_quality);
    NRF_LOG_INFO(&amp;quot;timestamp %d&amp;quot;, mac_pan_descriptor-&amp;gt;timestamp);
}

static void mlme_scan_conf_cb(mlme_scan_conf_t * conf)
{
    NRF_LOG_INFO(&amp;quot;mlme_scan_conf: %d&amp;quot;, conf-&amp;gt;status);
    if (conf-&amp;gt;status != MAC_SUCCESS)
        return;
    NRF_LOG_INFO(&amp;quot;unscanned channels: %x&amp;quot;, conf-&amp;gt;unscanned_channels);
    NRF_LOG_INFO(&amp;quot;results: %d&amp;quot;,conf-&amp;gt;result_list_size);
    if (conf-&amp;gt;result_list_size == 0)
        return;
    NRF_LOG_INFO(&amp;quot;first result&amp;quot;);
    pan_descriptor = conf-&amp;gt;pan_descriptor_list[0];
    log_mac_pan_descriptor(&amp;amp;pan_descriptor);

    {
        beacon_order_set(pan_descriptor.superframe_spec.beacon_order);
        static mlme_sync_req_t req;
        req = (mlme_sync_req_t){
            .logical_channel = pan_descriptor.logical_channel,
            .track_beacon = true
        };
        NRF_LOG_INFO(&amp;quot;syncing to channel %d&amp;quot;, req.logical_channel);
        mlme_sync_req(&amp;amp;req);
    }

    static mlme_associate_req_t req;
    req = (mlme_associate_req_t){
        .logical_channel = pan_descriptor.logical_channel,
        .coord_addr_mode = pan_descriptor.coord_addr_mode,
        .coord_pan_id = pan_descriptor.coord_pan_id,
        .coord_address = pan_descriptor.coord_address,
        .capability_information = {
            .alternate_pan_coordinator = 0,
            .device_type = 0,
            .power_source = 0,
            .rx_on_when_idle = 0,
            .reserved = 0,
            .security_capability = 0,
            .allocate_address = 1
        }
    };
    mlme_associate_req(&amp;amp;req, mlme_associate_conf_cb);
}

void mlme_reset_conf_cb(mlme_reset_conf_t *conf)
{
    NRF_LOG_INFO(&amp;quot;mlme_reset_conf: %d&amp;quot;, conf-&amp;gt;status);
    if (conf-&amp;gt;status != MAC_SUCCESS) {
        bsp_board_led_off(CONFIG_INIT_DONE_PIN);
        return;
    }

    ext_addr_set();

    static mac_pan_descriptor_t pan_descriptors_buf[2];
    static mlme_scan_req_t req = {
        .scan_type = ACTIVE_SCAN,
        .scan_channels = (1 &amp;lt;&amp;lt; 15), //PHY_CHANNEL_SUPPORTED,
        .scan_duration = 8,
        .pan_descriptors_buf_size = sizeof(pan_descriptors_buf) / sizeof(pan_descriptors_buf[0]),
        .pan_descriptors_buf = pan_descriptors_buf,
        .energy_detect_buf_size = 0,
        .energy_detect_buf = NULL,
    };
    mlme_scan_req(&amp;amp;req, mlme_scan_conf_cb);
}

static void out_of_memory_callback(const void * data)
{
    bsp_board_led_on(CONFIG_ERROR_PIN);
}

static void memory_freed_callback(const void * data)
{
    bsp_board_led_off(CONFIG_ERROR_PIN);
}

static void falling_asleep_callback(const void * data)
{
    NRF_LOG_INFO(&amp;quot;falling_asleep_callback&amp;quot;);
}

static void wake_up_callback(const void * data)
{
    NRF_LOG_INFO(&amp;quot;wake_up_callback&amp;quot;);
}

/**@brief   Application task initialization for GPIO test.
 */
static void app_task_init(void)
{
    static sys_event_desc_t m_out_of_memory_desc = {
        .event_id = SYS_EVENT_OUT_OF_MEMORY,
        .callback = out_of_memory_callback,
    };
    static sys_event_desc_t m_memory_freed_desc = {
        .event_id = SYS_EVENT_MEMORY_FREED,
        .callback = memory_freed_callback,
    };
    static sys_event_desc_t m_falling_asleep_desc = {
        .event_id = SYS_EVENT_FALLING_ASLEEP,
        .callback = falling_asleep_callback,
    };
    static sys_event_desc_t m_wake_up_desc = {
        .event_id = SYS_EVENT_WAKE_UP,
        .callback = wake_up_callback,
    };
    static uint8_t __ALIGN(ALIGN_VALUE) m_heap[CONFIG_POOL_SIZE];
    static const size_t m_heap_size = CONFIG_POOL_SIZE;

    sys_init(m_heap, m_heap_size);

    sys_event_subscribe(&amp;amp;m_out_of_memory_desc);
    sys_event_subscribe(&amp;amp;m_memory_freed_desc);
    sys_event_subscribe(&amp;amp;m_falling_asleep_desc);
    sys_event_subscribe(&amp;amp;m_wake_up_desc);

    static mlme_reset_req_t req = {
        .set_default_pib = true
    };
    mlme_reset_req(&amp;amp;req, mlme_reset_conf_cb);
}

void mlme_sync_loss_ind(mlme_sync_loss_ind_t * ind)
{
    NRF_LOG_INFO(&amp;quot;mlme_sync_loss for PAN ID: %x on channel %d&amp;quot;, ind-&amp;gt;pan_id, ind-&amp;gt;logical_channel);
    NRF_LOG_INFO(&amp;quot;reason: %d&amp;quot;, ind-&amp;gt;loss_reason);
}

void mlme_beacon_notify_ind(mlme_beacon_notify_ind_t *ind)
{
    NRF_LOG_INFO(&amp;quot;mlme_beacon_notify_ind bsn: %d&amp;quot;, ind-&amp;gt;bsn); 
    mac_mem_msdu_free(&amp;amp;ind-&amp;gt;sdu);
}

static void clock_init(void)
{
    ret_code_t err_code = nrf_drv_clock_init();
    ASSERT((err_code == NRF_SUCCESS) || (err_code == NRF_ERROR_MODULE_ALREADY_INITIALIZED));

    nrf_drv_clock_hfclk_request(NULL);
    while (!nrf_drv_clock_hfclk_is_running())
    {
        // spin lock
    }

    nrf_drv_clock_lfclk_request(NULL);
    while (!nrf_drv_clock_lfclk_is_running())
    {
        // spin lock
    }
}

/**
 * @brief Function for application main entry.
 */
int main(void)
{
    ral_irq_handler_import();
    clock_init();
    APP_ERROR_CHECK(bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, NULL));
    bsp_board_leds_off();
    APP_ERROR_CHECK(app_usbd_init(NULL));
    app_usbd_enable();
    app_usbd_start();
    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();
    for (int i=0; i&amp;lt;300; i++)
    {
        while (app_usbd_event_queue_process());
        if (i % 2)
            bsp_board_leds_off();
        else
            bsp_board_leds_on();
        nrf_delay_ms(10);
    }
    bsp_board_leds_on();
    NRF_LOG_INFO(&amp;quot;Blinky device example started.&amp;quot;);
    bsp_board_leds_off();

    app_task_init();

    bool prev_button = bsp_board_button_state_get(CONFIG_BTN_DATA_SEND);
    bool curr_button = 0;
    while (true)
    {
        while (app_usbd_event_queue_process());
        sys_task_run();
        curr_button = bsp_board_button_state_get(CONFIG_BTN_DATA_SEND);
        if (prev_button == 0 &amp;amp;&amp;amp; curr_button == 1) {
            send_data();
        }
        prev_button = curr_button;
        //sys_sleep_request_ms(2000);
    }
}
&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: problem with 802.15.4 association</title><link>https://devzone.nordicsemi.com/thread/292003?ContentTypeID=1</link><pubDate>Fri, 29 Jan 2021 13:28:49 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9aab4571-2b45-4141-93d0-1bff02927112</guid><dc:creator>rozpruwacz</dc:creator><description>&lt;p&gt;Hi Edvin,&lt;/p&gt;
&lt;p&gt;Thanks for response.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m using 802.15.4 library from normal sdk v17.0.2.&lt;/p&gt;
&lt;p&gt;To my understanding, the beacon_order sould be &amp;gt;= superframe_order and the ralation beetween them is that the superframe_order defines active/inactive portions of the time beetween the beacons and those inactive periods are used in cases when there is multiple FFDs sending their beacons. So the situation that beacon_order &amp;gt; superframe_orfer is the usual case to my understanding.&lt;/p&gt;
&lt;p&gt;What You mean by &amp;quot;change&lt;span&gt;the beacon order and superframe order&lt;/span&gt;&amp;quot; ? I need to set someting in the&amp;nbsp;mlme_start_req_t structure.&amp;nbsp;Are there some default values I can use ? how ?&lt;/p&gt;
&lt;p&gt;Basically what I want to achieve is to get deep&amp;nbsp;understanding of the 802.15.4 protocol before I start developing a zigbee or thread device. If there is better library (with documentation) to learn 802.15.4 protocol&amp;nbsp;please&amp;nbsp;point it to me.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: problem with 802.15.4 association</title><link>https://devzone.nordicsemi.com/thread/291988?ContentTypeID=1</link><pubDate>Fri, 29 Jan 2021 12:31:04 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:15402327-836c-4871-aadf-06a0c1a7831d</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I am not very familiar with the 802.15.4 without using Openthread or Zigbee. What 802.15.4 driver do you use? The one in the normal SDK, or the one from the Thread and Zigbee SDK? They are not the same, and I think the one in the normal SDK is not very much used.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am not 100% sure how beacon and superframe order affects each other, but at least beacon order has to do with the interval length between the beacon messages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Why do you need to change the beacon order and superframe order?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Edvin&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>