Skip to content

Commit 4c1ca46

Browse files
improve reset timing and register content interference
1 parent 7249385 commit 4c1ca46

File tree

1 file changed

+33
-45
lines changed

1 file changed

+33
-45
lines changed

cedargrove_ad9833.py

Lines changed: 33 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ def __init__(
6262
Defaults to 0.
6363
:param str wave_type: The "sine", "triangle", or "square" wave shape.
6464
Defaults to "sine".
65-
:param busio.SPI spi: The `busio.SPI` definition. Defaults to None.
66-
:param board select: The chip select pin designation. Defaults to None.
65+
:param busio.SPI spi: The `busio.SPI` definition. Defaults to `None`.
66+
:param board select: The chip select pin designation. Defaults to `None`.
6767
:param int m_clock: Master clock frequency in Hz. Defaults to 25MHz.
6868
"""
6969

70-
self._spi = spi # Define SPI bus
70+
self._spi = spi # Define SPI bus; 5Mhz clock frequency
7171
self._cs = digitalio.DigitalInOut(select)
7272
self._device = SPIDevice(
7373
self._spi, self._cs, baudrate=5000000, polarity=1, phase=0
@@ -82,11 +82,10 @@ def __init__(
8282
self._freq_reg = 0 # FREQ0
8383
self._phase_reg = 0 # PHASE0
8484

85+
# Reset and pause the device
8586
self._pause = True
8687
self._reset = True
87-
88-
# Reset the device
89-
self.reset()
88+
self._update_control_register()
9089

9190
# Set the master clock frequency
9291
self._m_clock = m_clock
@@ -98,8 +97,8 @@ def wave_freq(self):
9897

9998
@wave_freq.setter
10099
def wave_freq(self, new_wave_freq=440):
101-
""":param int new_wave_freq: The waveform frequency in Hz.
102-
Defaults to 440."""
100+
"""Set the frequency.
101+
:param int new_wave_freq: The waveform frequency in Hz. Defaults to 440."""
103102
self._wave_freq = new_wave_freq
104103
self._wave_freq = max(self._wave_freq, 0)
105104
self._wave_freq = min(self._wave_freq, self._m_clock // 2)
@@ -112,8 +111,8 @@ def wave_phase(self):
112111

113112
@wave_phase.setter
114113
def wave_phase(self, new_wave_phase=0):
115-
""":param int new_wave_phase: The waveform phase offset.
116-
Defaults to 0."""
114+
"""Set the output phase value.
115+
:param int new_wave_phase: The waveform phase offset. Defaults to 0."""
117116
self._wave_phase = int(new_wave_phase)
118117
self._wave_phase = max(self._wave_phase, 0)
119118
self._wave_phase = min(self._wave_phase, 4095)
@@ -126,7 +125,8 @@ def wave_type(self):
126125

127126
@wave_type.setter
128127
def wave_type(self, new_wave_type="sine"):
129-
""":param str new_wave_type: The waveform type. Defaults to 'sine'."""
128+
"""Set the waveform type.
129+
:param str new_wave_type: The waveform type. Defaults to 'sine'."""
130130
self._wave_type = new_wave_type
131131
if self._wave_type not in ("triangle", "square", "sine"):
132132
# Default to sine in type isn't valid
@@ -135,54 +135,42 @@ def wave_type(self, new_wave_type="sine"):
135135

136136
def pause(self):
137137
"""Pause the wave generator and freeze the output at the latest voltage
138-
level by stopping the internal clock.
139-
"""
138+
level by stopping the internal clock."""
140139
self._pause = True # Set the pause bit
141140
self._update_control_register()
142141

143142
def start(self):
144143
"""Start the wave generator with current register contents, register
145-
selection and wave mode setting.
146-
"""
147-
self._reset = False # Clear the reset bit
144+
selection and wave mode setting."""
148145
self._pause = False # Clear the clock disable bit
149146
self._update_control_register()
150147

151148
def stop(self):
152149
"""Stop the wave generator and reset the output to the midpoint
153-
voltage level.
154-
"""
155-
self._reset = True # Sets the reset bit
156-
self._pause = True # Set the pause bit
150+
voltage level."""
151+
self._pause = True
152+
self._reset = True
157153
self._update_control_register()
158154

159155
def reset(self):
160156
"""Stop and reset the waveform generator. Pause the master clock.
161-
Update all registers with default values. Set sine wave mode. Clear the
162-
reset mode but keep the master clock paused.
163-
"""
164-
# Reset control register contents, pause, and put device in reset state
157+
Update all registers with default values. Set `sine` wave mode."""
165158
self._reset = True
166159
self._pause = True
167160
self._freq_reg = 0
168161
self._phase_reg = 0
169162
self._wave_type = "sine"
170163
self._update_control_register()
171164

172-
# While reset, zero the frequency and phase registers
165+
# While paused, zero the frequency and phase registers
173166
self._update_freq_register(new_freq=0, register=0)
174167
self._update_freq_register(new_freq=0, register=1)
175168
self._update_phase_register(new_phase=0, register=0)
176169
self._update_phase_register(new_phase=0, register=1)
177170

178-
# Take the waveform generator out of reset state, master clock still paused
179-
self._reset = False
180-
self._update_control_register()
181-
182171
def _send_data(self, data):
183172
"""Send a 16-bit word through SPI bus as two 8-bit bytes.
184-
:param int data: The 16-bit data value to write to the SPI device.
185-
"""
173+
:param int data: The 16-bit data value to write to the SPI device."""
186174
data &= 0xFFFF
187175
tx_msb = data >> 8
188176
tx_lsb = data & 0xFF
@@ -192,21 +180,22 @@ def _send_data(self, data):
192180

193181
def _update_control_register(self):
194182
"""Construct the control register contents per existing local parameters
195-
then send the new control register word to the waveform generator.
196-
"""
197-
# Set default control register mask value (sine wave mode)
198-
control_reg = 0x2000
199-
183+
then send the new control register word to the waveform generator."""
200184
if self._reset:
201-
# Set the reset bit
202-
control_reg |= 0x0100
185+
# Immediately reset before updating register
186+
self._send_data(0x2100)
187+
self._reset = False
188+
# return
189+
190+
# Set default control register mask value (sine mode, disable reset)
191+
control_reg = 0x2000
203192

204193
if self._pause:
205194
# Disable master clock bit
206195
control_reg |= 0x0080
207196

208-
control_reg |= self._freq_reg << 11 # Frequency register select bit
209-
control_reg |= self._phase_reg << 10 # Phase register select bit
197+
control_reg |= (self._freq_reg & 0x01) << 11 # Frequency register select bit
198+
control_reg |= (self._phase_reg & 0x01) << 10 # Phase register select bit
210199

211200
if self._wave_type == "triangle":
212201
# Set triangle mode
@@ -221,12 +210,11 @@ def _update_control_register(self):
221210
def _update_freq_register(self, new_freq, register=None):
222211
"""Load inactive register with new frequency value then set the
223212
register active in order to avoid partial frequency changes. Writes to
224-
specified register if != None.
213+
specified register if not `None`.
225214
226215
:param int new_freq: The new frequency value.
227216
:param union(int, None) register: The register for the new value; FREG0
228-
or FREG1. Selects the non-active register if register == None.
229-
"""
217+
or FREG1. Selects the non-active register if register is `None`."""
230218
self._wave_freq = new_freq
231219

232220
if register is None:
@@ -258,11 +246,11 @@ def _update_freq_register(self, new_freq, register=None):
258246
def _update_phase_register(self, new_phase, register=None):
259247
"""Load inactive register with new phase value then set the
260248
register active in order to avoid partial phase changes. Writes to
261-
specified register if != None.
249+
specified register if not `None`.
262250
263251
:param int new_phase: The new phase value.
264252
:param union(int, None) register: The register for the new value; PHASE0
265-
or PHASE1. Selects the non-active register if register == None.
253+
or PHASE1. Selects the non-active register if register is `None`.
266254
"""
267255
self._wave_phase = new_phase
268256

0 commit comments

Comments
 (0)