Hi Rob,
Thanks for the pointer, I hadn’t considered trying set_gpio_attr() with a 
command time. I will experiment with this approach..

My only minor hesitation is that my software also does other interactions with 
the radio during transmission (specifically, updating registers in other RFNoC 
blocks), and it’s unclear to me whether those pokes could get blocked in a 
queue behind a timed command. Assuming so, I might be able to sequence 
interactions to avoid that case.

Thanks again,
-David


From: Rob Kossler <rkoss...@nd.edu>
Sent: Thursday, September 21, 2023 4:26 PM
To: David Raeman <da...@synopticengineering.com>
Cc: usrp-users@lists.ettus.com
Subject: Re: [USRP-users] Toggling a panel GPIO at a specific time (via RFNoC 
or otherwise)

Hi David,
It may be the case that this functionality already exists in the radio block 
such that you don't need a custom block.  The function 
radio_control->set_gpio_attr() respects the command time.  Here is a portion of 
one of my applications that outputs a gpio pulse after a specified delay 
relative to the streaming 'start_time'.  Would this work for your case?
Rob

  uhd::time_spec_t gpio_on = start_time + gpio_start;
  this->set_command_time(gpio_on, gpio_mb);
  this->set_gpio_attr(gpio_pulse_bank, "OUT", -1, gpio_mask, gpio_mb);
  this->set_command_time(gpio_on + gpio_duration, gpio_mb);
  this->set_gpio_attr(gpio_pulse_bank, "OUT", 0, gpio_mask, gpio_mb);
  this->clear_command_time(gpio_mb);

On Thu, Sep 21, 2023 at 4:01 PM David Raeman 
<da...@synopticengineering.com<mailto:da...@synopticengineering.com>> wrote:
Hello,

I'm looking for advice on toggling an E320 GPIO pin at a specific 
uhd::time_spec_t. My use case is a UHD application that starts a long transmit 
burst at a known timespec, then later toggles a pin at a time corresponding to 
the Nth sample being transmitted. The pin controls an external RF switch. I 
recognize there will be some amount of group delay through the RFIC and 
internal analog components – my goal is just to be roughly synchronous with 
samples clocked out of the radio block.

As a first pass, I have a custom RFNoC block that counts valid samples from the 
start of burst and toggles the pin after the Nth sample (where N is provided in 
a user register). This is a poor solution because there is deep buffering 
downstream in the radio block, so my block sees “sample N" and toggles the pin 
several thousand sample-periods before it's transmitted. It isn’t a fixed lag 
that can be added as a constant – consider that if N is small and “sample N” is 
observed when the FIFO is initially being filled, the toggle would occur while 
the corresponding sample is sitting in the back-pressured FIFO waiting for the 
transmit start time.

Since this is synchronous manipulation of external state, and not just samples, 
I don’t believe it will be sufficient to use CHDR header timestamps – the block 
would also need to know current radio_time, and I’m not sure how to get that in 
an RFNoC block..

Just wondering if I might be overlooking some simpler approach, or any advice 
on how to plumb this into a custom RFNoC block.

Thank you,
-David

_______________________________________________
USRP-users mailing list -- 
usrp-users@lists.ettus.com<mailto:usrp-users@lists.ettus.com>
To unsubscribe send an email to 
usrp-users-le...@lists.ettus.com<mailto:usrp-users-le...@lists.ettus.com>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to