diff --git a/fast-servo/pyfastservo/adc.py b/fast-servo/pyfastservo/adc.py index e2dbf19..04fab50 100644 --- a/fast-servo/pyfastservo/adc.py +++ b/fast-servo/pyfastservo/adc.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - +import time import spidev from pyfastservo.common import ( ADC_AFE_CTRL_ADDR, @@ -78,13 +78,21 @@ def read_frame(): def perform_bitslip(): for i in range(4): current_frame = read_frame() - if current_frame != 0x0C: + if current_frame & 0x0F != 0x0C: print(f"Performing bitslip (iteration: {i}). Current frame: 0x{current_frame:02x}") write_to_memory(ADC_BITSLIP_ADDR, 1) else: print(f"No bitslip required; Current frame: 0x{current_frame:02x}") return +def mmcm_rst(): + curr_cfg = read_from_memory(ADC_AFE_CTRL_ADDR, 1)[0] & 0x0F + write_to_memory(ADC_AFE_CTRL_ADDR, 0x10 | curr_cfg) # Reset MMCM + write_to_memory(ADC_AFE_CTRL_ADDR, 0x00 | curr_cfg) # Release MMCM Reset + while not(read_frame() & 0x10): + print(f"Waiting for MMCM to lock") + time.sleep(0.001) + def find_edge(): prev_frame = read_frame() for tap_delay in range(32): @@ -141,6 +149,9 @@ def configure_ltc2195(): 0x04: test_pattern & 0xFF }) + # ADC software reset put its PLL to sleep momentarily. Thus, MMCM needs to be reset as well. + mmcm_rst() + # Performing Word Align perform_bitslip() find_edge()