I modified the code of ant_background_scanning_s212_pca10040 to make it works with s310 on nRF5144 xxaa.
The code works fine, but loose a lot of RX packets (more than 80%).
In the figure the packets received by AntWare and the packets received by the custom board.
I already implemented the same code on nRF5144 xxaa, but with s210 and the missed RX packets were very less.
This is my code:
#include "softdevice_handler.h"
#include "ant_stack_config.h"
#include "ant_channel_config.h"
#include "ant_search_config.h"
#include "ant_interface.h"
#include "ant_parameters.h"
#define ANT_MS_CHANNEL_NUMBER ((uint8_t) 1) /**< Master channel. */
#define ANT_BS_CHANNEL_NUMBER ((uint8_t) 0) /**< Background scanning channel. */
#define ANT_NETWORK_NUMBER ((uint8_t) 0) /**< Default public network number. */
#define ANT_MS_CHANNEL_TYPE CHANNEL_TYPE_MASTER /**< Bi-directional master. */
#define ANT_BS_CHANNEL_TYPE CHANNEL_TYPE_SLAVE /**< Bi-directional slave. */
#define ANT_BS_DEVICE_NUMBER ((uint16_t) 2) /**< Wild-card. */
#define ANT_DEVICE_TYPE ((uint8_t) 2) /**< Device type. */
#define ANT_TRANSMISSION_TYPE ((uint8_t) 2) /**< Transmission type. */
#define ANT_FREQUENCY ((uint8_t) 66) /**< 2466 MHz. */
#define ANT_CHANNEL_PERIOD ((uint16_t) 65535) /**< 0,5 Hz. */
#define ANT_CHANNEL_PERIOD_NONE ((uint16_t) 0x00) /**< This is not taken into account. */
#define ANT_BEACON_PAGE ((uint8_t) 1)
void ant_message_send(void);
void background_scanner_process(ant_evt_t * p_ant_evt);
void master_beacon_process(ant_evt_t * p_ant_evt);
static uint8_t m_last_rssi = 0;
static uint16_t m_last_device_id = 0;
static uint8_t m_recieved = 0;
/**< Derive from device serial number. */
static uint16_t ant_ms_dev_num_get(void)
{
return ((uint16_t) (NRF_FICR->DEVICEID[0]));
}
void ant_evt_dispatch(ant_evt_t * p_ant_evt)
{
switch (p_ant_evt->channel)
{
case ANT_BS_CHANNEL_NUMBER:
background_scanner_process(p_ant_evt);
break;
case ANT_MS_CHANNEL_NUMBER:
master_beacon_process(p_ant_evt);
break;
default:
break;
}
}
int main(void)
{
DBG_init();
LED_init();
///////////////////////////////////////////// ANT ///////////////////////////////////////////////
uint32_t err_code;
err_code = softdevice_ant_evt_handler_set(ant_evt_dispatch);
APP_ERROR_CHECK(err_code);
err_code = softdevice_handler_init(NRF_CLOCK_LFCLKSRC_XTAL_50_PPM, NULL, 0, NULL);
APP_ERROR_CHECK(err_code);
err_code = ant_stack_static_config();
APP_ERROR_CHECK(err_code);
/* Set library config to report RSSI and Device ID */
err_code = sd_ant_lib_config_set(ANT_LIB_CONFIG_MESG_OUT_INC_RSSI
| ANT_LIB_CONFIG_MESG_OUT_INC_DEVICE_ID);
APP_ERROR_CHECK(err_code);
const uint16_t dev_num = ant_ms_dev_num_get();
const ant_channel_config_t ms_channel_config =
{
.channel_number = ANT_MS_CHANNEL_NUMBER,
.channel_type = ANT_MS_CHANNEL_TYPE,
.ext_assign = 0x00,
.rf_freq = ANT_FREQUENCY,
.transmission_type = ANT_TRANSMISSION_TYPE,
.device_type = ANT_DEVICE_TYPE,
.device_number = dev_num,
.channel_period = ANT_CHANNEL_PERIOD,
.network_number = ANT_NETWORK_NUMBER,
};
const ant_channel_config_t bs_channel_config =
{
.channel_number = ANT_BS_CHANNEL_NUMBER,
.channel_type = ANT_BS_CHANNEL_TYPE,
.ext_assign = EXT_PARAM_ALWAYS_SEARCH,
.rf_freq = ANT_FREQUENCY,
.transmission_type = ANT_TRANSMISSION_TYPE,
.device_type = ANT_DEVICE_TYPE,
.device_number = ANT_BS_DEVICE_NUMBER,
.channel_period = ANT_CHANNEL_PERIOD_NONE,
.network_number = ANT_NETWORK_NUMBER,
};
const ant_search_config_t bs_search_config =
{
.channel_number = ANT_BS_CHANNEL_NUMBER,
.low_priority_timeout = ANT_LOW_PRIORITY_TIMEOUT_DISABLE,
.high_priority_timeout = ANT_HIGH_PRIORITY_SEARCH_DISABLE,
.search_sharing_cycles = ANT_SEARCH_SHARING_CYCLES_DISABLE,
.search_priority = ANT_SEARCH_PRIORITY_DEFAULT,
.waveform = ANT_WAVEFORM_DEFAULT,
};
err_code = ant_channel_init(&ms_channel_config);
APP_ERROR_CHECK(err_code);
err_code = ant_channel_init(&bs_channel_config);
APP_ERROR_CHECK(err_code);
err_code = ant_search_init(&bs_search_config);
APP_ERROR_CHECK(err_code);
// Fill tx buffer for the first frame
ant_message_send();
err_code = sd_ant_channel_open(ANT_MS_CHANNEL_NUMBER);
APP_ERROR_CHECK(err_code);
err_code = sd_ant_channel_open(ANT_BS_CHANNEL_NUMBER);
APP_ERROR_CHECK(err_code);
///////////////////////////////////////////// ANT ///////////////////////////////////////////////
// Main Loop
while(1)
{
sd_app_evt_wait();
}
}
void background_scanner_process(ant_evt_t * p_ant_evt)
{
uint32_t err_code;
ANT_MESSAGE * p_ant_message = (ANT_MESSAGE*)p_ant_evt->evt_buffer;
switch(p_ant_evt->event)
{
case EVENT_RX:
{
LED_redLed_setStatus(LED_ON);
if(p_ant_message->ANT_MESSAGE_stExtMesgBF.bANTDeviceID)
{
m_last_device_id = uint16_decode(p_ant_message->ANT_MESSAGE_aucExtData);
}
if(p_ant_message->ANT_MESSAGE_stExtMesgBF.bANTRssi)
{
m_last_rssi = p_ant_message->ANT_MESSAGE_aucExtData[5];
}
DBG_log("Message number %d\n\r", m_recieved);
DBG_log("Device ID: %d\n\r", m_last_device_id);
DBG_log("RSSI: %d\n\r\n\r", m_last_rssi);
m_recieved++;
LED_redLed_setStatus(LED_OFF);
break;
}
default:
{
break;
}
}
}
void ant_message_send()
{
uint32_t err_code;
uint8_t tx_buffer[ANT_STANDARD_DATA_PAYLOAD_SIZE];
static uint8_t counter = 0;
tx_buffer[0] = ANT_BEACON_PAGE;
tx_buffer[1] = m_last_rssi;
tx_buffer[2] = (uint8_t) m_last_device_id; // LSB
tx_buffer[3] = (uint8_t) (m_last_device_id >> 8); // MSB
tx_buffer[6] = counter++;
tx_buffer[7] = m_recieved;
err_code = sd_ant_broadcast_message_tx(ANT_MS_CHANNEL_NUMBER,
ANT_STANDARD_DATA_PAYLOAD_SIZE,
tx_buffer);
APP_ERROR_CHECK(err_code);
}
void master_beacon_process(ant_evt_t * p_ant_evt)
{
switch(p_ant_evt->event)
{
case EVENT_TX:
ant_message_send();
break;
default:
break;
}
}
There are some things I didn't consider?
Has someone advices for me?
I saw that if I dont' set the background scanning I don't have lost packets. There's no way to set background scanning and don't miss packets, is there?
Thanks