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 _______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org http://lists.gnu.org/mailman/listinfo/discuss-gnuradio