#!/usr/bin/env python
#
# Vaisala RS92-SGP Frequency Reprogramming Script
# By Mark Jessop, 24-03-2011
# mjessop@eleceng.adelaide.edu.au
#
# To use this script, you will need a Bus Pirate, information is available at:
# http://code.google.com/p/the-bus-pirate/
#
# The pyBusPirate libraries are available from:
# https://github.com/audiohacked/pyBusPirate
#
# You will also need pySerial: http://pyserial.sourceforge.net/
#
# You will also need a cable to connect the bus pirate to the Sonde. The pin
# connections for my cable is as follows:
#
# Bus Pirate SONDE16-pin
# ---------------------------
# 1 = GND 3 = GND
# 2 = 3V3 16 = VCC
# 3 = 5V
# 4 = ADC
# 5 = Vpu
# 6 = AUX
# 7 = CLK 12 = EEPROM CLK
# 8 = MOSI 11 = EEPROM D (in)
# 9 = CS 10 = EEPROM CS
# 10 = MISO 13 = EEPROM Q (out)
#
# The 16-pin connector is the un-populated pin-header at the bottom-right of
# the board, not the edge connector.
#
from pyBusPirate.BinaryMode.SPI import *
import math,sys,time
# Enter your serial port information here
SERIAL_PORT = "/dev/tty.usbserial-A7004E8c"
SERIAL_BAUD = 115200
MIN_FREQ = 400.0
MAX_FREQ = 423.0
F1_ADDR = [0x70,0x02]
F2_ADDR = [0x70,0x03]
EEPROM_WRITE_ENABLE = 0x06
EEPROM_WRITE_BYTE = 0x02
EEPROM_READ_BYTE = 0x03
def freq_to_bytes(freq):
freq = float(freq)
if(freq>MAX_FREQ or freq<MIN_FREQ):
print "Frequency out of PLL lock range"
return [0]
freq = freq - MIN_FREQ
f2 = int(math.floor(freq/2.560))
f1 = int(math.floor((freq-(f2*2.560))/0.01))
return [f1,f2]
def bytes_to_freq(f1,f2):
f1 = int(f1)
f2 = int(f2)
freq = (((f1<<8)/256.0)*10 + 400000 + f2*2560.0)/1000.0
return "%.3f" % freq
def prog_freq(freq):
freq_bytes = freq_to_bytes(freq)
if(len(freq_bytes)==1):
print "Bad Frequency. Halting."
return 0
print "Chosen Frequency = " + str(freq) + "MHz"
print "Hex values are " + hex(freq_bytes[0]) + "," + hex(freq_bytes[1])
print "Opening serial connection to bus pirate..."
spi = SPI(SERIAL_PORT,SERIAL_BAUD)
print "Entering binmode: ",
if spi.BBmode():
print "OK."
else:
print "Failed."
return -1
print "Entering raw SPI mode: ",
if spi.enter_SPI():
print "OK."
else:
print "Failed."
return -1
print "Configuring SPI:"
if spi.cfg_pins(PinCfg.POWER | PinCfg.CS):
print "3V3 Power On."
else:
print "Pin Configuration Failed?"
if spi.set_speed(SPISpeed._125KHZ):
print "SPI Speed set to 125KHz."
if spi.cfg_spi(SPICfg.CLK_EDGE | SPICfg.OUT_TYPE):
print "SPI Configuration Finished."
spi.timeout(0.2)
print ""
print "Reading current frequency: ",
spi.CS_Low()
f1 = spi.bulk_trans(4,[EEPROM_READ_BYTE,F1_ADDR[0],F1_ADDR[1],0])[-1]
spi.CS_High()
time.sleep(0.05)
spi.CS_Low()
f2 = spi.bulk_trans(4,[EEPROM_READ_BYTE,F2_ADDR[0],F2_ADDR[1],0])[-1]
spi.CS_High()
print bytes_to_freq(ord(f1),ord(f2)) + "MHz"
response = str(raw_input("Confirm Programming of new frequency ("+str(freq)+"MHz)? "))
if(response != "y"):
print "Not programming."
return -1
print "Clearing Status Bits."
spi.CS_Low()
spi.bulk_trans(1,[EEPROM_WRITE_ENABLE])
spi.CS_High()
time.sleep(0.05)
spi.CS_Low()
spi.bulk_trans(2,[0x01,0x00])
spi.CS_High()
time.sleep(0.2)
print "Status Register: ",
spi.CS_Low()
status_register = ord(spi.bulk_trans(2,[0x05,0,00])[-1])
spi.CS_High()
print hex(status_register)
if(status_register != 0):
print "Status register not clear, cannot write!"
return -1
print "Writing f1. ",
spi.CS_Low()
spi.bulk_trans(1,[EEPROM_WRITE_ENABLE])
spi.CS_High()
time.sleep(0.2)
spi.CS_Low()
spi.bulk_trans(4,[EEPROM_WRITE_BYTE,F1_ADDR[0],F1_ADDR[1],freq_bytes[0]])
spi.CS_High()
time.sleep(0.2)
print "Writing f2."
spi.CS_Low()
spi.bulk_trans(1,[EEPROM_WRITE_ENABLE])
spi.CS_High()
time.sleep(0.2)
spi.CS_Low()
spi.bulk_trans(4,[EEPROM_WRITE_BYTE,F2_ADDR[0],F2_ADDR[1],freq_bytes[1]])
spi.CS_High()
time.sleep(0.2)
print "Confirming Write: ",
spi.CS_Low()
f1 = spi.bulk_trans(4,[EEPROM_READ_BYTE,F1_ADDR[0],F1_ADDR[1],0])[-1]
spi.CS_High()
time.sleep(0.05)
spi.CS_Low()
f2 = spi.bulk_trans(4,[EEPROM_READ_BYTE,F2_ADDR[0],F2_ADDR[1],0])[-1]
spi.CS_High()
new_freq = bytes_to_freq(ord(f1),ord(f2))
if(new_freq == bytes_to_freq(freq_bytes[0],freq_bytes[1])):
print "OK - Frequency set to " + new_freq + "MHz."
else:
print "Error: Freq = " + new_freq
spi.resetBP()
freq = float(raw_input("Enter new frequency (MHz): "))
prog_freq(freq)