]> git.zerfleddert.de Git - fhem-stuff/commitdiff
handle RX/TX switching and respect CCA
authorMichael Gernoth <michael@gernoth.net>
Thu, 27 Jun 2013 08:50:03 +0000 (10:50 +0200)
committerMichael Gernoth <michael@gernoth.net>
Thu, 27 Jun 2013 08:50:03 +0000 (10:50 +0200)
culfw/culfw-asksin-fix.diff

index b50022214a49538fe2c7af187aad58eb435486f5..19e65986ddd54e4fd24ce725f8387a866b2ba68d 100644 (file)
@@ -40,8 +40,15 @@ Index: clib/rf_asksin.c
  static void rf_asksin_reset_rx(void);
  
  void
-@@ -71,12 +75,29 @@
-   ccRX();
+@@ -68,15 +72,35 @@
+   my_delay_ms(4);
+-  ccRX();
++  // enable RX, but don't enable the interrupt
++  do {
++    ccStrobe(CC1100_SRX);
++  } while (cc1100_readReg(CC1100_MARCSTATE) != MARCSTATE_RX);
  }
  
 +// Workaround for CC1101 Errata 3
@@ -70,7 +77,7 @@ Index: clib/rf_asksin.c
    ccStrobe( CC1100_SRX   );
  }
  
-@@ -87,13 +108,29 @@
+@@ -87,13 +111,29 @@
    uint8_t dec[MAX_ASKSIN_MSG];
    uint8_t rssi;
    uint8_t l;
@@ -102,7 +109,7 @@ Index: clib/rf_asksin.c
  
      if (enc[0] >= MAX_ASKSIN_MSG) {
        // Something went horribly wrong, out of sync?
-@@ -101,6 +138,27 @@
+@@ -101,6 +141,27 @@
        return;
      }
  
@@ -130,7 +137,7 @@ Index: clib/rf_asksin.c
      CC1100_ASSERT;
      cc1100_sendbyte( CC1100_READ_BURST | CC1100_RXFIFO );
      
-@@ -109,12 +167,19 @@
+@@ -109,12 +170,19 @@
      }
      
      rssi = cc1100_sendbyte( 0 );
@@ -152,3 +159,31 @@ Index: clib/rf_asksin.c
      dec[0] = enc[0];
      dec[1] = (~enc[1]) ^ 0x89;
      
+@@ -182,7 +250,11 @@
+   
+   enc[l] = dec[l] ^ dec[2];
+-  ccTX();
++  // enable TX, wait for CCA
++  while (cc1100_readReg(CC1100_MARCSTATE) != MARCSTATE_TX) {
++    ccStrobe(CC1100_STX);
++  }
++
+   if (dec[2] & (1 << 4)) { // BURST-bit set?
+     // According to ELV, devices get activated every 300ms, so send burst for 360ms
+     for(l = 0; l < 3; l++)
+@@ -209,11 +281,12 @@
+       ccStrobe( CC1100_SFTX  );
+       ccStrobe( CC1100_SIDLE );
+       ccStrobe( CC1100_SNOP  );
+-      ccStrobe( CC1100_SRX   );
+   }
+   
+   if(asksin_on) {
+-    ccRX();
++    do {
++      ccStrobe(CC1100_SRX);
++    } while (cc1100_readReg(CC1100_MARCSTATE) != MARCSTATE_RX);
+   } else {
+     set_txrestore();
+   }
Impressum, Datenschutz