[subexp-daq] NURDLIB - SIS3316 - problem with RATACLOCK
Håkan T Johansson
f96hajo at chalmers.se
Thu May 30 17:59:28 CEST 2024
Dear Günter,
to me it makes sense.
Also, since has_rataclock_receiver is checked elsewhere when user tries to
have use_rataclock, only checking for that looks good.
(Only would be that stdbool.h seems not needed. But Hans will remove
that then :) )
The big question: does it work?
Cheers,
Håkan
On Thu, 30 May 2024, Weber, Guenter Dr. wrote:
>
> Dear Håkan,
>
>
> thank you very much for explanation. I pushed a new NURDLIB version with a
> corrected if-statement at the beginning of the RATACLOCK ADC snyc test. Also
> for aesthetics, I moved the firmware check to a separate function.
>
>
> Please have a look, if this makes sense.
>
>
>
>
>
> Best greetings
>
> Günter
>
>
>
>
> ____________________________________________________________________________
> Von: subexp-daq <subexp-daq-bounces at lists.chalmers.se> im Auftrag von Håkan
> T Johansson <f96hajo at chalmers.se>
> Gesendet: Mittwoch, 29. Mai 2024 17:05:13
> An: Discuss use of Nurdlib, TRLO II, drasi and UCESB.
> Betreff: Re: [subexp-daq] NURDLIB - SIS3316 - problem with RATACLOCK
>
> Dear Günter,
>
> Background:
>
> Rataclock is a one-wire serial protocol to distribute clock _and_ time.
> It sends a clock signal where the leading edges are periodic and can be
> used to drive PLL (e.g. inside the main and ADC FPGAs) and the trailing
> edges are made shorter and longer to encode information about the time.
>
> Thus modules can collect data synchronously, without the need to 'reset'
> the time or such means.
>
> Since the clock is PLL-recovered in each ADC FPGA, it also needs to be
> checked that ist works in each of them.
>
> More below inline...:
>
> On Wed, 29 May 2024, Weber, Guenter Dr. wrote:
>
> >
> > Dear friends,
> >
> >
> > in the merged SIS3316 code we found RATACLOCK, which does not exist (at
> > least not under this name) in the module interface that we took over from
> > Bastian. I also cannot find RATACLOCK in the manual from STRUCK.
> >
> >
> > For a bunch of firmware versions it is hardcoded that
> HAS_RATACLOCK_RECEIVER
> > is true.
> >
> >
> > if (firmware == 0x33165010 || firmware == 0x3316b011
> > || firmware == 0x3316a012 || firmware == 0x3316b012) {
> > m->config.has_rataclock_receiver = 1;
> > }
> >
> > It happens that one of our modules has indeed firmware version 0x3316a012.
> > So, this variable is set to true. This results in the following check:
> >
> >
> > void
> > sis_3316_test_clock_sync(struct Sis3316Module *self)
> > {
> > /* test, if all clocks are still synced */
> > if (self->config.has_rataclock_receiver == 1) {
> > int tries_left = 3;
> > int ok = 1;
> >
> > while (tries_left > 0) {
> > int i;
> >
> > for (i = 0; i < N_ADCS; ++i) {
> > uint32_t status = MAP_READ(self->sicy_map,
> > fpga_adc_rataser_status1(i));
> > int sync = status & 0x7;
> > int lost = (status >> 4) & 0x7;
> > int auto_edge =
> > self->config.rataclock_use_auto_edge;
> > if (sync != 7) {
> > log_error(LOGL, NAME
> > " ADC%d clock not synced "
> > "(sync = %d) "
> > "(tries_left = %d)", i, sync,
> > tries_left);
> > ok = 0;
> > }
> > if (lost != 0) {
> > log_error(LOGL, NAME
> > " ADC%d clock lost sync"
> > "(lost = %d)", i, lost);
> > ok = 0;
> > MAP_WRITE(self->sicy_map,
> > fpga_adc_rataser_control2(i),
> > (1 << 31) | (auto_edge << 2));
> >
> > }
> > }
> > if (ok == 0) {
> > tries_left -= 1;
> > time_sleep(1e-3);
> > } else {
> > LOGF(debug)(LOGL, "rataser clock synced.");
> > break;
> > }
> > MAP_WRITE(self->sicy_map, reset_adc_clock, 0x0);
> > time_sleep(30e-3);
> > }
> > }
> > }
> >
> > And we receive an error message that our ADCs are not synchronized. As I
> > have no idea what RATACLOCK is, it is hard for me to figure out what is
> > happening.
> >
> >
> > However, there is also the parameter USE_RATACLOCK. It is set to 0 by
> > default. So, maybe it is simply a bug that the check for synchronization
> is
> > executed just on the basis of if (self->config.has_rataclock_receiver ==
> 1),
> > while not also checking for if (self->config.use_rataclock == 1)?
>
> It sounds like it. Could you see if things work if you add such a check
> (i.e. only do that rataclock sync check if use_rataclock == 1)?
>
> > But shouldn't the expectation be that the ADCs are always synchronized?
> So,
> > maybe this is still a problem with the configuration of our module?
> >
> >
> > Sorry for this confusion. I would really appreciate if someone could
> explain
> > what is going on here 😊
>
> Cheers,
> Håkan
>
>
More information about the subexp-daq
mailing list