Code: Select all
#!/usr/bin/env python
# Simple Python Program to program ADF4360-X VCO from RPi
# Written by David Crump, G8GKQ, 22 Feb 14.
# Feel free to modify, copy, use or abuse as you wish
import RPi.GPIO as GPIO
import os
import time
GPIO.setmode(GPIO.BCM)
DEBUG = 1 # set to 0 for quiet operation, 1 for verbose
# ------------------- DEFINE delay  ------------------
def delay(delayms): #in millisec
    time.sleep(delayms/1000)
    return 0
# ------------------- END OF delay  ------------------
# ------------------- DEFINE sendchar  ------------------
# Ouputs one hex 4-bit character MSB first
# Entry and exit with clock low after delay
def sendchar(hexchar): 
# first convert hexchar to integer (hexint)
    if hexchar == "0":
        hexint = 0
    elif hexchar == "1":
        hexint = 1
    elif hexchar == "2":
        hexint = 2
    elif hexchar == "3":
        hexint = 3
    elif hexchar == "4":
        hexint = 4
    elif hexchar == "5":
        hexint = 5
    elif hexchar == "6":
        hexint = 6
    elif hexchar == "7":
        hexint = 7
    elif hexchar == "8":
        hexint = 8
    elif hexchar == "9":
        hexint = 9
    elif hexchar == "a" or hexchar == "A":
        hexint = 10
    elif hexchar == "b" or hexchar == "B":
        hexint = 11
    elif hexchar == "c" or hexchar == "C":
        hexint = 12
    elif hexchar == "d" or hexchar == "D":
        hexint = 13
    elif hexchar == "e" or hexchar == "E":
        hexint = 14
    elif hexchar == "f" or hexchar == "F":
        hexint = 15
    else:
        print('Invalid Hex Character')
        return
    commandout = hexint
    commandout <<= 4    # shift left 4 as we only need to send 4 bits here
    for i in range(4):
            if (commandout & 0x80): 
                    GPIO.output(SPIMOSI, True)
                    if DEBUG == 1:
                        print('Sent 1')
            else:   
                    GPIO.output(SPIMOSI, False)
                    if DEBUG == 1:
                        print('Sent 0')
            commandout <<= 1 # Shift left 1
            delay(1)
            GPIO.output(SPICLK, True)
            delay(2)
                
            GPIO.output(SPICLK, False)
            delay(1)
                
# ------------------- END OF sendchar  ------------------
# ------------------- DEFINE send6string  ------------------
                
def send6string(hex6string):
# sets load enable low (false)
        GPIO.output(SPICS, False)     # bring CS low
# sets clock low
        GPIO.output(SPICLK, False)  # start clock low
        
# peels first char off string
        hexchar1 = hex6string[0:1]
# calls sendchar
        sendchar(hexchar1)
#select last 5 chars
        hex5string = hex6string[-5:]
        
# peels second char off string
        hexchar2 = hex5string[:1]
# calls sendchar
        sendchar(hexchar2)
#select last 4 chars
        hex4string = hex5string[-4:]
        
# peels third char off string
        hexchar3 = hex4string[:1]
# calls sendchar
        sendchar(hexchar3)
#select last 3 chars
        hex3string = hex4string[-3:]
        
# peels fourth char off string
        hexchar4 = hex3string[:1]
# calls sendchar
        sendchar(hexchar4)
#select last 2 chars
        hex2string = hex3string[-2:]
        
# peels fifth char off string
        hexchar5 = hex2string[:1]
# calls sendchar
        sendchar(hexchar5)
#select last char
        hex1string = hex2string[-1:]
        
# peels sixth char off string
        hexchar6 = hex1string
# calls sendchar
        sendchar(hexchar6)
        
# sets load enable high to load data
        GPIO.output(SPICS, True)
# ------------------- END OF send6string  ------------------
# ------------------- DEFINE setparams  ------------------
# This sends the three 6-character strings to the VCO in sequence
def setparams(RCounter, Control, NCounter):
    send6string(RCounter)
#   no delay
    send6string(Control)
    delay(5)                  # 5 ms delay
    send6string(NCounter)
# ------------------- END OF setparams  ------------------
# ------------------- MAIN PROG STARTS HERE ------------------
if DEBUG == 1:
    print ('Started')
    GPIO.setwarnings(True)
else:
    GPIO.setwarnings(False)
    
GPIO.cleanup()    # Reset All the ports
# Set the Pi GPIO ports for the SPI Bus
SPICLK = 11  #  Pi pin 23 to old PIC pin 6
SPIMISO = 9  #  Pi pin 21 not used
SPIMOSI = 10 #  Pi pin 19 to old PIC pin 7
SPICS = 8    #  Pi pin 24 to old PIC pin 3
# Ground      Pi pin 6 to old PIC pin 8
# Set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
# Send the parameters required:
#     Examples:
#     setparams('300191','9FE924','018652') # Powerdown
#     setparams('300191','8FE924','018652') # 1250 MHz, 100KHz step
#     setparams('300191','8FE924','018E3A') # 1275 MHz, 100KHz step
#     setparams('300051','8FF924','004F5A') # 1275 MHz, 500KHz step
#     setparams('300191','8FE924','017702') # 1200 MHz, 100KHz step
#     setparams('300191','8FE924','01B542') # 1400 MHz, 100KHz step
setparams('300191','8FE924','018652') # 1250 MHz, 100KHz step
if DEBUG == 1:
    print ('Finished')
# GPIO.cleanup()   Don't clean-up here or ports go open circuit
#                  and noise resets VCO
# ------------------- MAIN PROG ENDS HERE ------------------
Edit: I have posted an improved version below.
Dave
G8GKQ