vad7 пре 3 година
родитељ
комит
e5df1ca6f9
3 измењених фајлова са 24 додато и 21 уклоњено
  1. 15 13
      lib/nrf24/nrf24.c
  2. 4 2
      lib/nrf24/nrf24.h
  3. 5 6
      nrf24scan.c

+ 15 - 13
lib/nrf24/nrf24.c

@@ -41,8 +41,7 @@ uint8_t nrf24_write_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t data)
     return rx[0];
 }
 
-uint8_t
-    nrf24_write_buf_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size) {
+uint8_t nrf24_write_buf_reg(FuriHalSpiBusHandle* handle, uint8_t reg, uint8_t* data, uint8_t size) {
     uint8_t tx[size + 1];
     uint8_t rx[size + 1];
     memset(rx, 0, size + 1);
@@ -194,28 +193,31 @@ uint8_t nrf24_set_packetlen(FuriHalSpiBusHandle* handle, uint8_t len) {
 uint8_t nrf24_rxpacket(FuriHalSpiBusHandle* handle, uint8_t* packet, uint8_t* packetsize, bool full) {
     uint8_t status = 0;
     uint8_t size = 0;
-    uint8_t tx_pl_wid[] = {R_RX_PL_WID, 0};
-    uint8_t rx_pl_wid[] = {0, 0};
     uint8_t tx_cmd[33] = {0}; // 32 max payload size + 1 for command
     uint8_t tmp_packet[33] = {0};
 
     status = nrf24_status(handle);
-
-    if(status & 0x40) {
+    if(!(status & RX_DR)) {
+        tx_cmd[0] = R_REGISTER | (REGISTER_MASK & REG_FIFO_STATUS);
+        nrf24_spi_trx(handle, tx_cmd, tmp_packet, 2, nrf24_TIMEOUT);
+        if((tmp_packet[1] & 1) == 0) status |= RX_DR; // packet in FIFO buffer
+    }
+    if(status & RX_DR) {
         if(full)
             size = nrf24_get_packetlen(handle, (status >> 1) & 7);
         else {
-            nrf24_spi_trx(handle, tx_pl_wid, rx_pl_wid, 2, nrf24_TIMEOUT);
-            size = rx_pl_wid[1];
+            tx_cmd[0] = R_RX_PL_WID; tx_cmd[1] = 0;
+            nrf24_spi_trx(handle, tx_cmd, tmp_packet, 2, nrf24_TIMEOUT);
+            size = tmp_packet[1];
         }
         if(size > 32) size = 32;
-        tx_cmd[0] = R_RX_PAYLOAD;
+        if(size == 0) size = 32;
+        tx_cmd[0] = R_RX_PAYLOAD; tx_cmd[1] = 0;
         nrf24_spi_trx(handle, tx_cmd, tmp_packet, size + 1, nrf24_TIMEOUT);
-        nrf24_write_reg(handle, REG_STATUS, 0x50); // clear RX_DR, MAX_RT.
         memcpy(packet, &tmp_packet[1], size);
-    } else if(status == 0 || (status & 0x11)) {
-        nrf24_flush_rx(handle);
-        nrf24_write_reg(handle, REG_STATUS, 0x50); // clear RX_DR, MAX_RT.
+        nrf24_write_reg(handle, REG_STATUS, RX_DR); // clear RX_DR
+    } else if(status & (TX_DS | MAX_RT)) { // MAX_RT, TX_DS
+        nrf24_write_reg(handle, REG_STATUS, (TX_DS | MAX_RT)); // clear RX_DR, MAX_RT.
     }
 
     *packetsize = size;

+ 4 - 2
lib/nrf24/nrf24.h

@@ -38,6 +38,7 @@ extern "C" {
 #define REG_RX_ADDR_P5 0x0F
 #define REG_RF_CH 0x05
 #define REG_TX_ADDR 0x10
+#define REG_FIFO_STATUS 0x17
 
 #define RX_PW_P0 0x11
 #define RX_PW_P1 0x12
@@ -45,8 +46,9 @@ extern "C" {
 #define RX_PW_P3 0x14
 #define RX_PW_P4 0x15
 #define RX_PW_P5 0x16
-#define TX_DS 0x20
-#define MAX_RT 0x10
+#define RX_DR    0x40
+#define TX_DS    0x20
+#define MAX_RT   0x10
 
 #define nrf24_TIMEOUT 500
 #define nrf24_CE_PIN &gpio_ext_pb2

+ 5 - 6
nrf24scan.c

@@ -1,6 +1,6 @@
 //
 // Written by vad7, 20.11.2022.
-// ver. 1.2
+// ver. 1.3
 //
 #include "nrf24scan.h"
  
@@ -363,8 +363,7 @@ static void prepare_nrf24()
 	uint8_t addr[5];
 	uint8_t erx_addr = (1<<0); // Enable RX_P0
 	if(addrs.addr_count == 0) return;
-	nrf24_write_reg(nrf24_HANDLE, REG_CONFIG, NRF_CRC == 1 ? 0b1000 : NRF_CRC == 2 ? 0b1100 : 0);
-	nrf24_write_reg(nrf24_HANDLE, REG_STATUS, 0x70); // clear interrupts
+	nrf24_write_reg(nrf24_HANDLE, REG_CONFIG, 0x70 | ((NRF_CRC == 1 ? 0b1000 : NRF_CRC == 2 ? 0b1100 : 0))); // Mask all interrupts
 	nrf24_write_reg(nrf24_HANDLE, REG_SETUP_RETR, NRF_ESB ? 1 : 0); // Disable Automatic Retransmission
 	nrf24_write_reg(nrf24_HANDLE, REG_EN_AA, NRF_ESB ? 0x3F : 0); // Auto acknowledgement
 	nrf24_write_reg(nrf24_HANDLE, REG_FEATURE, 1 + (NRF_DPL || NRF_ESB ? 4 : 1)); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload
@@ -404,7 +403,7 @@ static void prepare_nrf24()
 		nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? (1<<5) : 0);
 		erx_addr |= (1<<5); // Enable RX_P5
 	} else nrf24_write_reg(nrf24_HANDLE, RX_PW_P5, 0);
-	nrf24_write_reg(nrf24_HANDLE, REG_STATUS, 0x50); // clear RX_DR, MAX_RT.
+	nrf24_write_reg(nrf24_HANDLE, REG_STATUS, 0x70); // clear interrupts
 	nrf24_write_reg(nrf24_HANDLE, REG_EN_RXADDR, erx_addr);
 	nrf24_write_reg(nrf24_HANDLE, REG_RF_CH, NRF_channel);
 	nrf24_write_reg(nrf24_HANDLE, REG_RF_SETUP, NRF_rate);
@@ -428,7 +427,7 @@ bool nrf24_read_newpacket() {
 	uint8_t packet[32] = {0};
 	uint8_t *ptr = APP->log_arr + log_arr_idx * LOG_REC_SIZE;
 	uint8_t status = nrf24_rxpacket(nrf24_HANDLE, ptr + 1, &packetsize, !NRF_DPL);
-	if(status & 0x40) {
+	if(status & RX_DR) {
 		*ptr = ((packetsize & 0x1F) << 3) | ((status >> 1) & 7); // payload size + pipe #
 		if(packetsize < 32) memset(ptr + packetsize + 1, 0, 32 - packetsize);
 		if(log_arr_idx < MAX_LOG_RECORDS - 1) {
@@ -756,7 +755,7 @@ int32_t nrf24scan_app(void* p) {
 				}
 			}
 		}
-		if(what_to_do) {
+		if(what_doing && what_to_do) {
 			nrf24_read_newpacket();
 			if(find_channel_period && furi_get_tick() - start_time >= (uint32_t)find_channel_period * 1000UL) {
 				if(++NRF_channel > MAX_CHANNEL) NRF_channel = 0;