Problems with duplex on XCVR2450

Hi all,

We have some problems when working on the MIMO implementation based on
USRP1 and XCVR2450. With the default XCVR2450 driver and settings, the
receiver cannot receive anything most of the time (sometimes it can).
But when I comment out this line
usrp()->_common_write_oe(C_RX, d_which, RX_OE_MASK, 0xffff);
in xcvr2450::set_gpio(), the receiver can receive packets without any
problem. However, this modification introduces another problem on the
transmitter side. The transmitter can receive every packet it sends
out, which is not what we want to see.

I checked the mailing lists and Eric said XCVR2450 does not support
full duplex. So how come the radio can receive something while it’s
transmitting? If I don’t touch set_gpio(), how can I fix the problem
that the receiver cannot receive?

BTW, the same source code works perfectly on RFX2400 daughterboards.

Any help will be appreciated.

void xcvr2450::set_gpio()
{
// We calculate four values:
//
// io_rx_while_rx: what to drive onto io_rx_* when receiving
// io_rx_while_tx: what to drive onto io_rx_* when transmitting
// io_tx_while_rx: what to drive onto io_tx_* when receiving
// io_tx_while_tx: what to drive onto io_tx_* when transmitting
//
// B1-B7 is ignored as gain is set serially for now.

int rx_hp, tx_antsel, rx_antsel, tx_pa_sel;
if(d_rx_hp_pin)
rx_hp = RX_HP;
else
rx_hp = 0;

if(d_tx_ant)
tx_antsel = ANTSEL_TX2_RX1;
else
tx_antsel = ANTSEL_TX1_RX2;

if(d_rx_ant)
rx_antsel = ANTSEL_TX2_RX1;
else
rx_antsel = ANTSEL_TX1_RX2;

if(d_five_gig)
tx_pa_sel = LB_PA_OFF;
else
tx_pa_sel = HB_PA_OFF;

// Reset GPIO and ATR
// FIXME: dont set io, oe, atr mask once basic code stops overriding
our settings

usrp()->common_write_io(C_TX, d_which, TX_SAFE_IO, TX_OE_MASK);
usrp()->_common_write_oe(C_TX, d_which, TX_OE_MASK, 0xffff);
usrp()->common_write_atr_txval(C_TX, d_which,
tx_pa_sel|tx_antsel|TX_EN|AD9515DIV);
usrp()->common_write_atr_rxval(C_TX, d_which,
HB_PA_OFF|LB_PA_OFF|rx_antsel|AD9515DIV);
usrp()->common_write_atr_mask(C_TX, d_which, TX_OE_MASK);

usrp()->common_write_io(C_RX, d_which, RX_SAFE_IO, RX_OE_MASK);
// This is the line I commented out
// usrp()->_common_write_oe(C_RX, d_which, RX_OE_MASK, 0xffff);
usrp()->common_write_atr_txval(C_RX, d_which, EN|rx_hp);
usrp()->common_write_atr_rxval(C_RX, d_which, EN|rx_hp|RX_EN);
usrp()->common_write_atr_mask(C_RX, d_which, RX_OE_MASK);
}