forked from M-Labs/artiq
added sync for AD9914
This commit is contained in:
parent
b7151a253f
commit
c4d17138a1
|
@ -14,6 +14,11 @@ PHASE_MODE_TRACKING = 2
|
||||||
def dds_init(time_mu: TInt64, bus_channel: TInt32, channel: TInt32) -> TNone:
|
def dds_init(time_mu: TInt64, bus_channel: TInt32, channel: TInt32) -> TNone:
|
||||||
raise NotImplementedError("syscall not simulated")
|
raise NotImplementedError("syscall not simulated")
|
||||||
|
|
||||||
|
@syscall(flags={"nowrite"})
|
||||||
|
def dds_init_sync(time_mu: TInt64, bus_channel: TInt32,
|
||||||
|
channel: TInt32, sync_delay: TInt32) -> TNone:
|
||||||
|
raise NotImplementedError("syscall not simulated")
|
||||||
|
|
||||||
@syscall(flags={"nowrite"})
|
@syscall(flags={"nowrite"})
|
||||||
def dds_set(time_mu: TInt64, bus_channel: TInt32, channel: TInt32, ftw: TInt32,
|
def dds_set(time_mu: TInt64, bus_channel: TInt32, channel: TInt32, ftw: TInt32,
|
||||||
pow: TInt32, phase_mode: TInt32, amplitude: TInt32) -> TNone:
|
pow: TInt32, phase_mode: TInt32, amplitude: TInt32) -> TNone:
|
||||||
|
@ -151,6 +156,24 @@ class _DDSGeneric:
|
||||||
timing margin."""
|
timing margin."""
|
||||||
dds_init(now_mu(), self.bus_channel, self.channel)
|
dds_init(now_mu(), self.bus_channel, self.channel)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def init_sync(self, sync_delay=0):
|
||||||
|
"""Resets and initializes the DDS channel as well as configures
|
||||||
|
the AD9914 DDS for synchronisation. The synchronisation procedure
|
||||||
|
follows the steps outlined in the AN-1254 application note.
|
||||||
|
|
||||||
|
This needs to be done for each DDS channel before it can be used, and
|
||||||
|
it is recommended to use the startup kernel for this.
|
||||||
|
|
||||||
|
This function cannot be used in a batch; the correct way of
|
||||||
|
initializing multiple DDS channels is to call this function
|
||||||
|
sequentially with a delay between the calls. 10ms provides a good
|
||||||
|
timing margin.
|
||||||
|
|
||||||
|
:param sync_delay: integer from 0 to 0x3f that sets value of
|
||||||
|
SYNC_OUT (bits 3-5) and SYNC_IN (bits 0-2) delay ADJ bits."""
|
||||||
|
dds_init_sync(now_mu(), self.bus_channel, self.channel, sync_delay)
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def set_phase_mode(self, phase_mode):
|
def set_phase_mode(self, phase_mode):
|
||||||
"""Sets the phase mode of the DDS channel. Supported phase modes are:
|
"""Sets the phase mode of the DDS channel. Supported phase modes are:
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define DURATION_DAC_CAL (147000 << CONFIG_RTIO_FINE_TS_WIDTH)
|
#define DURATION_DAC_CAL (147000 << CONFIG_RTIO_FINE_TS_WIDTH)
|
||||||
/* not counting final FUD */
|
/* not counting final FUD */
|
||||||
#define DURATION_INIT (8*DURATION_WRITE + DURATION_DAC_CAL)
|
#define DURATION_INIT (8*DURATION_WRITE + DURATION_DAC_CAL)
|
||||||
|
#define DURATION_INIT_SYNC (16*DURATION_WRITE + 2*DURATION_DAC_CAL)
|
||||||
#define DURATION_PROGRAM (6*DURATION_WRITE) /* not counting FUD */
|
#define DURATION_PROGRAM (6*DURATION_WRITE) /* not counting FUD */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -83,6 +84,41 @@ void dds_init(long long int timestamp, int bus_channel, int channel)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dds_init_sync(long long int timestamp, int bus_channel, int channel, int sync_delay)
|
||||||
|
{
|
||||||
|
long long int now;
|
||||||
|
|
||||||
|
now = timestamp - DURATION_INIT_SYNC;
|
||||||
|
|
||||||
|
#ifdef CONFIG_DDS_ONEHOT_SEL
|
||||||
|
channel = 1 << channel;
|
||||||
|
#endif
|
||||||
|
channel <<= 1;
|
||||||
|
DDS_WRITE(DDS_GPIO, channel);
|
||||||
|
|
||||||
|
#ifdef CONFIG_DDS_AD9914
|
||||||
|
DDS_WRITE(DDS_CFR4H, 0x0105); /* Enable DAC calibration */
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
now += DURATION_DAC_CAL;
|
||||||
|
DDS_WRITE(DDS_CFR4H, 0x0005); /* Disable DAC calibration */
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
DDS_WRITE(DDS_CFR2L, 0x8b00); /* Enable matched latency and sync_out*/
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
/* Set cal with sync and set sync_out and sync_in delay */
|
||||||
|
DDS_WRITE(DDS_USR0, 0x0840 | (sync_delay & 0x3f));
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
DDS_WRITE(DDS_CFR4H, 0x0105); /* Enable DAC calibration */
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
now += DURATION_DAC_CAL;
|
||||||
|
DDS_WRITE(DDS_CFR4H, 0x0005); /* Disable DAC calibration */
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
DDS_WRITE(DDS_CFR1H, 0x0000); /* Enable cosine output */
|
||||||
|
DDS_WRITE(DDS_CFR2H, 0x0080); /* Enable profile mode */
|
||||||
|
DDS_WRITE(DDS_ASF, 0x0fff); /* Set amplitude to maximum */
|
||||||
|
DDS_WRITE(DDS_FUD, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Compensation to keep phase continuity when switching from absolute or tracking
|
/* Compensation to keep phase continuity when switching from absolute or tracking
|
||||||
* to continuous phase mode. */
|
* to continuous phase mode. */
|
||||||
static unsigned int continuous_phase_comp[CONFIG_RTIO_DDS_COUNT][CONFIG_DDS_CHANNELS_PER_BUS];
|
static unsigned int continuous_phase_comp[CONFIG_RTIO_DDS_COUNT][CONFIG_DDS_CHANNELS_PER_BUS];
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#define DDS_FTWH 0x2f
|
#define DDS_FTWH 0x2f
|
||||||
#define DDS_POW 0x31
|
#define DDS_POW 0x31
|
||||||
#define DDS_ASF 0x33
|
#define DDS_ASF 0x33
|
||||||
|
#define DDS_USR0 0x6d
|
||||||
#define DDS_FUD 0x80
|
#define DDS_FUD 0x80
|
||||||
#define DDS_GPIO 0x81
|
#define DDS_GPIO 0x81
|
||||||
#endif
|
#endif
|
||||||
|
@ -57,6 +58,8 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
void dds_init(long long int timestamp, int bus_channel, int channel);
|
void dds_init(long long int timestamp, int bus_channel, int channel);
|
||||||
|
void dds_init_sync(long long int timestamp, int bus_channel, int channel,
|
||||||
|
int sync_delay);
|
||||||
void dds_batch_enter(long long int timestamp);
|
void dds_batch_enter(long long int timestamp);
|
||||||
void dds_batch_exit(void);
|
void dds_batch_exit(void);
|
||||||
void dds_set(long long int timestamp, int bus_channel, int channel,
|
void dds_set(long long int timestamp, int bus_channel, int channel,
|
||||||
|
|
|
@ -121,6 +121,7 @@ static const struct symbol runtime_exports[] = {
|
||||||
|
|
||||||
#if ((defined CONFIG_RTIO_DDS_COUNT) && (CONFIG_RTIO_DDS_COUNT > 0))
|
#if ((defined CONFIG_RTIO_DDS_COUNT) && (CONFIG_RTIO_DDS_COUNT > 0))
|
||||||
{"dds_init", &dds_init},
|
{"dds_init", &dds_init},
|
||||||
|
{"dds_init_sync", &dds_init_sync},
|
||||||
{"dds_batch_enter", &dds_batch_enter},
|
{"dds_batch_enter", &dds_batch_enter},
|
||||||
{"dds_batch_exit", &dds_batch_exit},
|
{"dds_batch_exit", &dds_batch_exit},
|
||||||
{"dds_set", &dds_set},
|
{"dds_set", &dds_set},
|
||||||
|
|
Loading…
Reference in New Issue