Hi,
Im not sure if im doing something wrong or what, but i've been hitting a wall when trying to use the radio example transmitter and receiver.
No matter what i send on the transmitter, the receiver always prints out 0. Here's the code that im using:
Transmitter:
#include <nrf52_radio.h> nrf52 radio; void setup() { #ifdef DEBUG Serial.begin(115200); #endif // SETUP RADIO radio.init(); } void loop() { radio.write(123); }
Receiver:
#include <stdint.h> #include <stdbool.h> #include <stdio.h> #include <nrf52_radio.h> nrf52 radio; void setup() { Serial.begin(115200); radio.init(); } void loop() { Serial.print("Received packet "); uint32_t received = radio.read(); Serial.print("Received packet "); Serial.print(received); Serial.print(" "); Serial.print(received, HEX); Serial.print(" "); Serial.println(received, BIN); }
And here's the "library" i made:
#ifndef NRF52_RADIO_H #define NRF52_RADIO_H #include <stdint.h> #ifdef __cplusplus extern "C" { #endif #define PACKET_BASE_ADDRESS_LENGTH (4UL) //!< Packet base address length field size in bytes #define PACKET_STATIC_LENGTH (1UL) //!< Packet static length in bytes #define PACKET_PAYLOAD_MAXSIZE (PACKET_STATIC_LENGTH) //!< Packet payload maximum size in bytes class nrf52 { public: nrf52(); void init(); uint32_t read(); void write(uint32_t packet); private: uint32_t m_packet; }; #ifdef __cplusplus } #endif #endif
#include "nrf52_radio.h" #include "nrf.h" #include "Arduino.h" #define PACKET_S1_FIELD_SIZE (0UL) /**< Packet S1 field size in bits. */ #define PACKET_S0_FIELD_SIZE (0UL) /**< Packet S0 field size in bits. */ #define PACKET_LENGTH_FIELD_SIZE (0UL) /**< Packet length field size in bits. */ static uint32_t swap_bits(uint32_t inp); static uint32_t bytewise_bitswap(uint32_t inp); 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)); } nrf52::nrf52() {} void nrf52::init() { // Enable the High Frequency clock to the system as a whole NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; NRF_CLOCK->TASKS_HFCLKSTART = 1; /* Wait for the external oscillator to start up */ while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { } // Enables the DC/DC converter when the radio is enabled. Need this! NRF_POWER->DCDCEN = 0x00000001; // Radio config NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_0dBm << RADIO_TXPOWER_TXPOWER_Pos); NRF_RADIO->FREQUENCY = 7UL; // Frequency bin 7, 2407MHz NRF_RADIO->MODE = (RADIO_MODE_MODE_Nrf_1Mbit << RADIO_MODE_MODE_Pos); // Radio address config NRF_RADIO->PREFIX0 = ((uint32_t)swap_bits(0xC3) << 24) // Prefix byte of address 3 converted to nRF24L series format | ((uint32_t)swap_bits(0xC2) << 16) // Prefix byte of address 2 converted to nRF24L series format | ((uint32_t)swap_bits(0xC1) << 8) // Prefix byte of address 1 converted to nRF24L series format | ((uint32_t)swap_bits(0xC0) << 0); // Prefix byte of address 0 converted to nRF24L series format NRF_RADIO->PREFIX1 = ((uint32_t)swap_bits(0xC7) << 24) // Prefix byte of address 7 converted to nRF24L series format | ((uint32_t)swap_bits(0xC6) << 16) // Prefix byte of address 6 converted to nRF24L series format | ((uint32_t)swap_bits(0xC4) << 0); // Prefix byte of address 4 converted to nRF24L series format NRF_RADIO->BASE0 = bytewise_bitswap(0x01234567UL); // Base address for prefix 0 converted to nRF24L series format NRF_RADIO->BASE1 = bytewise_bitswap(0x89ABCDEFUL); // Base address for prefix 1-7 converted to nRF24L series format NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0 to use when transmitting NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use to select which addresses to receive // Packet configuration NRF_RADIO->PCNF0 = (PACKET_S1_FIELD_SIZE << RADIO_PCNF0_S1LEN_Pos) | (PACKET_S0_FIELD_SIZE << RADIO_PCNF0_S0LEN_Pos) | (PACKET_LENGTH_FIELD_SIZE << RADIO_PCNF0_LFLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0" // Packet configuration NRF_RADIO->PCNF1 = (RADIO_PCNF1_WHITEEN_Disabled << RADIO_PCNF1_WHITEEN_Pos) | (RADIO_PCNF1_ENDIAN_Big << RADIO_PCNF1_ENDIAN_Pos) | (PACKET_BASE_ADDRESS_LENGTH << RADIO_PCNF1_BALEN_Pos) | (PACKET_STATIC_LENGTH << RADIO_PCNF1_STATLEN_Pos) | (PACKET_PAYLOAD_MAXSIZE << RADIO_PCNF1_MAXLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0" // CRC Config NRF_RADIO->CRCCNF = (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos); // Number of checksum bits if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos)) { NRF_RADIO->CRCINIT = 0xFFFFUL; // Initial value NRF_RADIO->CRCPOLY = 0x11021UL; // CRC poly: x^16 + x^12^x^5 + 1 } else if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_One << RADIO_CRCCNF_LEN_Pos)) { NRF_RADIO->CRCINIT = 0xFFUL; // Initial value NRF_RADIO->CRCPOLY = 0x107UL; // CRC poly: x^8 + x^2^x^1 + 1 } } uint32_t nrf52::read() { NRF_RADIO->PACKETPTR = (uint32_t)m_packet; uint32_t result = 0; NRF_RADIO->EVENTS_READY = 0U; // Enable radio and wait for ready NRF_RADIO->TASKS_RXEN = 1U; while (NRF_RADIO->EVENTS_READY == 0U) { // wait } NRF_RADIO->EVENTS_END = 0U; // Start listening and wait for address received event NRF_RADIO->TASKS_START = 1U; // Wait for end of packet or buttons state changed while (NRF_RADIO->EVENTS_END == 0U) { // wait } if (NRF_RADIO->CRCSTATUS == 1U) { result = m_packet; } NRF_RADIO->EVENTS_DISABLED = 0U; // Disable radio NRF_RADIO->TASKS_DISABLE = 1U; while (NRF_RADIO->EVENTS_DISABLED == 0U) { // wait } return result; } void nrf52::write(uint32_t packet) { m_packet = packet; NRF_RADIO->PACKETPTR = (uint32_t)m_packet; // send the packet: NRF_RADIO->EVENTS_READY = 0U; NRF_RADIO->TASKS_TXEN = 1; while (NRF_RADIO->EVENTS_READY == 0U) { // wait } NRF_RADIO->EVENTS_END = 0U; NRF_RADIO->TASKS_START = 1U; while (NRF_RADIO->EVENTS_END == 0U) { // wait } NRF_RADIO->EVENTS_DISABLED = 0U; // Disable radio NRF_RADIO->TASKS_DISABLE = 1U; while (NRF_RADIO->EVENTS_DISABLED == 0U) { // wait } }