hi, all
I met a communication problem between nrf52832 and nrf24le1, I used nrf52832 as receiver and nrf24le1 as transmitter, but unfortunately,nrf52832 can not receive pkt from nrf24le1。my code are as follows: nrf52832:
static uint8_t sp_bits(uint8_t inp)
{
uint8_t i;
uint8_t retval = 0;
for (i = 0; i < 8; i++)
{
retval |= ((inp >> i) & 0x01) << (7 - i);
}
return retval;
}
static uint32_t sp_byte(uint32_t inp) {
uint8_t i, inp_byte;
uint32_t retval = 0;
for ( i = 0; i < 4; i++) {
inp_byte = (inp >> (i * 8));
inp_byte = sp_bits(inp_byte);
retval |= (inp_byte << (i * 8));
}
return retval;
}
void radio_config_init()
{
/* 0dbm */
NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_0dBm << RADIO_TXPOWER_TXPOWER_Pos);
/* 2400 */
NRF_RADIO->FREQUENCY = 0UL;
/* 250kbps */
NRF_RADIO->MODE = (RADIO_MODE_MODE_Nrf_250Kbit << RADIO_MODE_MODE_Pos);
// Radio address config
NRF_RADIO->PREFIX0 =
(sp_bits(0xC3) << 24) // Prefix byte of address 3 converted to nRF24L series format
| (sp_bits(0xC2) << 16) // Prefix byte of address 2 converted to nRF24L series format
| (sp_bits(0xC1) << 8) // Prefix byte of address 1 converted to nRF24L series format
| (sp_bits(0xE7) << 0); // Prefix byte of address 0 converted to nRF24L series format
NRF_RADIO->PREFIX1 =
(sp_bits(0xC7) << 24) // Prefix byte of address 7 converted to nRF24L series format
| (sp_bits(0xC6) << 16) // Prefix byte of address 6 converted to nRF24L series format
| (sp_bits(0xC4) << 0); // Prefix byte of address 4 converted to nRF24L series format
NRF_RADIO->BASE0 = sp_byte(0xE7E7E7E7UL); // Base address for prefix 0 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 = (0 << RADIO_PCNF0_S1LEN_Pos) |
(0 << RADIO_PCNF0_S0LEN_Pos) |
(0 << 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) |
(4 << RADIO_PCNF1_BALEN_Pos) |
(5 << RADIO_PCNF1_STATLEN_Pos) |
(5 << RADIO_PCNF1_MAXLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0"
// CRC Config
NRF_RADIO->CRCCNF = (RADIO_CRCCNF_LEN_One<< 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
}
}
static uint8_t rxbuffer[64];
int main(void) {
uint32_t err_code;
uint8_t i;
bsp_board_leds_init();
const app_uart_comm_params_t comm_params =
{
RX_PIN_NUMBER,
TX_PIN_NUMBER,
RTS_PIN_NUMBER,
CTS_PIN_NUMBER,
APP_UART_FLOW_CONTROL_ENABLED,
false,
UART_BAUDRATE_BAUDRATE_Baud115200
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_error_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);
APP_ERROR_CHECK(err_code);
/* init radio */
radio_config_init();
printf("\r\nStart: \r\n");
while (true)
{
NRF_RADIO->PACKETPTR = (uint32_t)rxbuffer;
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)
{
/* */
for (i = 0; i < sizeof(rxbuffer); i++)
app_uart_put(rxbuffer[i]);
}
NRF_RADIO->EVENTS_DISABLED = 0U;
// Disable radio
NRF_RADIO->TASKS_DISABLE = 1U;
while (NRF_RADIO->EVENTS_DISABLED == 0U)
{
// wait
}
}
}
nrf24le1 config are follows:
L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); /* SET pipe0 rx number */
L01_WriteSingleReg( L01REG_CONFIG, /*( 1<<MASK_RX_DR ) |*///receive interrupt
( 1<<EN_CRC ) | //Enable CRC, 1 byte
( 1<<PWR_UP ) ); //Power up the device
L01_WriteSingleReg( L01REG_EN_AA, ( 1<<ENAA_P0 ) ); //Auto ack in pipe 0
L01_WriteSingleReg( L01REG_EN_RXADDR, ( 1<<ERX_P0 ) );//Enable pipe 0 receive
L01_WriteSingleReg( L01REG_SETUP_AW, AW_5BYTES ); //Address width : 5Byte
L01_WriteSingleReg( L01REG_RETR, ARD_4000US |
( REPEAT_CNT & 0x0F ) ); //repeat wait : 4000us, 15 repeat
L01_WriteSingleReg( L01REG_RF_CH, 0x00 ); //Initial channel
L01_WriteSingleReg( L01REG_RF_SETUP, 0x26 ); /* 0dbm, 250kbps */
L01_SetTXAddr( &addr[0], 5 ); //Set TX address, own address
L01_SetRXAddr( 0, &addr[0], 5 );
the &addr[0] is the address of addr[5]= {0xE7,0xE7,0xE7,0xE7,0xE7} ;
by using debug session with keil 5.15, running is stopped at NRF_RADIO->TASKS_START = 1U;
can anybody tell me what's wrong with the code. BR