Dear Nordic Semiconductor support team.
I tried to make my nrf51822 DK to talk to Micro:bit by using Gazell library. ( from nRF5_SDK_12.3.0_d7731ad\examples\proprietary_rf\gzll\gzll_ack_payload\host)
I've read your support using micro:bit with nrf52832 by RADIO in the past as follows.
So I rewrite a simple function base on your code, hoping to receive wireless data from Microbit. And insert the breakpoint in nrf_gzll_host_rx_data_ready() function. Use the MDK 5.20 and Jlink V9
#include "nrf_gzll.h" #include "bsp.h" #include "app_timer.h" #include "app_error.h" #include "nrf_gzll_error.h" #define NRF_LOG_MODULE_NAME "APP" #include "nrf_log.h" #include "nrf_log_ctrl.h" /*****************************************************************************/ /** @name Configuration */ /*****************************************************************************/ #define PIPE_NUMBER 0 ///< Pipe 0 is used in this example. #define TX_PAYLOAD_LENGTH 1 ///< 1-byte payload length is used when transmitting. #define APP_TIMER_PRESCALER 0 ///< Value of the RTC PRESCALER register. #define APP_TIMER_OP_QUEUE_SIZE 8u ///< Size of timer operation queues. #define MICROBIT_RADIO_MAX_PACKET_SIZE 32 static uint8_t m_data_payload[NRF_GZLL_CONST_MAX_PAYLOAD_LENGTH]; ///< Placeholder for data payload received from host. static uint8_t m_ack_payload[TX_PAYLOAD_LENGTH]; ///< Payload to attach to ACK sent to device. extern nrf_gzll_error_code_t nrf_gzll_error_code; ///< Error code. /** * @brief Initialize the BSP modules. */ static void ui_init(void) { // Initialize application timer. APP_TIMER_INIT(APP_TIMER_PRESCALER, APP_TIMER_OP_QUEUE_SIZE, NULL); // BSP initialization. uint32_t err_code = bsp_init(BSP_INIT_LED | BSP_INIT_BUTTONS, APP_TIMER_TICKS(100, APP_TIMER_PRESCALER), NULL); APP_ERROR_CHECK(err_code); // Set up logger. err_code = NRF_LOG_INIT(NULL); APP_ERROR_CHECK(err_code); NRF_LOG_INFO("Gazell ACK payload example. Host mode.\r\n"); NRF_LOG_FLUSH(); } /*****************************************************************************/ /** @name Gazell callback function definitions. */ /*****************************************************************************/ /** * @brief RX data ready callback. * * @details If a data packet was received, the first byte is written to LEDS. */ void nrf_gzll_host_rx_data_ready(uint32_t pipe, nrf_gzll_host_rx_info_t rx_info) { uint32_t data_payload_length = NRF_GZLL_CONST_MAX_PAYLOAD_LENGTH; // Pop packet and write first byte of the payload to the GPIO port. bool result_value = nrf_gzll_fetch_packet_from_rx_fifo(pipe, m_data_payload, &data_payload_length); if (!result_value)// I Insert the breakpoint here. { NRF_LOG_ERROR("RX fifo error \r\n"); NRF_LOG_FLUSH(); } m_ack_payload[0] = 0xFD; result_value = nrf_gzll_add_packet_to_tx_fifo(pipe, m_ack_payload, TX_PAYLOAD_LENGTH); if (!result_value) { NRF_LOG_ERROR("TX fifo error \r\n"); NRF_LOG_FLUSH(); } } /** * @brief Gazelle callback. * @warning Required for successful Gazell initialization. */ void nrf_gzll_device_tx_success(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info) { } /** * @brief Gazelle callback. * @warning Required for successful Gazell initialization. */ void nrf_gzll_device_tx_failed(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info) { } /** * @brief Gazelle callback. * @warning Required for successful Gazell initialization. */ void nrf_gzll_disabled() { } #define NRF_GZLL_TEST_CHANNEL_TABLE_SIZE 1 #define MICROBIT_RADIO_BASE_ADDRESS 0x75626974 static uint8_t Test_chanel_table[] = {7}; static uint32_t swap_bits(uint32_t inp) { uint32_t i; uint32_t retval = 0; inp = (inp & 0x000000FFUL); for (i = 0; i < 8; i++) { retval |= ((inp >> i) & 0x01) << (7 - i); } return retval; } static uint32_t bytewise_bitswap(uint32_t inp) { return (swap_bits(inp >> 24) << 24) | (swap_bits(inp >> 16) << 16) | (swap_bits(inp >> 8) << 8) | (swap_bits(inp)); } /*****************************************************************************/ /** * @brief Main function. * @return ANSI required int return type. */ /*****************************************************************************/ int main() { // Set up the user interface. ui_init(); // Initialize Gazell. nrf_gzll_init(NRF_GZLL_MODE_HOST); // Load data into TX queue. m_ack_payload[0] = 0xFD;//I have no idea what that data for... nrf_gzll_add_packet_to_tx_fifo(PIPE_NUMBER, m_data_payload, TX_PAYLOAD_LENGTH); //Edit //by Bob nrf_gzll_set_channel_table(Test_chanel_table,NRF_GZLL_TEST_CHANNEL_TABLE_SIZE); nrf_gzll_set_base_address_0(bytewise_bitswap(0x74696275)); nrf_gzll_set_address_prefix_byte(0, 0);// pipe, address_prefix_byte nrf_gzll_set_datarate(NRF_GZLL_DATARATE_1MBIT); // Enable Gazell to start sending over the air. nrf_gzll_enable(); NRF_RADIO->PCNF0 = 0x00000008; NRF_RADIO->PCNF1 = 0x02040000 | MICROBIT_RADIO_MAX_PACKET_SIZE; NRF_RADIO->DATAWHITEIV = 0x18; while (1) { __WFE(); } }
The code can run, but never receive any data from MicroBit, cause the breakpoint has not been triggered.
MicroBit code:
radio.setGroup(0) basic.forever(function () { radio.sendNumber(1) basic.pause(100) })
Thanks.