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
ccStrobe( CC1100_SRX );
}
-@@ -87,13 +108,29 @@
+@@ -87,13 +111,29 @@
uint8_t dec[MAX_ASKSIN_MSG];
uint8_t rssi;
uint8_t l;
if (enc[0] >= MAX_ASKSIN_MSG) {
// Something went horribly wrong, out of sync?
-@@ -101,6 +138,27 @@
+@@ -101,6 +141,27 @@
return;
}
CC1100_ASSERT;
cc1100_sendbyte( CC1100_READ_BURST | CC1100_RXFIFO );
-@@ -109,12 +167,19 @@
+@@ -109,12 +170,19 @@
}
rssi = cc1100_sendbyte( 0 );
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();
+ }