diff --git a/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h b/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h index 0c7bd53cb..3edd23cab 100644 --- a/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h +++ b/cpu/avr/radio/rf230bb/atmega128rfa1_registermap.h @@ -73,6 +73,12 @@ #define RG_CSMA_BE CSMA_BE #define RG_CSMA_SEED_0 CSMA_SEED_0 #define RG_PHY_RSSI PHY_RSSI +#define SR_CCA_MODE 0x08, 0x60, 5 +//#define SR_CCA_CS_THRES 0x09, 0xf0, 4 +#define SR_CCA_ED_THRES 0x09, 0x0f, 0 +#define SR_CCA_REQUEST 0x08, 0x80, 7 +#define SR_CCA_DONE 0x01, 0x80, 7 +#define SR_CCA_STATUS 0x01, 0x40, 6 /* RF230 register assignments, for reference */ diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index 19aa8b253..9ee74f3f5 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -209,8 +209,7 @@ static int rf230_receiving_packet(void); static int pending_packet(void); static int rf230_cca(void); -signed char rf230_last_rssi; -uint8_t rf230_last_correlation; +uint8_t rf230_last_correlation,rf230_last_rssi,rf230_smallest_rssi; const struct radio_driver rf230_driver = { @@ -714,6 +713,24 @@ rf230_init(void) hal_register_write(RG_CSMA_SEED_0,hal_register_read(RG_PHY_RSSI) );//upper two RSSI reg bits RND_VALUE are random in rf231 // hal_register_write(CSMA_SEED_1,42 ); + /* CCA Mode Mode 1=Energy above threshold 2=Carrier sense only 3=Both 0=Either (RF231 only) */ +//hal_subregister_write(SR_CCA_MODE,1); //1 is the power-on default + + /* Carrier sense threshold (not implemented in RF230 or RF231) */ +// hal_subregister_write(SR_CCA_CS_THRES,1); + + /* CCA energy threshold = -91dB + 2*SR_CCA_ED_THRESH. Reset defaults to -77dB */ + /* Use RF230 base of -91; RF231 base is -90 according to datasheet */ +#if RF230_CONF_CCA_THRES < -91 +#warning RF230_CONF_CCA_THRES below hardware limit, setting to -91dBm + hal_subregister_write(SR_CCA_ED_THRES,0); +#elif RF230_CONF_CCA_THRES > -61 +#warning RF230_CONF_CCA_THRES above hardware limit, setting to -61dBm + hal_subregister_write(SR_CCA_ED_THRES,15); +#else + hal_subregister_write(SR_CCA_ED_THRES,(RF230_CONF_CCA_THRES+91)/2); +#endif + /* Use automatic CRC unless manual is specified */ #if RF230_CONF_CHECKSUM hal_subregister_write(SR_TX_AUTO_CRC_ON, 0); @@ -883,7 +900,6 @@ rf230_transmit(unsigned short payload_len) } RELEASE_LOCK(); - if (tx_result==1) { //success, data pending from adressee tx_result=0; //Just show success? } else if (tx_result==3) { //CSMA channel access failure @@ -1332,6 +1348,10 @@ if (RF230_receive_on) { #endif #endif /* speed vs. generality */ + /* Save the smallest rssi. The display routine can reset by setting it to zero */ + if ((rf230_smallest_rssi==0) || (rf230_last_rssi