[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Discuss-gnuradio] Firmware issue: Send a constant signal with the x
From: |
Matthias Schäfer |
Subject: |
Re: [Discuss-gnuradio] Firmware issue: Send a constant signal with the xcvr2450 dboard |
Date: |
Thu, 16 Sep 2010 15:26:17 +0200 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100728 Thunderbird/3.1.1 |
Am 16.09.2010 07:49, schrieb Eric Blossom:
> On Wed, Sep 15, 2010 at 05:55:12PM +0200, Matthias Schäfer wrote:
>> Hi List,
>> I'm currently working on a standalone firmware app for USRP2. My
>> goal is to send a constant signal with the xcvr2450 dboard. I
>> skipped the tuning via firmware by doing this prior from a host
>> using the simple_usrp c++ interface:
>>
>> uhd::usrp::simple_usrp::sptr sdev = uhd::usrp::simple_usrp::make(args);
>> uhd::device::sptr dev = sdev->get_device();
>> sdev->set_tx_rate(rate);
>> sdev->set_tx_freq(freq);
>> sdev->set_tx_gain(gain);
>>
>> ===============
>> So back to the firmware. Assuming the tuning of the dboard is
>> properly done from host, I basically understood the way sending is
>> done as follows:
>>
>> 1. Wait for the buffer pool to become idle:
>>
>> while((buffer_pool_status->status & BPS_IDLE(DSP_TX_BUF_0)) == 0)
>> ;
>>
>> 2. Copy the data which should be send to the DSP into the DSP tx-buffer:
>>
>> uint32_t *p = buffer_ram(DSP_TX_BUF_0);
>> uint32_t sample = (32000 << 16) | 0; // for example
>> for (i = 0; i < BP_NLINE; i++) {
>> p[i] = sample;
>> }
>>
>> 3. Send the data to the DSP:
>>
>> bp_send_from_buf(DSP_TX_BUF_0, PORT_DSP, 1, 0, BP_LAST_LINE);
>>
>> 4. Wait until transaction is done or an error occured
>>
>> while((buffer_pool_status->status & (BPS_DONE(DSP_TX_BUF_0) |
>> BPS_ERROR(DSP_TX_BUF_0))) == 0)
>> ;
>>
>> 5. Clear the status flags and redo the whole procedure
>>
>> bp_clear_buf(DSP_TX_BUF_0);
>> // goto 1.
>>
>> ===============
>>
>> Unfortunately this doesn't work for me like expected. I tried it in
>> several variations and listened with another usrp2 for a signal but
>> nothing happens. I think I understood something wrong and forgot
>> something but it's hard for me to see the problem.
>>
>> So maybe you guys can help me out with that.
>>
>> Thanks in advance!
>>
>> Cheers,
>> Matthias
> A couple of things. 32000 is likely to be too big and will probably
> result in clipping. Try 3200 to start with.
>
> It's unlikely that f/w can write samples to the buffer fast enough to
> keep the data streaming. However in your case, you only need to
> initialize the samples in the buffer once, then you can just keep
> sending it over and over.
>
> Do (2) once.
>
> // Start in known good state (IDLE)
> bp_clear_buf(DSP_TX_BUF_0);
>
> // start first buffer xfer
> bp_send_from_buf(DSP_TX_BUF_0, PORT_DSP, 1, 0, BP_LAST_LINE);
>
> while (1){
>
> // wait for xfer to complete
> while ((buffer_pool_status->status &
> (BPS_DONE(DSP_TX_BUF_0) | BPS_ERROR(DSP_TX_BUF_0))) == 0)
> ;
>
> // Reset flags
> bp_clear_buf(DSP_TX_BUF_0);
>
> // start next xfer
> bp_send_from_buf(DSP_TX_BUF_0, PORT_DSP, 1, 0, BP_LAST_LINE);
> }
>
>
> Eric
Hi Eric,
thank for your fast reply. I tried the things you told me but it doesn't
work nevertheless. I'm using the txrx_uhd f/w with the additional void
SEND_DATA() (see below). After tuning the USRP2 with the mentioned
host-app (see above), I'm sending a UDP packet to the USRP2 with a
special port which becomes filtered by the eth_pkt_inspector which then
invokes SEND_DATA(). The serial port then tells me the following:
Waiting for the buffer pool.
Buffer pool idles. Filling buffer.
Filled buffer. Start sending.
Done.
Done.
and than the USRP2 stucks in the inner waiting-loop until I restart it.
If the debug-symbols (putstr) make any problems here, I tried it several
times without serial port but it didn't have any effect. The H/W seems
to be okay, because sending and receiving with grc works fine.
Do I maybe have to set some dboard/buffer pool flags before sending?
Does my tuning procedure maybe leave the dboard in a "no-sending"-state?
static void SEND_DATA () {
putstr("Waiting for the buffer pool.\n");
while((buffer_pool_status->status & BPS_IDLE(DSP_TX_BUF_0)) == 0)
;
putstr("Buffer pool idles. Filling buffer.\n");
// fill buffer
uint32_t *p = buffer_ram(DSP_TX_BUF_0);
uint32_t i;
uint32_t sample = (3200 << 16) | 0;
for (i = 0; i < BP_NLINES; i++) {
p[i] = sample;
}
putstr("Filled buffer. Start sending\n");
bp_clear_buf(DSP_TX_BUF_0);
// first xfer
bp_send_from_buf(DSP_TX_BUF_0, PORT_DSP, 1, 0, BP_LAST_LINE);
while (1) {
// wait for xfer to complete
while ((buffer_pool_status->status &
(BPS_DONE(DSP_TX_BUF_0) | BPS_ERROR(DSP_TX_BUF_0))) == 0)
;
putstr("Done.\n");
bp_clear_buf(DSP_TX_BUF_0);
// fire it off
bp_send_from_buf(DSP_TX_BUF_0, PORT_DSP, 1, 0, BP_LAST_LINE);
}
}
Cheers,
Matthias