Hello,
I started working on 802_15_4 to create a TSCH ( Time SYNC channel hopping ), and it is working as expected. The problem is when i integrated the TSCH TX and TSCH RX in a single program it shows an ERROR, while debug i came across NRF_FAULT_ID_SDK_ASSEART. when i comment out the RX part of the code TX is working as expected. When i test both RX and TX the TX part the code is giving an error. Using SEGGER Embedded Studio with windows 10.The error s shown in the below picture.
The TSCH TX code as follows:
#ifdef __cplusplus extern "C" { #endif #include "802_15_4_config.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "ral_irq_handlers.h" #include "nrf_drv_clock.h" #include "boards.h" #include "mac_mcps_data.h" #include "sys_init.h" #include "sys_task_scheduler.h" #include "mac_common.h" #include "mac_mlme_beacon_notify.h" #include "mac_mlme_comm_status.h" #include "mac_mlme_pib.h" #include "mac_mlme_associate.h" #include "mac_mlme_poll.h" #include "mac_mlme_scan.h" #include "mac_mlme_start.h" #include "mac_security.h" #include "nrf_delay.h" #include "time.h" #ifdef __cplusplus } #endif #include "SEGGER_RTT.h" #include "SEGGER_RTT_Conf.h" #define CONFIG_POOL_SIZE 0x2000 static __ALIGN(ALIGN_VALUE) uint8_t m_heap[CONFIG_POOL_SIZE]; #define CONFIG_ERROR_PIN LED_4 #define C11 (1 << 11) #define C12 (1 << 12) #define C13 (1 << 13) #define C14 (1 << 14) #define C15 (1 << 15) #define C16 (1 << 16) #define C17 (1 << 17) #define C18 (1 << 18) #define C19 (1 << 19) #define C20 (1 << 20) #define C21 (1 << 21) #define C22 (1 << 22) #define C23 (1 << 23) #define C24 (1 << 24) #define C25 (1 << 25) #define C26 (1 << 26) static void out_of_memory_callback(const void* data); static void memory_freed_callback(const void* data); #ifdef __cplusplus constexpr sys_event_desc_t gen_sys_event_desc_t(sys_event_id_t event_id, void(callback)(const void*)) { return sys_event_desc_t{sys_queue_item_t{}, event_id, callback}; } static sys_event_desc_t m_out_of_memory_desc = gen_sys_event_desc_t(SYS_EVENT_OUT_OF_MEMORY, out_of_memory_callback); static sys_event_desc_t m_memory_freed_desc = gen_sys_event_desc_t(SYS_EVENT_MEMORY_FREED, memory_freed_callback); #else 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}; #endif void wait_ms(const uint32_t count) { SEGGER_RTT_printf(0, "dummy wait: "); for(volatile uint32_t i=0; i<2432u*count; i++) { uint32_t j = i%(2432u*100u); if(j == 0) { SEGGER_RTT_printf(0, ".", j); } } SEGGER_RTT_printf(0, "\n"); } static void out_of_memory_callback(const void* data) { LEDS_ON(BIT(CONFIG_ERROR_PIN)); } static void memory_freed_callback(const void* data) { LEDS_OFF(BIT(CONFIG_ERROR_PIN)); } static void app_task_init(void) { LEDS_CONFIGURE(LEDS_MASK); LEDS_OFF(LEDS_MASK); sys_init(m_heap, CONFIG_POOL_SIZE); sys_event_subscribe(&m_out_of_memory_desc); sys_event_subscribe(&m_memory_freed_desc); } 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 } } void print_mac_status(const mac_status_t status) { switch (status) { case MAC_NO_BEACON: SEGGER_RTT_printf(0, "MAC_NO_BEACON"); break; case MAC_SUCCESS: SEGGER_RTT_printf(0, "MAC_SUCCESS"); break; case MAC_LIMIT_REACHED: SEGGER_RTT_printf(0, "MAC_LIMIT_REACHED"); break; default: SEGGER_RTT_printf(0, "0x%x", status); break; } } void print_addr(const mac_addr_t* addr, const mac_addr_mode_t addr_mode, const char* field) { SEGGER_RTT_printf(0, "%s: ", field); switch (addr_mode) { case MAC_ADDR_NONE: SEGGER_RTT_printf(0, "NONE"); break; case MAC_ADDR_SHORT: SEGGER_RTT_printf(0, "0x%04x (short)", addr->short_address); break; case MAC_ADDR_LONG: default: SEGGER_RTT_printf(0, "0x%08x%08x (long)", (uint32_t)(addr->long_address >> 32), (uint32_t)(addr->long_address)); break; } } void print_pan_desc(const mac_pan_descriptor_t* pan) { SEGGER_RTT_printf(0, "{coord_pan_id: 0x%04x, ", pan->coord_pan_id); print_addr(&(pan->coord_address), pan->coord_addr_mode, "address"); SEGGER_RTT_printf(0, ", logical_channel: %u, timestamp: 0x%x, link_quality: " "%u, superframe_spec: 0x%x, gts: %s}", pan->logical_channel, pan->timestamp, pan->link_quality, pan->superframe_spec, pan->gts_permit ? "true" : "false"); } void print_scan_conf(const mlme_scan_conf_t* sc) { SEGGER_RTT_printf(0, "{status: "); print_mac_status(sc->status); SEGGER_RTT_printf(0, ", scan_type: "); switch (sc->scan_type) { case ED_SCAN: SEGGER_RTT_printf(0, "ED_SCAN"); break; case ACTIVE_SCAN: SEGGER_RTT_printf(0, "ACTIVE_SCAN"); break; case PASSIVE_SCAN: SEGGER_RTT_printf(0, "PASSIVE_SCAN"); break; case ORPHAN_SCAN: SEGGER_RTT_printf(0, "ORPHAN_SCAN"); break; default: SEGGER_RTT_printf(0, "Unknown(%x)", sc->scan_type); break; } SEGGER_RTT_printf(0, ", unscanned_channels: %x", sc->unscanned_channels); SEGGER_RTT_printf(0, ", result_list_size: %u, results: {", sc->result_list_size); for (size_t i = 0; i < sc->result_list_size; i++) { const mac_pan_descriptor_t* pan = &(sc->pan_descriptor_list[i]); SEGGER_RTT_printf(0, "Result %u: {pan_descriptor: ", i); print_pan_desc(pan); //for an active scan, the content of the energy_detect_list must not be read. //const uint8_t energy = sc->energy_detect_list[i]; //(void)energy; //SEGGER_RTT_printf(0, ", energy: %x", energy); SEGGER_RTT_printf(0, "}, "); } SEGGER_RTT_printf(0, "}\n"); } bool callback_called = false; void scan_callback(mlme_scan_conf_t* sc) { callback_called = true; }; void start_callback(mlme_start_conf_t* sc) { callback_called = true; }; mlme_scan_req_t gen_mac_scan_req_t( mac_scan_type_t scan_type, uint32_t scan_channels, uint8_t scan_duration, mac_pan_descriptor_t* pan_desc_buf, size_t pan_desc_size, uint8_t* energy_detect_buf, size_t energy_detect_size) { mlme_scan_req_t ret; ret.scan_type = scan_type; ret.scan_channels = scan_channels; ret.scan_duration = scan_duration; ret.pan_descriptors_buf = pan_desc_buf; ret.pan_descriptors_buf_size = pan_desc_size; ret.energy_detect_buf = energy_detect_buf; ret.energy_detect_buf_size = energy_detect_size; return ret; } const mlme_scan_conf_t* scan_req(mac_scan_type_t scan_type, uint32_t scan_channels, uint8_t scan_duration) { #define _ENERGY_DET_SIZE 8 #define _PAN_DESC_SIZE 8 static mac_pan_descriptor_t pd[_PAN_DESC_SIZE]; static uint8_t ed[_ENERGY_DET_SIZE]; static mlme_scan_req_t scan_req; scan_req = gen_mac_scan_req_t(scan_type, scan_channels, scan_duration, pd, _PAN_DESC_SIZE, ed, _ENERGY_DET_SIZE); callback_called = false; mlme_scan_req(&scan_req, scan_callback); while (!callback_called) { sys_task_run(); } return &scan_req.confirm; } void gen_mac_key_descr_t(mac_key_descr_t* key_descr) { mac_table_init(&key_descr->id_lookup_list); mac_table_init(&key_descr->key_device_list); mac_table_init(&key_descr->key_usage_list); } mac_device_descr_t gen_mac_device_descr_t(uint16_t pan_id, uint16_t short_address, uint64_t extended_address, uint32_t frame_counter, bool exempt) { mac_device_descr_t ret; ret.pan_id = pan_id; ret.short_address = short_address; ret.extended_address = extended_address; ret.frame_counter = frame_counter; ret.exempt = exempt; return ret; } mac_security_level_descr_t gen_mac_security_level_descr_t( uint8_t frame_type, uint8_t cmd_frame_id, uint8_t security_min, uint8_t override_min) { mac_security_level_descr_t ret; ret.security_min = security_min; ret.override_min = override_min; ret.frame_type = frame_type; ret.cmd_frame_id = cmd_frame_id; return ret; } mac_key_id_lookup_descr_t gen_mac_key_id_lookup_descr_t( mac_key_lookup_size_t size) { mac_key_id_lookup_descr_t ret; ret.size = size; return ret; } mac_key_device_descr_t gen_mac_key_device_descr_t(uint8_t device_handle, uint8_t unique_device, uint8_t blacklisted) { mac_key_device_descr_t ret; ret.device_handle = device_handle; ret.blacklisted = blacklisted; ret.unique_device = unique_device; return ret; } mac_key_usage_descr_t gen_mac_key_usage_descr_t(uint8_t frame_type, uint8_t cmd_frame_id) { mac_key_usage_descr_t ret; ret.frame_type = frame_type; ret.cmd_frame_id = cmd_frame_id; return ret; } pib_id_t gen_pib_id_t_plme(plme_pib_attr_id_t id) { pib_id_t ret; ret.plme_id = id; return ret; } pib_id_t gen_pib_id_t(mlme_pib_attr_id_t id) { pib_id_t ret; ret.mlme_id = id; return ret; } const char* pib_id_str(pib_id_t id) { switch(id.mlme_id) { case MAC_PAN_ID: return "MAC_PAN_ID"; case MAC_PAN_COORD_EXTENDED_ADDRESS: return "MAC_PAN_COORD_EXTENDED_ADDRESS"; case MAC_PROMISCUOUS_MODE: return "MAC_PROMISCUOUS_MODE"; case MAC_EXTENDED_ADDRESS: return "MAC_EXTENDED_ADDRESS"; case MAC_SHORT_ADDRESS: return "MAC_SHORT_ADDRESS"; case MAC_BEACON_PAYLOAD_LENGTH: return "MAC_BEACON_PAYLOAD_LENGTH"; case MAC_BEACON_PAYLOAD: return "MAC_BEACON_PAYLOAD"; case MAC_BEACON_ORDER: return "MAC_BEACON_ORDER"; case MAC_RX_ON_WHEN_IDLE: return "MAC_RX_ON_WHEN_IDLE"; case MAC_BATT_LIFE_EXT: return "MAC_BATT_LIFE_EXT"; case MAC_IS_PAN_COORD: return "MAC_IS_PAN_COORD"; case MAC_ASSOCIATION_PERMIT: return "MAC_ASSOCIATION_PERMIT"; case MAC_GTS_PERMIT: return "MAC_GTS_PERMIT"; case PHY_CURRENT_CHANNEL_ID: return "PHY_CURRENT_CHANNEL"; default: return "**************UNKNOWN****************"; } } void print_pib_get_request(const uint8_t* value, uint16_t size, const char* name) { SEGGER_RTT_printf(0, "mlme_get: %s: 0x", name); for (uint16_t i = 0; i < size; i++) { SEGGER_RTT_printf(0, "%02x", value[i]); } SEGGER_RTT_printf(0, "\n"); } const uint8_t* pib_get_request(pib_id_t id) { static uint8_t value[256]; mac_status_t res = mlme_get(id, 0, value); const char* name = pib_id_str(id); if (res != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-get request(%s): ", name); print_mac_status(res); SEGGER_RTT_printf(0, "\n"); return NULL; } print_pib_get_request(value, mlme_pib_attr_size_calc(id, 0), name); return value; } void pib_set_request(pib_id_t id, void * data) { mac_status_t state = mlme_set(id, 0, data); if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request(%s): ", pib_id_str(id)); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } } const uint8_t* pib_set_get_request(pib_id_t id, void * data) { pib_set_request(id, data); return pib_get_request(id); } void print_beacon_notify_ind(const mlme_beacon_notify_ind_t* ind) { SEGGER_RTT_printf(0, "{bsn: %u, pan_descriptor: ", ind->bsn); print_pan_desc(&(ind->pan_descriptor)); SEGGER_RTT_printf(0, ", sdu_length: %u, sdu: 0x", ind->sdu_length); for (size_t i = 0u; i < ind->sdu_length; i++) { SEGGER_RTT_printf(0, "%02x", ind->sdu.p_payload[i]); } SEGGER_RTT_printf(0, ", pend_addr_spec: %x}\n", ind->pend_addr_spec); } //void print_data_ind(const mcps_data_ind_t* ind) { // SEGGER_RTT_printf(0, "{src_pan_id: 0x%04x, ", ind->src_pan_id); // print_addr(&(ind->src_addr), ind->src_addr_mode, "src_addr"); // SEGGER_RTT_printf(0, ", dst_pan_id: 0x%04x, ", ind->dst_pan_id); // print_addr(&(ind->dst_addr), ind->dst_addr_mode, "dst_addr"); // SEGGER_RTT_printf(0, ", msdu_length: %u, sdu: 0x", ind->msdu_length); // for (size_t i = 0u; i < ind->msdu_length; i++) { // SEGGER_RTT_printf(0, "%02x", ind->msdu.p_payload[i]); // } // SEGGER_RTT_printf(0, ", mpdu_link_quality: %u", ind->mpdu_link_quality); // SEGGER_RTT_printf(0, ", dsn: %u", ind->dsn); // SEGGER_RTT_printf(0, ", timestamp: %u}\n", ind->timestamp); // SEGGER_RTT_printf(0, "\n"); //} // //void mlme_beacon_notify_ind(mlme_beacon_notify_ind_t* _ind) { // SEGGER_RTT_printf(0, "Received Beacon:\n"); // print_beacon_notify_ind(_ind); //} void mlme_poll_ind(mlme_poll_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Poll:\n"); } //void mcps_data_ind(mcps_data_ind_t* _ind) { // SEGGER_RTT_printf(0, "Received Data:\n"); // print_data_ind(_ind); //} void mlme_associate_ind(mlme_associate_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Association:\n"); } void dummy_wait() { SEGGER_RTT_printf(0, "dummy wait: ..."); for(volatile size_t i=0; i<1024*1024*8; i++) { uint32_t j = (i + 10 )%(1024*1024*2); if(j+44 == 88) { SEGGER_RTT_printf(0, "%d,", j); } } SEGGER_RTT_printf(0, "\n"); } uint32_t asn = 0; uint8_t asn_f[4],time_sync_f[8]; uint8_t ch_offsetsel[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // ChannelOffset uint8_t beacon_payload[8]; uint64_t current_time=0,pervious_time=0; uint32_t time_sync; static uint8_t beacon_payload_length = sizeof(beacon_payload); static const uint8_t ext_addr[] = {0xcau, 0xfeu, 0xbeu, 0xefu, 0x00u, 0x00u, 0xffu, 0xffu}; int i=0,k=0; int main(void) { ral_irq_handler_import(); SEGGER_RTT_Init(); uint8_t rtt_buf_out[256u]; SEGGER_RTT_ConfigUpBuffer(0, "OUT", rtt_buf_out, 256u, SEGGER_RTT_MODE_NO_BLOCK_TRIM); app_task_init(); sys_task_post(APP_TASK_ID); clock_init(); SEGGER_RTT_printf(0, "....RESET COORD....\n"); #if (CONFIG_SECURE == 1) SEGGER_RTT_printf(0, "Compiled with CONFIG_SECURE\n"); #endif static uint8_t mac_association_permit = true; #define BEACON_ORDER 0x9u // beacon interval = 7.68 sec #define SUPERFRAME_ORDER 0x0u static uint8_t mac_gts_permit = false; static uint8_t rx_on_when_idle = true; //static uint8_t beacon_payload[] = {0xabu, 0xabu, 0xabu, 0xabu, 0xbbu, 0xbbu, 0xbbu, 0xbbu,0x11,0x22,0x33,0xabu, 0xabu, 0xabu, 0xabu, 0xbbu, 0xbbu, 0xbbu, 0xbbu,0x11,0x22,0x33,0xabu, 0xabu, 0xabu, 0xabu, 0xbbu, 0xbbu, 0xbbu, 0xbbu,0x11,0x22,0x33,0xabu, 0xabu, 0xabu, 0xabu, 0xbbu, 0xbbu, 0xbbu, 0xbbu,0x11,0x22,0x33,12,12,12}; // uint8_t hop_sequence[] = {11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; // available channels uint8_t hop_sequence[]= {16,17,23,18,26,15,25,22,19,11,12,13,24,14,20,21}; //channels hop sequence is given by kaumudi singh // uint8_t ch_offset=ch_offsetsel[rand()%16]; uint8_t ch_offset = 0; uint8_t ch_select; static uint16_t ext_addr_only = MAC_EXTENDED_ADDRESS_ONLY; pib_set_get_request(gen_pib_id_t(MAC_EXTENDED_ADDRESS), (void *)ext_addr); pib_set_get_request(gen_pib_id_t(MAC_SHORT_ADDRESS), &ext_addr_only); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD_LENGTH), &beacon_payload_length); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD), (void*)beacon_payload); pib_set_get_request(gen_pib_id_t(MAC_RX_ON_WHEN_IDLE), &rx_on_when_idle); pib_set_get_request(gen_pib_id_t(MAC_ASSOCIATION_PERMIT), &mac_association_permit); pib_get_request(gen_pib_id_t(MAC_GTS_PERMIT)); pib_set_get_request(gen_pib_id_t(MAC_GTS_PERMIT), &mac_gts_permit); // start superframe structure static mlme_start_req_t start_req = { .pan_id = 0x1111, .logical_channel = 11, .start_time = 0x000000, .beacon_order = BEACON_ORDER, .superframe_order = SUPERFRAME_ORDER, .pan_coordinator = true, .battery_life_extension = false, .coord_realignment = false, #if (CONFIG_SECURE == 1) .coord_realign_security_level = false, .beacon_security_level = false, #endif }; callback_called = false; mlme_start_req(&start_req, start_callback); while (!callback_called) { sys_task_run(); } SEGGER_RTT_printf(0, "Sent the Start-Request: "); print_mac_status(start_req.confirm.status); SEGGER_RTT_printf(0, "\n"); SEGGER_RTT_printf(0, " Channel : %u\n",start_req.logical_channel); SEGGER_RTT_printf(0,"Time :%u\n",sys_time_get()); while(true) { SEGGER_RTT_printf(0, "cho: %d\n",ch_offset); for (i=0;;i++) { //channel = (ASN + ChannelOffset) % N , ASN-Absolute Slot Number,N-number of channels ch_select = ((asn+ch_offset)%(16)); start_req.logical_channel = hop_sequence[ch_select]; callback_called = false; mlme_start_req(&start_req, start_callback); while (!callback_called) { sys_task_run(); } SEGGER_RTT_printf(0, "Sent the Start-Request: "); print_mac_status(start_req.confirm.status); SEGGER_RTT_printf(0, "\n"); asn=asn+505; asn_f[0]=((asn >> 24 ) & 0xFF); asn_f[1]=((asn >> 16 ) & 0xFF); asn_f[2]=((asn >> 8 ) & 0xFF); asn_f[3]=((asn ) & 0xFF); SEGGER_RTT_printf(0, " Channel : %u\n",start_req.logical_channel); printf("channel_select %u , asn %u , channel offset %u\n",ch_select,asn,ch_offset); printf("asn_f = %x%x%x%x\n",asn_f[0],asn_f[1],asn_f[2],asn_f[3]); current_time=sys_time_get(); SEGGER_RTT_printf(0,"Time0 :%u\n",current_time); time_sync=current_time-pervious_time; SEGGER_RTT_printf(0,"Time_sy :%u\n",time_sync); pervious_time=current_time; // SEGGER_RTT_printf(0,"Time_pr :%u\n",pervious_time); SEGGER_RTT_printf(0, "\n"); time_sync_f[0]=((time_sync >> 24) & 0xFF); time_sync_f[1]=((time_sync >> 16) & 0xFF); time_sync_f[2]=((time_sync >> 8) & 0xFF); time_sync_f[3]=((time_sync) & 0xFF); beacon_payload[0] =asn_f[0]; beacon_payload[1] =asn_f[1]; beacon_payload[2] =asn_f[2]; beacon_payload[3] =asn_f[3]; beacon_payload[4] =time_sync_f[0]; beacon_payload[5] =time_sync_f[1]; beacon_payload[6] =time_sync_f[2]; beacon_payload[7] =time_sync_f[3]; pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD_LENGTH), &beacon_payload_length); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD), (void*)beacon_payload); } } while(true) { sys_task_run(); } }
The following code contains both TX and RX in a single program.
#ifdef __cplusplus extern "C" { #endif #include "802_15_4_config.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "ral_irq_handlers.h" #include "nrf_drv_clock.h" #include "boards.h" #include "mac_mcps_data.h" #include "sys_init.h" #include "sys_task_scheduler.h" #include "mac_common.h" #include "mac_mlme_beacon_notify.h" #include "mac_mlme_comm_status.h" #include "mac_mlme_pib.h" #include "mac_mlme_scan.h" #include "mac_security.h" #include "app_timer.h" #include "nrf_drv_clock.h" #include "nrfx_timer.h" #ifdef __cplusplus } #endif //for tx #include "mac_mlme_associate.h" #include "mac_mlme_poll.h" #include "mac_mlme_start.h" #include "nrf_delay.h" #include "time.h" #include "SEGGER_RTT.h" #include "SEGGER_RTT_Conf.h" #define CONFIG_POOL_SIZE 0x30000 static __ALIGN(ALIGN_VALUE) uint8_t m_heap[CONFIG_POOL_SIZE]; #define CONFIG_ERROR_PIN LED_4 #define NRF_PWR_MGMT_ENABLED 1 #define C11 (1 << 11) #define C12 (1 << 12) #define C13 (1 << 13) #define C14 (1 << 14) #define C15 (1 << 15) #define C16 (1 << 16) #define C17 (1 << 17) #define C18 (1 << 18) #define C19 (1 << 19) #define C20 (1 << 20) #define C21 (1 << 21) #define C22 (1 << 22) #define C23 (1 << 23) #define C24 (1 << 24) #define C25 (1 << 25) #define C26 (1 << 26) static int stat; uint8_t sdu_length; int scan_dur=-5; //scan_duration = scan network for 77ms long int no_beacon_sleep=100; //1.82sec long int beacon_sleep=7000000; //1.91sec //int beacon_recieved=0; uint8_t k; //No. of frames received uint32_t channel_hop_seq[] = {C16,C17,C23,C18,C26,C15,C25,C22,C19,C11,C12,C13,C24,C14,C20,C21}; //uint32_t channel_hop_seq[] = {16,17,23,18,26,15,25,22,19,11,12,13,24,14,20,21}; uint32_t channel_id=C16; static void out_of_memory_callback(const void* data); static void memory_freed_callback(const void* data); #ifdef __cplusplus constexpr sys_event_desc_t gen_sys_event_desc_t(sys_event_id_t event_id, void(callback)(const void*)) { return sys_event_desc_t{sys_queue_item_t{}, event_id, callback}; } static sys_event_desc_t m_out_of_memory_desc = gen_sys_event_desc_t(SYS_EVENT_OUT_OF_MEMORY, out_of_memory_callback); static sys_event_desc_t m_memory_freed_desc = gen_sys_event_desc_t(SYS_EVENT_MEMORY_FREED, memory_freed_callback); #else 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}; #endif //tx void wait_ms(const uint32_t count) { SEGGER_RTT_printf(0, "dummy wait: "); for(volatile uint32_t i=0; i<2432u*count; i++) { uint32_t j = i%(2432u*100u); if(j == 0) { SEGGER_RTT_printf(0, ".", j); } } SEGGER_RTT_printf(0, "\n"); } //end //change void timer2init(long int n) { NRF_TIMER2->TASKS_STOP = 1; NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos; //choose mode between timer and counter NRF_TIMER2->TASKS_CLEAR = 1; NRF_TIMER2->BITMODE =TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos; NRF_TIMER2->PRESCALER =4 << TIMER_PRESCALER_PRESCALER_Pos; NRF_TIMER2->CC[0]=n; //compare event to cc[0] register NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos ;//enable interrupt NRF_TIMER2->SHORTS = TIMER_SHORTS_COMPARE0_STOP_Enabled <<TIMER_SHORTS_COMPARE0_STOP_Pos ;//shortcut path between tasks and local events NRF_TIMER2->TASKS_START = 1; NVIC_SetPriority( TIMER2_IRQn, 7); __DSB(); NVIC_EnableIRQ(TIMER2_IRQn); } /* void timer3init(long int n) { NRF_TIMER3->TASKS_STOP = 1; NRF_TIMER3->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos; NRF_TIMER3->TASKS_CLEAR = 1; NRF_TIMER3->BITMODE =TIMER_BITMODE_BITMODE_32Bit << TIMER_BITMODE_BITMODE_Pos; NRF_TIMER3->PRESCALER =4 << TIMER_PRESCALER_PRESCALER_Pos; NRF_TIMER3->CC[0]=n; NRF_TIMER3->INTENSET = TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos ; NRF_TIMER3->SHORTS = TIMER_SHORTS_COMPARE0_STOP_Enabled <<TIMER_SHORTS_COMPARE0_STOP_Pos ; NRF_TIMER3->TASKS_START = 1; // NVIC_SetPriority( TIMER3_IRQn, 3); // __DSB(); NVIC_EnableIRQ(TIMER3_IRQn); } */ // Transmitter code start uint8_t sdu_data[4]; uint32_t sdu_data_dec,asn; uint8_t ch_offset=0,slotoffest=201; int z; static void out_of_memory_callback(const void* data) { LEDS_ON(BIT(CONFIG_ERROR_PIN)); } static void memory_freed_callback(const void* data) { LEDS_OFF(BIT(CONFIG_ERROR_PIN)); } static void app_task_init(void) { LEDS_CONFIGURE(LEDS_MASK); LEDS_OFF(LEDS_MASK); sys_init(m_heap, CONFIG_POOL_SIZE); sys_event_subscribe(&m_out_of_memory_desc); sys_event_subscribe(&m_memory_freed_desc); } 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 } } void print_mac_status(const mac_status_t status) { switch (status) { case MAC_NO_BEACON: SEGGER_RTT_printf(0, "MAC_NO_BEACON"); break; case MAC_SUCCESS: SEGGER_RTT_printf(0, "MAC_SUCCESS"); break; case MAC_LIMIT_REACHED: SEGGER_RTT_printf(0, "MAC_LIMIT_REACHED"); break; default: SEGGER_RTT_printf(0, "0x%x", status); break; } } void print_addr(const mac_addr_t* addr, const mac_addr_mode_t addr_mode, const char* field) { SEGGER_RTT_printf(0, "%s: ", field); switch (addr_mode) { case MAC_ADDR_NONE: SEGGER_RTT_printf(0, "NONE"); break; case MAC_ADDR_SHORT: SEGGER_RTT_printf(0, "0x%04x (short)", addr->short_address); break; case MAC_ADDR_LONG: default: SEGGER_RTT_printf(0, "0x%08x%08x (long)", (uint32_t)(addr->long_address >> 32), (uint32_t)(addr->long_address)); break; } } void print_pan_desc(const mac_pan_descriptor_t* pan) { SEGGER_RTT_printf(0, "{coord_pan_id: 0x%04x, ", pan->coord_pan_id); print_addr(&(pan->coord_address), pan->coord_addr_mode, "address"); SEGGER_RTT_printf(0, ", logical_channel: %u, timestamp: 0x%x, link_quality: " "%u, superframe_spec: 0x%x, gts: %s}", pan->logical_channel, pan->timestamp, pan->link_quality, pan->superframe_spec, pan->gts_permit ? "true" : "false"); } int print_scan_conf_rx(const mlme_scan_conf_t* sc) { if((sc->status)==MAC_SUCCESS) return 1; else return 0; } //tx void print_scan_conf(const mlme_scan_conf_t* sc) { SEGGER_RTT_printf(0, "{status: "); print_mac_status(sc->status); SEGGER_RTT_printf(0, ", scan_type: "); switch (sc->scan_type) { case ED_SCAN: SEGGER_RTT_printf(0, "ED_SCAN"); break; case ACTIVE_SCAN: SEGGER_RTT_printf(0, "ACTIVE_SCAN"); break; case PASSIVE_SCAN: SEGGER_RTT_printf(0, "PASSIVE_SCAN"); break; case ORPHAN_SCAN: SEGGER_RTT_printf(0, "ORPHAN_SCAN"); break; default: SEGGER_RTT_printf(0, "Unknown(%x)", sc->scan_type); break; } SEGGER_RTT_printf(0, ", unscanned_channels: %x", sc->unscanned_channels); SEGGER_RTT_printf(0, ", result_list_size: %u, results: {", sc->result_list_size); for (size_t i = 0; i < sc->result_list_size; i++) { const mac_pan_descriptor_t* pan = &(sc->pan_descriptor_list[i]); SEGGER_RTT_printf(0, "Result %u: {pan_descriptor: ", i); print_pan_desc(pan); //for an active scan, the content of the energy_detect_list must not be read. //const uint8_t energy = sc->energy_detect_list[i]; //(void)energy; //SEGGER_RTT_printf(0, ", energy: %x", energy); SEGGER_RTT_printf(0, "}, "); } SEGGER_RTT_printf(0, "}\n"); } //end bool callback_called = false; void scan_callback(mlme_scan_conf_t *sc) { callback_called = true;}; void start_callback(mlme_start_conf_t *sc) { callback_called = true;}; mlme_scan_req_t gen_mac_scan_req_t( mac_scan_type_t scan_type, uint32_t scan_channels, uint8_t scan_duration, mac_pan_descriptor_t* pan_desc_buf, size_t pan_desc_size, uint8_t* energy_detect_buf, size_t energy_detect_size) { mlme_scan_req_t ret; ret.scan_type = scan_type; ret.scan_channels = scan_channels; ret.scan_duration = scan_duration; ret.pan_descriptors_buf = pan_desc_buf; ret.pan_descriptors_buf_size = pan_desc_size; ret.energy_detect_buf = energy_detect_buf; ret.energy_detect_buf_size = energy_detect_size; return ret; } //changed to int from uint8_t for scan_duration const mlme_scan_conf_t* scan_req(mac_scan_type_t scan_type, uint32_t scan_channels, int scan_duration) { #define _ENERGY_DET_SIZE 8 #define _PAN_DESC_SIZE 8 static mac_pan_descriptor_t pd[_PAN_DESC_SIZE]; static uint8_t ed[_ENERGY_DET_SIZE]; mcps_data_ind_t* ind; static mlme_scan_req_t scan_req; scan_req = gen_mac_scan_req_t(scan_type, scan_channels, scan_duration, pd, _PAN_DESC_SIZE, ed, _ENERGY_DET_SIZE); callback_called = false; mlme_scan_req(&scan_req, scan_callback); while (!callback_called) { sys_task_run(); } return &scan_req.confirm; } void gen_mac_key_descr_t(mac_key_descr_t* key_descr) { mac_table_init(&key_descr->id_lookup_list); mac_table_init(&key_descr->key_device_list); mac_table_init(&key_descr->key_usage_list); } mac_device_descr_t gen_mac_device_descr_t(uint16_t pan_id, uint16_t short_address, uint64_t extended_address, uint32_t frame_counter, bool exempt) { mac_device_descr_t ret; ret.pan_id = pan_id; ret.short_address = short_address; ret.extended_address = extended_address; ret.frame_counter = frame_counter; ret.exempt = exempt; return ret; } mac_security_level_descr_t gen_mac_security_level_descr_t( uint8_t frame_type, uint8_t cmd_frame_id, uint8_t security_min, uint8_t override_min) { mac_security_level_descr_t ret; ret.security_min = security_min; ret.override_min = override_min; ret.frame_type = frame_type; ret.cmd_frame_id = cmd_frame_id; return ret; } mac_key_id_lookup_descr_t gen_mac_key_id_lookup_descr_t( mac_key_lookup_size_t size) { mac_key_id_lookup_descr_t ret; ret.size = size; return ret; } mac_key_device_descr_t gen_mac_key_device_descr_t(uint8_t device_handle, uint8_t unique_device, uint8_t blacklisted) { mac_key_device_descr_t ret; ret.device_handle = device_handle; ret.blacklisted = blacklisted; ret.unique_device = unique_device; return ret; } mac_key_usage_descr_t gen_mac_key_usage_descr_t(uint8_t frame_type, uint8_t cmd_frame_id) { mac_key_usage_descr_t ret; ret.frame_type = frame_type; ret.cmd_frame_id = cmd_frame_id; return ret; } pib_id_t gen_pib_id_t_plme(plme_pib_attr_id_t id) { pib_id_t ret; ret.plme_id = id; return ret; } pib_id_t gen_pib_id_t(mlme_pib_attr_id_t id) { pib_id_t ret; ret.mlme_id = id; return ret; } const char* pib_id_str(pib_id_t id) { switch(id.mlme_id) { case MAC_PAN_ID: return "MAC_PAN_ID"; case MAC_PAN_COORD_EXTENDED_ADDRESS: return "MAC_PAN_COORD_EXTENDED_ADDRESS"; case MAC_PROMISCUOUS_MODE: return "MAC_PROMISCUOUS_MODE"; case MAC_EXTENDED_ADDRESS: return "MAC_EXTENDED_ADDRESS"; case MAC_SHORT_ADDRESS: return "MAC_SHORT_ADDRESS"; case MAC_BEACON_PAYLOAD_LENGTH: return "MAC_BEACON_PAYLOAD_LENGTH"; case MAC_BEACON_PAYLOAD: return "MAC_BEACON_PAYLOAD"; case MAC_BEACON_ORDER: return "MAC_BEACON_ORDER"; case MAC_RX_ON_WHEN_IDLE: return "MAC_RX_ON_WHEN_IDLE"; case MAC_BATT_LIFE_EXT: return "MAC_BATT_LIFE_EXT"; case MAC_IS_PAN_COORD: return "MAC_IS_PAN_COORD"; case MAC_ASSOCIATION_PERMIT: return "MAC_ASSOCIATION_PERMIT"; case MAC_GTS_PERMIT: return "MAC_GTS_PERMIT"; case PHY_CURRENT_CHANNEL_ID: return "PHY_CURRENT_CHANNEL"; default: return "**************UNKNOWN****************"; } } void print_pib_get_request(const uint8_t* value, uint16_t size, const char* name) { SEGGER_RTT_printf(0, "mlme_get: %s: 0x", name); for (uint16_t i = 0; i < size; i++) { SEGGER_RTT_printf(0, "%02x", value[i]); } SEGGER_RTT_printf(0, "\n"); } const uint8_t* pib_get_request_tx(pib_id_t id) { static uint8_t value[256]; mac_status_t res = mlme_get(id, 0, value); const char* name = pib_id_str(id); if (res != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-get request(%s): ", name); print_mac_status(res); SEGGER_RTT_printf(0, "\n"); return NULL; } print_pib_get_request(value, mlme_pib_attr_size_calc(id, 0), name); return value; } const uint8_t* pib_get_request(pib_id_t id, const char* name) { static uint8_t value[256]; mac_status_t res = mlme_get(id, 0, value); if (res != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-get request: "); print_mac_status(res); SEGGER_RTT_printf(0, "\n"); return NULL; } print_pib_get_request(value, mlme_pib_attr_size_calc(id, 0), name); return value; } void pib_set_request(pib_id_t id, void * data) { mac_status_t state = mlme_set(id, 0, data); if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request(%s): ", pib_id_str(id)); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } } const uint8_t* pib_set_get_request(pib_id_t id, void * data) { pib_set_request(id, data); return pib_get_request_tx(id); } void print_beacon_notify_ind(const mlme_beacon_notify_ind_t* ind) { SEGGER_RTT_printf(0, "{bsn: %u, pan_descriptor: ", ind->bsn); print_pan_desc(&(ind->pan_descriptor)); SEGGER_RTT_printf(0, ", sdu_length: %u, sdu: 0x", ind->sdu_length); for (size_t i = 0u; i < ind->sdu_length; i++) { SEGGER_RTT_printf(0, "%02x", ind->sdu.p_payload[i]); } SEGGER_RTT_printf(0, ", pend_addr_spec: %x}\n", ind->pend_addr_spec); } void print_data_ind_tx(const mcps_data_ind_t* ind) { SEGGER_RTT_printf(0, "{src_pan_id: 0x%04x, ", ind->src_pan_id); print_addr(&(ind->src_addr), ind->src_addr_mode, "src_addr"); SEGGER_RTT_printf(0, ", dst_pan_id: 0x%04x, ", ind->dst_pan_id); print_addr(&(ind->dst_addr), ind->dst_addr_mode, "dst_addr"); SEGGER_RTT_printf(0, ", msdu_length: %u, sdu: 0x", ind->msdu_length); for (size_t i = 0u; i < ind->msdu_length; i++) { SEGGER_RTT_printf(0, "%02x", ind->msdu.p_payload[i]); } SEGGER_RTT_printf(0, ", mpdu_link_quality: %u", ind->mpdu_link_quality); SEGGER_RTT_printf(0, ", dsn: %u", ind->dsn); SEGGER_RTT_printf(0, ", timestamp: %u}\n", ind->timestamp); SEGGER_RTT_printf(0, "\n"); } void mlme_beacon_notify_ind(mlme_beacon_notify_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Beacon:\n"); print_beacon_notify_ind(_ind); } void mlme_poll_ind(mlme_poll_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Poll:\n"); } void mcps_data_ind_tx(mcps_data_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Data:\n"); print_data_ind_tx(_ind); } void mlme_associate_ind(mlme_associate_ind_t* _ind) { SEGGER_RTT_printf(0, "Received Association:\n"); } //end void dummy_wait() { SEGGER_RTT_printf(0, "dummy wait: ..."); for(volatile size_t i=0; i<1024*1024*8; i++) { uint32_t j = (i + 10 )%(1024*1024*2); if(j+44 == 88) { SEGGER_RTT_printf(0, "%d,", j); } } SEGGER_RTT_printf(0, "\n"); } static uint8_t security_enabled = true; static uint16_t pan_id = 0x1111; // same as that of the transmitter static uint16_t other_address = 0xFFFEU; static uint64_t pan_external = 0x1122334455667788ULL; static uint8_t promiscuous_mode = true; // receive all packets which are sent wirelessly static uint8_t rx_on_when_idle = true; // static uint32_t channel_id = C12; // channel to receive packets static uint8_t key[MAC_SECURITY_KEY_SIZE] = { 0x12u, 0x34u, 0x56u, 0x78u, 0x9Au, 0xBCu, 0xDEu, 0xF0u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}; static const uint8_t key_lookup_data[KEY_LOOKUP_SIZE_NINE_VAL] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x03}; static uint8_t default_source[KEY_LOOKUP_SIZE_NINE_VAL - 1] = { 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33}; static uint8_t auto_request_security_level = MAC_SEC_OFF; static mac_security_level_descr_t sec_level_descr; static mac_key_id_lookup_descr_t key_id_lookup_descr; static mac_key_device_descr_t key_device_descr; static mac_device_descr_t device_descr; static mac_key_usage_descr_t key_usage_descr; static mac_key_descr_t key_descr; void recieving_handle(void) { sec_level_descr = gen_mac_security_level_descr_t(MAC_DATA, MAC_CMD_DATA_REQ, MAC_SEC_OFF, false); key_id_lookup_descr = gen_mac_key_id_lookup_descr_t(KEY_LOOKUP_SIZE_NINE); memcpy(key_id_lookup_descr.data, key_lookup_data, KEY_LOOKUP_SIZE_NINE_VAL); key_device_descr = gen_mac_key_device_descr_t(0, false, false); key_device_descr.table_service.idx = 0; device_descr = gen_mac_device_descr_t(pan_id, other_address, pan_external, 0, false); key_usage_descr = gen_mac_key_usage_descr_t(MAC_DATA, MAC_CMD_DATA_REQ); // build the key_descr-table: gen_mac_key_descr_t(&key_descr); mac_status_t ret1 = mac_table_item_set(&key_descr.id_lookup_list, &key_id_lookup_descr.table_service, MAC_KEY_ID_LOOKUP_LIST, 0); mac_status_t ret2 = mac_table_item_set(&key_descr.key_device_list, &key_device_descr.table_service, MAC_KEY_DEVICE_LIST, 0); mac_status_t ret3 = mac_table_item_set(&key_descr.key_usage_list, &key_usage_descr.table_service, MAC_KEY_USAGE_LIST, 0); SEGGER_RTT_printf(0, "\n"); memcpy(key_descr.key, key, MAC_SECURITY_KEY_SIZE); // channel_id=16u; repeat: // scan channel while(true) {//change { // NVIC_EnableIRQ( RADIO_IRQn ); SEGGER_RTT_printf(0, "\n\nstarting the scan\n"); stat=print_scan_conf_rx(scan_req(ACTIVE_SCAN,channel_id,scan_dur));// scan duration formula=[aBaseSuperframeDuration * (2^n + 1)] SEGGER_RTT_printf(0, "Stat: %d\n",stat); SEGGER_RTT_printf(0, "channel: %u\n",channel_id); SEGGER_RTT_printf(0, "finished the scan\n"); // NVIC_DisableIRQ( RADIO_IRQn ); __DSB(); if(stat) break; else if (sdu_length>=18) goto subrepeat; else { // NVIC_DisableIRQ( RADIO_IRQn ); // __DSB(); timer2init(no_beacon_sleep); //send system to sleep mode if beacon is not detected __SEV(); //sleep __WFE(); //mode __WFE(); //called scan_dur=-5; //scan channel for 77ms if scan_dur=2 } } } //NVIC_EnableIRQ( RADIO_IRQn ); { { mac_status_t state = mlme_set(gen_pib_id_t(MAC_PAN_ID), 0, &pan_id); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t(MAC_PAN_ID), "MAC_PAN_ID"); } { mac_status_t state = mlme_set( gen_pib_id_t(MAC_PAN_COORD_EXTENDED_ADDRESS), 0, &pan_external); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t(MAC_PAN_COORD_EXTENDED_ADDRESS), "MAC_PAN_COORD_EXTENDED_ADDRESS"); } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_PROMISCUOUS_MODE), 0, &promiscuous_mode); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t(MAC_PROMISCUOUS_MODE), "MAC_PROMISCOUS_MODE"); } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_RX_ON_WHEN_IDLE), 0, &rx_on_when_idle); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t(MAC_RX_ON_WHEN_IDLE), "MAC_RX_ON_WHEN_IDLE"); } { mac_status_t state = mlme_set(gen_pib_id_t_plme(PHY_CURRENT_CHANNEL_ID), 0, &channel_id); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t_plme(PHY_CURRENT_CHANNEL_ID), "PHY_CURRENT_CHANNEL_ID"); } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_KEY_TABLE), 0, &key_descr); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_DEVICE_TABLE), 0, &device_descr); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_SECURITY_LEVEL_TABLE), 0, &sec_level_descr); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_DEFAULT_KEY_SOURCE), 0, &default_source); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_AUTO_REQUEST_SECURITY_LEVEL), 0, &auto_request_security_level); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ } { mac_status_t state = mlme_set(gen_pib_id_t(MAC_SECURITY_ENABLED), 0, &security_enabled); /* if (state != MAC_SUCCESS) { SEGGER_RTT_printf(0, "failure in pib-set request: "); print_mac_status(state); SEGGER_RTT_printf(0, "\n"); } */ pib_get_request(gen_pib_id_t(MAC_SECURITY_ENABLED), "MAC_SECURITY_ENABLED"); } // received data mcps_data_ind_t* _ind; mcps_data_ind(_ind); //change subrepeat: while (true) { sys_task_run(); //send system to sleep mode if sdu_length is detected if((sdu_length>=18))// && (k>=3)) { //NVIC_DisableIRQ( RADIO_IRQn ); //__DSB(); timer2init(beacon_sleep); __SEV(); __WFE(); __WFE(); sdu_length=0; scan_dur=-5; goto repeat; //go back to scanning the network } } } } //tx //uint32_t asn = 0; uint8_t asn_f[4],time_sync_f[8]; uint8_t ch_offsetsel[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; // ChannelOffset uint8_t beacon_payload[8]; uint64_t current_time=0,pervious_time=0; uint32_t time_sync; static uint8_t beacon_payload_length = sizeof(beacon_payload); static const uint8_t ext_addr[] = {0xcau, 0xfeu, 0xbeu, 0xefu, 0x00u, 0x00u, 0xffu, 0xffu}; int i=0,w=0; uint8_t hop_sequence[]= {16,17,23,18,26,15,25,22,19,11,12,13,24,14,20,21}; //channels hop sequence is given by kaumudi singh uint8_t ch_offset_tx = 0; uint8_t ch_select; void tx_main() { static uint8_t mac_association_permit = true; static uint8_t mac_gts_permit = false; static uint8_t rx_on_when_idle = true; static uint16_t ext_addr_only = MAC_EXTENDED_ADDRESS_ONLY; pib_set_get_request(gen_pib_id_t(MAC_EXTENDED_ADDRESS), (void *)ext_addr); pib_set_get_request(gen_pib_id_t(MAC_SHORT_ADDRESS), &ext_addr_only); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD_LENGTH), &beacon_payload_length); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD), (void*)beacon_payload); pib_set_get_request(gen_pib_id_t(MAC_RX_ON_WHEN_IDLE), &rx_on_when_idle); pib_set_get_request(gen_pib_id_t(MAC_ASSOCIATION_PERMIT), &mac_association_permit); pib_get_request_tx(gen_pib_id_t(MAC_GTS_PERMIT)); pib_set_get_request(gen_pib_id_t(MAC_GTS_PERMIT), &mac_gts_permit); #define BEACON_ORDER 0x9u // beacon interval = 7.68 sec #define SUPERFRAME_ORDER 0x0u // start superframe structure static mlme_start_req_t start_req = { .pan_id = 0x1111, .logical_channel = 11, .start_time = 0x000000, .beacon_order = BEACON_ORDER, .superframe_order = SUPERFRAME_ORDER, .pan_coordinator = true, .battery_life_extension = false, .coord_realignment = false, #if (CONFIG_SECURE == 1) .coord_realign_security_level = false, .beacon_security_level = false, #endif }; callback_called = false; mlme_start_req(&start_req, start_callback); while (!callback_called) { sys_task_run(); } SEGGER_RTT_printf(0, "Sent the Start-Request: "); print_mac_status(start_req.confirm.status); SEGGER_RTT_printf(0, "\n"); SEGGER_RTT_printf(0, " Channel : %u\n",start_req.logical_channel); SEGGER_RTT_printf(0,"Time :%u\n",sys_time_get()); while(true) { SEGGER_RTT_printf(0, "cho: %d\n",ch_offset_tx); for (i=0;;i++) { //channel = (ASN + ChannelOffset) % N , ASN-Absolute Slot Number,N-number of channels ch_select = ((asn+ch_offset_tx)%(16)); start_req.logical_channel = hop_sequence[ch_select]; callback_called = false; mlme_start_req(&start_req, start_callback); while (!callback_called) { sys_task_run(); } // nrf_delay_us(7864324); SEGGER_RTT_printf(0, "Sent the Start-Request: "); print_mac_status(start_req.confirm.status); SEGGER_RTT_printf(0, "\n"); if(i==0) { SEGGER_RTT_printf(0, "i=%d",i); asn=asn+202; } else{ SEGGER_RTT_printf(0, "i=%d",i); asn=asn+505; } asn_f[0]=((asn >> 24 ) & 0xFF); asn_f[1]=((asn >> 16 ) & 0xFF); asn_f[2]=((asn >> 8 ) & 0xFF); asn_f[3]=((asn ) & 0xFF); SEGGER_RTT_printf(0, " Channel : %u\n",start_req.logical_channel); printf("channel_select %u , asn %u , channel offset %u\n",ch_select,asn,ch_offset); // printf("asn_f = %x%x%x%x\n",asn_f[0],asn_f[1],asn_f[2],asn_f[3]); current_time=sys_time_get(); time_sync=current_time-pervious_time; SEGGER_RTT_printf(0,"Time_sy :%u\n",time_sync); pervious_time=current_time; SEGGER_RTT_printf(0, "\n"); time_sync_f[0]=((time_sync >> 24) & 0xFF); time_sync_f[1]=((time_sync >> 16) & 0xFF); time_sync_f[2]=((time_sync >> 8) & 0xFF); time_sync_f[3]=((time_sync) & 0xFF); beacon_payload[0] =asn_f[0]; beacon_payload[1] =asn_f[1]; beacon_payload[2] =asn_f[2]; beacon_payload[3] =asn_f[3]; beacon_payload[4] =time_sync_f[0]; beacon_payload[5] =time_sync_f[1]; beacon_payload[6] =time_sync_f[2]; beacon_payload[7] =time_sync_f[3]; pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD_LENGTH), &beacon_payload_length); pib_set_get_request(gen_pib_id_t(MAC_BEACON_PAYLOAD), (void*)beacon_payload); } } while(true) { sys_task_run(); } } void print_data_ind(const mcps_data_ind_t* ind) { SEGGER_RTT_printf(0, "{src_pan_id: 0x%04x, ", ind->src_pan_id); print_addr(&(ind->src_addr), ind->src_addr_mode, "src_addr"); SEGGER_RTT_printf(0, ", dst_pan_id: 0x%04x, ", ind->dst_pan_id); print_addr(&(ind->dst_addr), ind->dst_addr_mode, "dst_addr"); SEGGER_RTT_printf(0, ", msdu_length: %u, sdu: 0x", ind->msdu_length); sdu_length=ind->msdu_length; for (size_t i = 0u; i < ind->msdu_length; i++) { SEGGER_RTT_printf(0, "%02x", ind->msdu.p_payload[i]); } for(z=0;z<12;z++) { sdu_data[z]=ind->msdu.p_payload[z+17]; } SEGGER_RTT_printf(0, ", mpdu_link_quality: %u", ind->mpdu_link_quality); SEGGER_RTT_printf(0, ", dsn: %u", ind->dsn); SEGGER_RTT_printf(0, ", timestamp: %u}\n", ind->timestamp); SEGGER_RTT_printf(0, "\n"); SEGGER_RTT_printf(0, "Time: %u ",sys_time_get()); SEGGER_RTT_printf(0,"sud_data: %x%x%x%x\n",sdu_data[0],sdu_data[1],sdu_data[2],sdu_data[3]); sdu_data_dec=sdu_data[3]; sdu_data_dec=sdu_data_dec | (sdu_data[2] <<8); sdu_data_dec=sdu_data_dec | (sdu_data[1] <<16); sdu_data_dec=sdu_data_dec | (sdu_data[0] <<24); SEGGER_RTT_printf(0,"sud_data in dec: %d\n",sdu_data_dec); memset(ind->msdu.p_payload, 0, sizeof(ind->msdu.p_payload)); //Clearing the recieved data from the msdu.p_payload SEGGER_RTT_printf(0,"sdu: %02x", ind->msdu.p_payload); SEGGER_RTT_printf(0, "\t k: %d ",k); SEGGER_RTT_printf(0, "\n"); nrf_gpio_pin_toggle(LED_3); k+=1; //Everytime a frame is received, value is incremented. if(k>=1 | k<4) { asn=sdu_data_dec+505; channel_id=((asn+ch_offset)%16); channel_id= channel_hop_seq[channel_id]; // channel_id = channel_hop_seq[rand()%sizeof(channel_hop_seq)]; no_beacon_sleep=7800000; } // for restarting board when RAM is full if(k>=4) { // NRF_TIMER2->TASKS_STOP=1; SEGGER_RTT_printf(0, "in tx\n"); nrf_delay_us(7864324); tx_main(); } } void mcps_data_ind(mcps_data_ind_t* _ind) { // SEGGER_RTT_printf(0, "Received Data: \n"); print_data_ind(_ind); } int main(void) { ral_irq_handler_import(); SEGGER_RTT_Init(); uint8_t rtt_buf_out[1024u]; SEGGER_RTT_ConfigUpBuffer(0, "OUT", rtt_buf_out, 1024u, SEGGER_RTT_MODE_NO_BLOCK_TRIM); app_task_init(); sys_task_post(APP_TASK_ID); clock_init(); SEGGER_RTT_printf(0, "....RESET....\n"); #if (CONFIG_SECURE == 1) SEGGER_RTT_printf(0, "Compiled with CONFIG_SECURE\n"); #endif recieving_handle(); tx_main(); SEGGER_RTT_printf(0, "out of first reciever handle \n"); while(true) { sys_task_run(); } } //change //Timer 2 interrupt function void TIMER2_IRQHandler(void) { if (NRF_TIMER2->EVENTS_COMPARE[0] == 1) { // SEGGER_RTT_printf(0, "in interrupt 2\n"); //NVIC_EnableIRQ( RADIO_IRQn ); //Enable radio interrupt to start receiving data again // SEGGER_RTT_printf(0, "Time: %u ",sys_time_get()); NRF_TIMER2->EVENTS_COMPARE[0] = 0; } } /*void TIMER3_IRQHandler(void) { if (NRF_TIMER3->EVENTS_COMPARE[0] == 1) { SEGGER_RTT_printf(0, "in interrupt 3\n"); NVIC_EnableIRQ( RADIO_IRQn ); NRF_TIMER3->EVENTS_COMPARE[0] = 0; } } */
The experiment setup as follows:
- The TX will be transmitting the packets for every 7.8 Sec. This is an continues process.( TX code)
- The RX will be in scan mode, once the packet is received the RX follows the TX for 3 channel hops ( TX and RX code). Then the TX part comes and transmit the packets for 7.8 Sec, this part is giving as issue. The line of code which gives error is mlme_start_req(&start_req, start_callback) which is uesd in for loop in TX code.
Any solution to solve the problem.
Thanks in Advance