===================================================================
--- clib/rf_asksin.c (revision 373)
+++ clib/rf_asksin.c (working copy)
-@@ -11,7 +11,7 @@
+@@ -11,13 +11,13 @@
uint8_t asksin_on = 0;
-const uint8_t PROGMEM ASKSIN_CFG[50] = {
+- 0x00, 0x07,
+const uint8_t PROGMEM ASKSIN_CFG[] = {
- 0x00, 0x07,
++ 0x00, 0x01,
0x02, 0x2e,
0x03, 0x0d,
-@@ -26,16 +26,17 @@
+ 0x04, 0xE9,
+ 0x05, 0xCA,
+- 0x07, 0x0C,
++ 0x07, 0x04,
+ 0x0B, 0x06,
+ 0x0D, 0x21,
+ 0x0E, 0x65,
+@@ -26,18 +26,21 @@
0x11, 0x93,
0x12, 0x03,
0x15, 0x34,
+ 0x3e, 0xc3
};
++static inline uint8_t read_cc1100_rxbytes();
++
void
-@@ -56,18 +57,16 @@
+ rf_asksin_init(void)
+ {
+@@ -56,20 +59,30 @@
my_delay_us(100);
// load configuration
+ ccRX();
}
++// Workaround for CC1101 Errata 3
++static inline uint8_t read_cc1100_rxbytes()
++{
++ uint8_t rxbytes, rxbytes2;
++
++ rxbytes = cc1100_readReg(CC1100_RXBYTES);
++ while((rxbytes2 = cc1100_readReg(CC1100_RXBYTES)) != rxbytes)
++ rxbytes = rxbytes2;
++
++ return rxbytes;
++}
++
void
-@@ -77,80 +76,74 @@
+ rf_asksin_task(void)
+ {
+@@ -77,15 +90,27 @@
uint8_t dec[MAX_ASKSIN_MSG];
uint8_t rssi;
uint8_t l;
if(!asksin_on)
return;
- // see if a CRC OK pkt has been arrived
- if (bit_is_set( CC1100_IN_PORT, CC1100_IN_PIN )) {
-+ while((rxfifo_cnt = cc1100_readReg(CC1100_RXBYTES)) != 0x00) {
-+ if (rxfifo_cnt & 0x80) // Overflow
-+ break;
+- // see if a CRC OK pkt has been arrived
+- if (bit_is_set( CC1100_IN_PORT, CC1100_IN_PIN )) {
++ // see if there is data to be read
++ while (bit_is_set( CC1100_IN_PORT, CC1100_IN_PIN )) {
++ rxfifo_cnt = read_cc1100_rxbytes();
-- enc[0] = cc1100_readReg( CC1100_RXFIFO ) & 0x7f; // read len
-+ enc[0] = cc1100_readReg( CC1100_RXFIFO ) & 0x7f; // read len
++ if (rxfifo_cnt & 0x80) // Overflow
++ break;
++
++ rxfifo_cnt &= 0x7f;
++
+ enc[0] = cc1100_readReg( CC1100_RXFIFO ) & 0x7f; // read len
-- if (enc[0]>=MAX_ASKSIN_MSG)
-- enc[0] = MAX_ASKSIN_MSG-1;
--
-- CC1100_ASSERT;
-- cc1100_sendbyte( CC1100_READ_BURST | CC1100_RXFIFO );
--
-- for (uint8_t i=0; i<enc[0]; i++) {
-- enc[i+1] = cc1100_sendbyte( 0 );
-- }
--
-- rssi = cc1100_sendbyte( 0 );
++ while ((enc[0] + 2) < (rxfifo_cnt - 1)) { // Wait for more data
++ my_delay_ms(1);
++ rxfifo_cnt = (read_cc1100_rxbytes() & 0x7f) + 1;
++ }
++
+ if (enc[0]>=MAX_ASKSIN_MSG)
+ enc[0] = MAX_ASKSIN_MSG-1;
+
+@@ -97,13 +122,12 @@
+ }
+
+ rssi = cc1100_sendbyte( 0 );
-
-- CC1100_DEASSERT;
-+ if (enc[0]>=MAX_ASKSIN_MSG)
-+ enc[0] = MAX_ASKSIN_MSG-1;
-+
-+ CC1100_ASSERT;
-+ cc1100_sendbyte( CC1100_READ_BURST | CC1100_RXFIFO );
-+
-+ for (uint8_t i=0; i<enc[0]; i++) {
-+ enc[i+1] = cc1100_sendbyte( 0 );
-+ }
-+
-+ rssi = cc1100_sendbyte( 0 );
-+ /* LQI = */ cc1100_sendbyte( 0 );
++ l = cc1100_sendbyte( 0 );
++
+ CC1100_DEASSERT;
- ccStrobe( CC1100_SFRX );
- ccStrobe( CC1100_SIDLE );
- ccStrobe( CC1100_SNOP );
- ccStrobe( CC1100_SRX );
-+ CC1100_DEASSERT;
-
-- dec[0] = enc[0];
-- dec[1] = (~enc[1]) ^ 0x89;
--
-- for (l = 2; l < dec[0]; l++)
-- dec[l] = (enc[l-1] + 0xdc) ^ enc[l];
--
-- dec[l] = enc[l] ^ dec[2];
++ if (!(l & 0x80)) // CRC not ok
++ continue;
+
+ dec[0] = enc[0];
+ dec[1] = (~enc[1]) ^ 0x89;
+@@ -113,7 +137,6 @@
+
+ dec[l] = enc[l] ^ dec[2];
+
-
--
-- if (tx_report & REP_BINTIME) {
-+ while(cc1100_readReg(CC1100_RXBYTES) & 0x7f)
-+ cc1100_readReg( CC1100_RXFIFO );
-+
-+ dec[0] = enc[0];
-+ dec[1] = (~enc[1]) ^ 0x89;
-
-- DC('a');
-- for (uint8_t i=0; i<=dec[0]; i++)
-- DC( dec[i] );
--
-- } else {
-- DC('A');
-+ for (l = 2; l < dec[0]; l++)
-+ dec[l] = (enc[l-1] + 0xdc) ^ enc[l];
+ if (tx_report & REP_BINTIME) {
-- for (uint8_t i=0; i<=dec[0]; i++)
-- DH2( dec[i] );
-+ dec[l] = enc[l] ^ dec[2];
+ DC('a');
+@@ -131,26 +154,17 @@
-- if (tx_report & REP_RSSI)
-- DH2(rssi);
--
-- DNL();
-+ if (tx_report & REP_BINTIME) {
-+
-+ DC('a');
-+ for (uint8_t i=0; i<=dec[0]; i++)
-+ DC( dec[i] );
-+
-+ } else {
-+ DC('A');
-+
-+ for (uint8_t i=0; i<=dec[0]; i++)
-+ DH2( dec[i] );
-+
-+ if (tx_report & REP_RSSI)
-+ DH2(rssi);
-+
-+ DNL();
-+ }
+ DNL();
}
--
++ }
+
- return;
-
++ switch(cc1100_readReg( CC1100_MARCSTATE )) {
++ case MARCSTATE_RXFIFO_OVERFLOW:
++ ccStrobe( CC1100_SFRX );
++ case MARCSTATE_IDLE:
++ ccStrobe( CC1100_SIDLE );
++ ccStrobe( CC1100_SNOP );
++ ccStrobe( CC1100_SRX );
++ break;
}
-
-
- break;
-
- }
-
-+ switch(cc1100_readReg( CC1100_MARCSTATE )) {
-+ case MARCSTATE_RXFIFO_OVERFLOW:
-+ ccStrobe( CC1100_SFRX );
-+ case MARCSTATE_IDLE:
-+ ccStrobe( CC1100_SIDLE );
-+ ccStrobe( CC1100_SNOP );
-+ ccStrobe( CC1100_SRX );
-+ break;
-+ }
+-
}
void
-@@ -173,20 +166,7 @@
+@@ -173,20 +187,7 @@
my_delay_ms(3); // 3ms: Found by trial and error
}
enc[0] = dec[0];
enc[1] = (~dec[1]) ^ 0x89;
-@@ -195,6 +175,15 @@
+@@ -195,6 +196,15 @@
enc[l] = dec[l] ^ dec[2];
// send
CC1100_ASSERT;
cc1100_sendbyte(CC1100_WRITE_BURST | CC1100_TXFIFO);
-@@ -205,12 +194,17 @@
+@@ -205,12 +215,17 @@
CC1100_DEASSERT;