регистры сбрасываются только при отключении питания, сброса у чипа нет. перечитываете в даташите все регистры и смотрите, что инициализировать. чем меньше трогать, тем лучше, меньше запутаетесь.
если поможет, я примерно так в последний раз инициализировал, тут без динамической длины пакета (payload_size = 32)
Код:
ceLow();
csnHi();
delay( 5 );
reg_config.value = 0;
reg_config.bits.PRIM_RX = 1;
reg_config.bits.PWR_UP = 0;
reg_config.bits.CRCO = 1;
reg_config.bits.EN_CRC = 1;
reg_config.bits.MASK_MAX_RT = 0; //0: Reflect MAX_RT as active low interrupt on the IRQ pin
reg_config.bits.MASK_TX_DS = 0; //0: Reflect TX_DS as active low interrupt on the IRQ pin
reg_config.bits.MASK_RX_DR = 0; //0: Reflect RX_DR as active low interrupt on the IRQ pin
write_register(REG_CONFIG_ADDR, reg_config.value);
//EN_AA - Enhanced ShockBurst
write_register(REG_EN_AA_ADDR, 0x1F); //Enable auto acknowledgement data pipe 0-5
//write_register(REG_EN_AA_ADDR, 0);
write_register(REG_EN_RX_ADDR, 0x01); //Enable data pipe 0
write_register(REG_SETUP_AW_ADDR, 0x01); //RX/TX Address field width, 0x03 - '11' – 5 bytes
UNION_SETUP_RETR reg_setup_retr;
reg_setup_retr.value = 0;
reg_setup_retr.bits.ARC = 3; //Auto Retransmit Count. 0 - off
reg_setup_retr.bits.ARD = 1; //Auto Retransmit Delay, 0001 – Wait 500µS
write_register(REG_SETUP_RETR_ADDR, reg_setup_retr.value);
setChannel(0);
UNION_RF_SETUP reg_rf_setup;
reg_rf_setup.value = 0;
reg_rf_setup.bits.LNA_HCURR = 1;
reg_rf_setup.bits.RF_PWR = (rf24_pa_dbm)0;// rf24_pa_dbm::RF24_PA_MIN;
reg_rf_setup.bits.RF_DR = (rf24_datarate)0; // rf24_datarate::RF24_1MBPS;
write_register(REG_RF_SETUP_ADDR, reg_rf_setup.value);
status.value = 0x70;//1110000 - clear RX_DR, TX_DS, MAX_RT
write_register(REG_STATUS_ADDR, status.value);
uint8_t arr5[5] = { 0xE7, 0xE7, 0xE7, 0xE7, 0xE7 };
//arr5[0] = 0xE7;
//arr5[1] = 0xE7;
//arr5[2] = 0xE7;
//arr5[3] = 0xE7;
//arr5[4] = 0xE7;
write_register(REG_RX_ADDR_BASE, arr5, 3); //RX_ADDR_P0
write_register(REG_TX_ADDR, arr5, 3); //TX_ADDR_P0
arr5[0] = 0xC2;
arr5[1] = 0xC2;
arr5[2] = 0xC2;
arr5[3] = 0xC2;
arr5[4] = 0xC2;
write_register(REG_RX_ADDR_BASE + 1, arr5, 3); //RX_ADDR_P1
write_register(REG_RX_ADDR_BASE + 2, 0xC3); //RX_ADDR_P2
write_register(REG_RX_ADDR_BASE + 3, 0xC4); //RX_ADDR_P3
write_register(REG_RX_ADDR_BASE + 4, 0xC5); //RX_ADDR_P4
write_register(REG_RX_ADDR_BASE + 5, 0xC6); //RX_ADDR_P5
write_register(REG_RX_PW_P_ADDR_BASE, payload_size); //Number of bytes in RX payload in data pipe 0.
write_register(REG_RX_PW_P_ADDR_BASE + 1, payload_size); //Number of bytes in RX payload in data pipe 1.
write_register(REG_RX_PW_P_ADDR_BASE + 2, payload_size); //Number of bytes in RX payload in data pipe 2.
write_register(REG_RX_PW_P_ADDR_BASE + 3, payload_size); //Number of bytes in RX payload in data pipe 3.
write_register(REG_RX_PW_P_ADDR_BASE + 4, payload_size); //Number of bytes in RX payload in data pipe 4.
write_register(REG_RX_PW_P_ADDR_BASE + 5, payload_size); //Number of bytes in RX payload in data pipe 5.
flush_rx();
flush_tx();
write_register(REG_DYNPD_ADDR, 0); //Enable dynamic payload length. pipe 0-5 off
UNION_FEATURE reg_feature;
reg_feature.value = 0;
reg_feature.bits.EN_DYN_ACK = 0; //Enables the W_TX_PAYLOAD_NOACK command
reg_feature.bits.EN_ACK_PAY = 0; //Enables Payload with ACK
reg_feature.bits.EN_DPL = 0; //Enables Dynamic Payload Length
write_register(REG_DYNPD_ADDR, reg_feature.value);
у меня оно по прерыванию ноги irq данные считывает.
есть три весёлых бита: RX_DR, TX_DS, MAX_RT. с ними больше всего веселья в начале изучения модуля. при отладке отправки и получения лучше проверять и с отключенной и с включенной ф-ей автоподтверждения доставки пакета + поотправлять пакетики в никуда (просто второй модуль отключить).