About esb_ptx_ble & esb_prx_ble.

Can I copy the ESB code from SDK v3.3.0-preview3 into SDK v2.9.0, and then get the functionality in esb_ptx_ble & esb_prx_ble?

 

Is there any way to achieve it quickly?

  • Hi,

    My device is battery powered and requires extremely low power consumption, so it will turn off RF. I changed the ts_dauration params. tx_rx_sequence of static void update_ts_duration_prams_for_tx (uint8_t payload_1ength), but it didn't have much effect, and the total time still hasn't changed. It seems that MPSL scheduling takes a lot of time.

    static void update_ts_duration_params_for_tx(uint8_t payload_length)
    {
    	const uint16_t margin = 100;
    	const uint16_t ramp_up =
    		esb_cfg.use_fast_ramp_up ? TX_FAST_RAMP_UP_TIME_US : TX_RAMP_UP_TIME_US;
    
    	ts_duration_params.tx_frame_duration = (ts_duration_params.frame_overhead + payload_length)
    					       << ts_duration_params.bitrate_shift;
    	// ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration +
    	// 				    wait_for_ack_timeout_us +
    	// 				    ts_duration_params.max_frame_duration + margin;
    	ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration + margin;
    }
    


    1. ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration +

                                                    margin;


    2. ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration +

                                                wait_for_ack_timeout_us +

                                                ts_duration_params.max_frame_duration + margin;

    int main(void)
    {
    	int err;
    
        LOG_INF("Build date: %s, build time: %s", __DATE__, __TIME__);
    	// LOG_INF("Starting Enhanced ShockBurst prx with Peripheral LBS sample");
    
    	err = dk_leds_init();
    	if (err) {
    		LOG_ERR("LEDs init failed (err %d)", err);
    		return 0;
    	}
    
    	// err = dk_buttons_init(button_changed);
    	// if (err) {
    	// 	LOG_ERR("Cannot init buttons (err: %d)", err);
    	// }
    
    	// err = bt_enable(NULL);
    	// if (err) {
    	// 	LOG_ERR("Bluetooth init failed (err %d)", err);
    	// 	return 0;
    	// }
    
    	// LOG_INF("Bluetooth initialized");
    
    	// err = bt_lbs_init(&lbs_callbacks);
    	// if (err) {
    	// 	LOG_ERR("Failed to init LBS (err:%d)", err);
    	// 	return 0;
    	// }
    
    	// k_work_init(&adv_work, adv_work_handler);
    	// advertising_start();
    
    	// err = esb_initialize();
    	// if (err) {
    	// 	LOG_ERR("ESB initialization failed, err %d", err);
    	// 	return 0;
    	// }
    
    	// LOG_INF("ESB initialized");
    
    	// err = esb_write_payload(&tx_payload);
    	// if (err) {
    	// 	LOG_ERR("Write payload, err %d", err);
    	// 	return 0;
    	// }
    
    	// LOG_INF("Setting up for packet reception");
    
    	// err = esb_start_rx();
    	// if (err) {
    	// 	LOG_ERR("RX setup failed, err %d", err);
    	// 	return 0;
    	// }
    #if APP_ESB_RX_MODE
        LOG_INF("Starting RX mode");
        k_work_schedule(&rx_work, K_MSEC(1000 + sys_rand32_get() % 3000));
        while (1) {
            struct esb_payload rx_payload;
            k_msgq_get(&rx_msgq, &rx_payload, K_FOREVER);
            if (rx_payload.length) {
                // Process the received payload
                static uint8_t target_buf[3] = { 0x6e, 0x26, 0xb1 };
                if (memcmp(rx_payload.data, target_buf, sizeof(target_buf))) {
                    continue;
                }
                static uint32_t rx_count = 0, last_uptime = 0;
                static uint16_t last_seq_num = 0x8000, missed_count = 0, seq_count = 0;
                uint16_t new_seq_num = rx_payload.data[6] | (rx_payload.data[5] << 8);
                uint32_t uptime = k_uptime_seconds();
                rx_count++;
                if(new_seq_num  - last_seq_num > 1 && last_seq_num != 0x8000) {
                    missed_count += new_seq_num - last_seq_num - 1;
                    LOG_WRN("Missed %d packets, total missed %d", new_seq_num - last_seq_num - 1, missed_count);
                    LOG_HEXDUMP_WRN(rx_payload.data, rx_payload.length, "New packet data");
                }
                if(new_seq_num == last_seq_num || last_seq_num == 0x8000) {
                    seq_count++;
                } else {
                    seq_count = 1;
                }
    
                LOG_INF("T:%u, RX %u, seq 0x%04x, count %u, missed %u", uptime, rx_count, new_seq_num, seq_count, missed_count);
                last_seq_num = new_seq_num;
    
                // static bool last_led_state = false;
                // if (uptime - last_uptime > 2) {
                //     dk_set_led(DK_LED1, last_led_state);
                //     last_led_state = !last_led_state;
                //     last_uptime = uptime;
                // }
            }
        }
    #elif 1
        LOG_INF("Starting TX mode");
        k_sleep(K_MSEC(1000));
        tx_payload.noack = true;
        tx_payload.length = 8;
        uint32_t last_tx_time = k_uptime_get_32();
        int tx_count = 0;
        uint16_t seq_num = 0x8000;
        while (1) {
            
    	    err = esb_initialize();
    	    if (err) {
    		    LOG_ERR("ESB initialization failed, err %d", err);
    		    return 0;
    	    }
            // LOG_INF("ESB initialized");
            
            // last_tx_time = k_uptime_get_32();
            // while (last_tx_time + 30 > k_uptime_get_32()) {
    
            //     if(!esb_tx_full())
            //        tx_count += !esb_write_payload(&tx_payload);
            // }
    
            tx_payload.length = 8;
            for (int i = 0; i < 3; i++) {
                   tx_count += !esb_write_payload(&tx_payload);
            }
            while (!esb_is_idle());
            esb_disable();
            seq_num++;
            tx_payload.data[6] = seq_num & 0xFF;
            tx_payload.data[5] = (seq_num >> 8) & 0x7F;
            // LOG_INF("TX %d packets in 30ms, %d packet per ms", tx_count, tx_count / 30);
            tx_count = 0;
    
            k_sleep(K_MSEC(1000));
        }
    #else
        while (1) {
            k_sleep(K_FOREVER);
        }    
    #endif
        return 0;
    }
    


    ESB_TX_3_Packets_8_bytes_tx_rx_sequence: ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration + margin;

    ESB_TX_3_Packets_8_bytes: 

    ts_duration_params.tx_rx_sequence = ramp_up + ts_duration_params.tx_frame_duration +

                                                wait_for_ack_timeout_us +

                                                ts_duration_params.max_frame_duration + margin;

    ESB_TX_3_Packets_8_bytes_tx_rx_sequence.ppk2

    ESB_TX_3_Packets_8_bytes.ppk2



Related