6
6
#include "dds.h"
7
7
8
8
#define DURATION_WRITE 5
9
- #define DURATION_INIT (8 *DURATION_WRITE)
10
- #define DURATION_PROGRAM (8*DURATION_WRITE)
9
+ #define DURATION_INIT (7 *DURATION_WRITE) /* not counting FUD */
10
+ #define DURATION_PROGRAM (8*DURATION_WRITE) /* not counting FUD */
11
11
12
12
#define DDS_WRITE (addr , data ) do { \
13
13
rtio_o_address_write(addr); \
@@ -25,7 +25,7 @@ void dds_init_all(void)
25
25
now = rtio_get_counter () + 10000 ;
26
26
for (i = 0 ;i < DDS_CHANNEL_COUNT ;i ++ ) {
27
27
dds_init (now , i );
28
- now += DURATION_INIT ;
28
+ now += DURATION_INIT + DURATION_WRITE ; /* + FUD time */
29
29
}
30
30
while (rtio_get_counter () < now );
31
31
}
@@ -50,7 +50,7 @@ void dds_init(long long int timestamp, int channel)
50
50
DDS_WRITE (DDS_FUD , 0 );
51
51
}
52
52
53
- static void dds_set_one (long long int now , long long int timestamp , int channel ,
53
+ static void dds_set_one (long long int now , long long int ref_time , int channel ,
54
54
unsigned int ftw , unsigned int pow , int phase_mode )
55
55
{
56
56
DDS_WRITE (DDS_GPIO , channel );
@@ -67,11 +67,19 @@ static void dds_set_one(long long int now, long long int timestamp, int channel,
67
67
DDS_WRITE (DDS_FTW2 , (ftw >> 16 ) & 0xff );
68
68
DDS_WRITE (DDS_FTW3 , (ftw >> 24 ) & 0xff );
69
69
70
+ /* We assume that the RTIO clock is DDS SYNCLK */
70
71
if (phase_mode == PHASE_MODE_TRACKING )
71
- /* We assume that the RTIO clock is DDS SYNCLK */
72
- pow += (timestamp >> RTIO_FINE_TS_WIDTH )* ftw >> 18 ;
72
+ pow += (ref_time >> RTIO_FINE_TS_WIDTH )* ftw >> 18 ;
73
+ if (phase_mode != PHASE_MODE_CONTINUOUS ) {
74
+ long long int fud_time ;
75
+
76
+ fud_time = now + 2 * DURATION_WRITE ;
77
+ pow -= ((ref_time - fud_time ) >> RTIO_FINE_TS_WIDTH )* ftw >> 18 ;
78
+ }
79
+
73
80
DDS_WRITE (DDS_POW0 , pow & 0xff );
74
81
DDS_WRITE (DDS_POW1 , (pow >> 8 ) & 0x3f );
82
+ DDS_WRITE (DDS_FUD , 0 );
75
83
}
76
84
77
85
struct dds_set_params {
@@ -83,7 +91,7 @@ struct dds_set_params {
83
91
84
92
static int batch_mode ;
85
93
static int batch_count ;
86
- static long long int batch_fud_time ;
94
+ static long long int batch_ref_time ;
87
95
static struct dds_set_params batch [DDS_MAX_BATCH ];
88
96
89
97
void dds_batch_enter (long long int timestamp )
@@ -92,7 +100,7 @@ void dds_batch_enter(long long int timestamp)
92
100
exception_raise (EID_DDS_BATCH_ERROR );
93
101
batch_mode = 1 ;
94
102
batch_count = 0 ;
95
- batch_fud_time = timestamp ;
103
+ batch_ref_time = timestamp ;
96
104
}
97
105
98
106
void dds_batch_exit (void )
@@ -103,13 +111,13 @@ void dds_batch_exit(void)
103
111
if (!batch_mode )
104
112
exception_raise (EID_DDS_BATCH_ERROR );
105
113
rtio_chan_sel_write (RTIO_DDS_CHANNEL );
106
- now = batch_fud_time - batch_count * DURATION_PROGRAM ;
114
+ /* + FUD time */
115
+ now = batch_ref_time - batch_count * (DURATION_PROGRAM + DURATION_WRITE );
107
116
for (i = 0 ;i < batch_count ;i ++ ) {
108
- dds_set_one (now , batch_fud_time ,
117
+ dds_set_one (now , batch_ref_time ,
109
118
batch [i ].channel , batch [i ].ftw , batch [i ].pow , batch [i ].phase_mode );
110
- now += DURATION_PROGRAM ;
119
+ now += DURATION_PROGRAM + DURATION_WRITE ;
111
120
}
112
- DDS_WRITE (DDS_FUD , 0 );
113
121
batch_mode = 0 ;
114
122
}
115
123
@@ -126,11 +134,7 @@ void dds_set(long long int timestamp, int channel,
126
134
batch [batch_count ].phase_mode = phase_mode ;
127
135
batch_count ++ ;
128
136
} else {
129
- long long int now ;
130
-
131
137
rtio_chan_sel_write (RTIO_DDS_CHANNEL );
132
138
dds_set_one (timestamp - DURATION_PROGRAM , timestamp , channel , ftw , pow , phase_mode );
133
- now = timestamp ;
134
- DDS_WRITE (DDS_FUD , 0 );
135
139
}
136
140
}
0 commit comments