diff --git a/drivers/at86rf2xx/at86rf2xx_netdev.c b/drivers/at86rf2xx/at86rf2xx_netdev.c index 24a959227b4e14af16e9e1a0fb40fe3b7dd41aaf..a8dd416855da8397d3ff83510e1ab23bb684f7ce 100644 --- a/drivers/at86rf2xx/at86rf2xx_netdev.c +++ b/drivers/at86rf2xx/at86rf2xx_netdev.c @@ -166,18 +166,39 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info) at86rf2xx_fb_read(dev, tmp, 2); (void)tmp; + /* at86rf212 RSSI_BASE_VAL +3.1*RSSI, base varies for diff. modulation and datarates + * at86RF232 RSSI_BASE_VAL +3.0*RSSI, base -91dBm + * at86RF233 RSSI_BASE_VAL +3.0*RSSI, base -94dBm + * at86RF231 RSSI_BASE_VAL +3.0*(RSSI-1), base -91dBm + * at***RFR2 RSSI_BASE_VAL +3.0*(RSSI-1), base -90dBm + * + * AT86RF231 MAN. p.89 8.3.2 Reading RSSI + * AT86RF232 MAN. p.88 8.3.2 Reading RSSI + * AT86RF233 MAN. p.99 8.4.2 Reading RSSI + * "It is not recommended reading the RSSI value when using the Extended + * Operating Modes, use ED instead" + * at86RF231 RSSI_BASE_VAL +ED, base -90dBm + * at86RF232 RSSI_BASE_VAL +ED, base -91dBm + * at86RF233 RSSI_BASE_VAL +ED, base -94dBm + * at***RFR2 RSSI_BASE_VAL +ED, base -90dBm + */ if (info != NULL) { uint8_t rssi = 0; netdev_ieee802154_rx_info_t *radio_info = info; + +#if defined(MODULE_AT86RF231) || defined(MODULE_AT86RF232) || defined(MODULE_AT86RF233) at86rf2xx_fb_read(dev, &(radio_info->lqi), 1); -#ifndef MODULE_AT86RF231 - at86rf2xx_fb_read(dev, &(rssi), 1); at86rf2xx_fb_stop(dev); + rssi = at86rf2xx_reg_read(dev, AT86RF2XX_REG__PHY_ED_LEVEL); #else + at86rf2xx_fb_read(dev, &(radio_info->lqi), 1); + at86rf2xx_fb_read(dev, &(rssi), 1); at86rf2xx_fb_stop(dev); - rssi = at86rf2xx_reg_read(dev, AT86RF2XX_REG__PHY_ED_LEVEL); + rssi = 3 * rssi; #endif radio_info->rssi = RSSI_BASE_VAL + rssi; + DEBUG("[at86rf2xx] LQI:%d high is good, RSSI:%d high is either good or" + "too much interference.\n", radio_info->lqi, radio_info->rssi); } else { at86rf2xx_fb_stop(dev);