Parcourir la source

Re-enable dynamic packet length

The nrf24l01 used on the boards is probably a counterfeit chip. It
cannot acknowledge received packets (probably a bit flip of the NO_ACK
bit described here:
https://ncrmnt.org/2015/03/13/how-do-i-cost-optimize-nrf24l01/) if the
dynamic packet length is disabled.
Bernd Gottschlag il y a 5 ans
Parent
révision
1a527b5929
1 fichiers modifiés avec 23 ajouts et 1 suppressions
  1. 23
    1
      weather-sensor/firmware/nrf24l01.c

+ 23
- 1
weather-sensor/firmware/nrf24l01.c Voir le fichier

@@ -64,8 +64,12 @@ void Set_NRF24L01_Pins(void)
64 64
 
65 65
 void Configure_Transmission(uint8_t moduleId)
66 66
 {
67
-	DYNPD_REGISTER dyndpRegisterContents = {.byte = 0x0};
68 67
 	SETUP_RETR_REGISTER setupRetrRegisterContents = {.byte = 0x0};
68
+	EN_RXADDR_REGISTER enableRxAddressesRegisterContents = {.byte = 0x0};
69
+	RX_PW_Pn_REGISTER rxPwPnRegisterContents = {.byte = 0x0};
70
+	EN_AA_REGISTER enAaRegister = {.byte = 0x0};
71
+	FEATURE_REGISTER featureRegisterContents = {.byte = 0x0};
72
+	DYNPD_REGISTER dyndpRegisterContents = {.byte = 0x0};
69 73
 
70 74
 	uint8_t txAddress[5] = {0xB3, 0xB3, 0xB3, 0xB3, 0x00};
71 75
 	uint8_t rx0Address[5] = {0xB3, 0xB3, 0xB3, 0xB3, 0x00};
@@ -94,6 +98,24 @@ void Configure_Transmission(uint8_t moduleId)
94 98
 	/* Set the frequency to 1450 MHz */
95 99
 	Write_NRF_Register(RF_CH_ADDRESS, 0x32);
96 100
 
101
+	/* Enable dynamic payload length */
102
+	Send_Activate_Command();
103
+	featureRegisterContents.bits.EN_DPL = 1; // enable dynamic payload length
104
+	Write_NRF_Register(FEATURE_ADDRESS, featureRegisterContents.byte);
105
+
106
+	/* set dynamic payload length for all data pipes
107
+	 * When the dynamic payload length is not set the module cannot receive packets from some
108
+	 * stations. This is probably due to counterfeit NRF24L01+ chips.
109
+	 */
110
+	dyndpRegisterContents.bits.DPL_P0 = 1;
111
+	dyndpRegisterContents.bits.DPL_P1 = 1;
112
+	dyndpRegisterContents.bits.DPL_P2 = 1;
113
+	dyndpRegisterContents.bits.DPL_P3 = 1;
114
+	dyndpRegisterContents.bits.DPL_P4 = 1;
115
+	dyndpRegisterContents.bits.DPL_P5 = 1;
116
+	Write_NRF_Register(DYNPD_ADDRESS, dyndpRegisterContents.byte);
117
+
118
+	/* Set up the auto retries */
97 119
 
98 120
 	/* */
99 121
 	setupRetrRegisterContents.bits.ARC = 0x3;

Loading…
Annuler
Enregistrer