When one host and one device,the through can be 16KBps。But,when one host and two device ,the Max throughput is only 6KBps。Can you tell me Why ?????And Can you tell me the Max throughput you test??
When one host and one device,the through can be 16KBps。But,when one host and two device ,the Max throughput is only 6KBps。Can you tell me Why ?????And Can you tell me the Max throughput you test??
Hi Davy,
Tests from our developers showed the max throughput (with only one device) can get up to 213kbps. We need to see your timeslot and channel configuration to find why you only get 128kbps.
When you have 2 devices, there are chances that the 2 devices transmit at the same timeslot and interfere. You may want to define different channels for each of them, so they won't collide.
Hi Davy,
Tests from our developers showed the max throughput (with only one device) can get up to 213kbps. We need to see your timeslot and channel configuration to find why you only get 128kbps.
When you have 2 devices, there are chances that the 2 devices transmit at the same timeslot and interfere. You may want to define different channels for each of them, so they won't collide.
I use the 1Mbps and the timeslot is 600us.The channel configuration is default configuration({4, 25, 42, 63, 77}). And I also try to configuration the channel table{4, 16, 25, 42, 63, 77},it doesnot matter.
And the most concerned thing is that 2 devices,I cannot get the higg through.Even though i use the same channel table for the host and the devices,it have no effect.I find the timeslot must be 3ms,the host and devices would work. The host is as:
nrf_gzll_set_datarate(NRF_GZLL_DATARATE_1MBIT);
nrf_gzll_set_timeslot_period(3000);
nrf_gzll_set_sync_lifetime(40);
nrf_gzll_set_channel_table((void *)&Test_chanel_table[0],NRF_GZLL_TEST_CHANNEL_TABLE_SIZE);
nrf_gzll_set_timeslots_per_channel(2);
nrf_gzll_set_device_channel_selection_policy(NRF_GZLL_DEVICE_CHANNEL_SELECTION_POLICY_USE_CURRENT);
the device is as: nrf_gzll_set_datarate(NRF_GZLL_DATARATE_1MBIT);
nrf_gzll_set_timeslot_period(3000);
nrf_gzll_set_sync_lifetime(40);
nrf_gzll_set_channel_table((void *)&Test_chanel_table[0],NRF_GZLL_TEST_CHANNEL_TABLE_SIZE);
nrf_gzll_set_timeslots_per_channel(2);
nrf_gzll_set_device_channel_selection_policy(NRF_GZLL_DEVICE_CHANNEL_SELECTION_POLICY_USE_CURRENT);
Ps: I use the pipe is : 0 and 1. Can you tell me how can i promote my throughput?Thank you!!
Hi Davy,
If you check the documentation you can find that if you use NRF_GZLL_DATARATE_1MBIT you should use timeslot period >=900us. Leaving the timeslot at 600us let it not enough time for ACK if the packet is max payload size.
What we suggested earlier about avoiding collision is to use different channel hopping table on each of the device. The host will have all the channels that the devices use. For example the channel table on the host can be {4, 16, 25, 42, 63, 77} and on the device 1 you use {4, 25, 63} and on device 2 you use {16, 42, 77} this way the 2 won't collide. But you will have lower throughput when only one device is active compare to the max speed you can achieve. Of course you can implement a switch, so that when the host detects that there are 2 device in-sync, it can tell the device to switch to the half channel table set-up and switch back to the full channel table when there is only one device connect.
I tried your suggestion before. I set the host timeslot 1800 and the device timeslot 900 when the host has full channel table and device has half channel table. But I found they doesnot work.I think whether we have some wrong setting about the timeslot. Ps: Do you have some example about that i can refer to?? Thank you!!
I don't understand why you use timeslot period on the host = 2 * timeslot on the device. It should be the opposite. The time between 2 packet on the device should be double the number on the host so that we can skip those channels that we don't configure.
Here is the code I used in my test, it work pretty well: On the host:
static uint8_t channel_table[6]={4, 25, 42, 63, 77,33};
// Initialize Gazell.
bool result_value = nrf_gzll_init(NRF_GZLL_MODE_HOST);
GAZELLE_ERROR_CODE_CHECK(result_value);
result_value = nrf_gzll_set_channel_table(channel_table,6);
GAZELLE_ERROR_CODE_CHECK(result_value);
On device one:
static uint8_t channel_table[5]={4,42, 77};
// Initialize Gazell.
bool result_value = nrf_gzll_init(NRF_GZLL_MODE_DEVICE);
GAZELLE_ERROR_CODE_CHECK(result_value);
// Attempt sending every packet up to MAX_TX_ATTEMPTS times.
result_value = nrf_gzll_set_max_tx_attempts(MAX_TX_ATTEMPTS);
GAZELLE_ERROR_CODE_CHECK(result_value);
result_value = nrf_gzll_set_timeslots_per_channel(4);
GAZELLE_ERROR_CODE_CHECK(result_value);
result_value = nrf_gzll_set_channel_table(channel_table,3);
GAZELLE_ERROR_CODE_CHECK(result_value);
On device two:
static uint8_t channel_table[5]={25,63, 33};
// Initialize Gazell.
bool result_value = nrf_gzll_init(NRF_GZLL_MODE_DEVICE);
GAZELLE_ERROR_CODE_CHECK(result_value);
// Attempt sending every packet up to MAX_TX_ATTEMPTS times.
result_value = nrf_gzll_set_max_tx_attempts(MAX_TX_ATTEMPTS);
GAZELLE_ERROR_CODE_CHECK(result_value);
result_value = nrf_gzll_set_timeslots_per_channel(4);
GAZELLE_ERROR_CODE_CHECK(result_value);
result_value = nrf_gzll_set_channel_table(channel_table,3);
GAZELLE_ERROR_CODE_CHECK(result_value);
Make sure if you use timeslot period = 600 you need to use 2Mbps.
Can you tell me your timeslot?I testd and found the max timest is 1200us when I used 2 device. Thank you!!