Select Git revision
set_adc_tm.py
-
Gijs Schoonderbeek authored
Script will check if it is run on a PI, in that case a different I2C serial library is used.
Gijs Schoonderbeek authoredScript will check if it is run on a PI, in that case a different I2C serial library is used.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
set_adc_tm.py 8.81 KiB
'''
Copyright 2021 Stichting Nederlandse Wetenschappelijk Onderzoek Instituten,
ASTRON Netherlands Institute for Radio Astronomy
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Test script to write single registers of RCU2_ADC
'''
import sys
import time
sys.path.insert(0,'.')
import os
if os.name =="posix":
from I2C_serial_pi import *
else:
from I2C_serial import *
sleep_time=0.05
CHECK_I2C_DEVICES = False
WRITE_DATA = True
READ_BYTE = True
PWR_RST = False
SET_ADC = True
CS = 0
SCLK = [1, 3, 5]
SDIO = [0, 2, 4]
ADC_ORDER = [0, 1, 2]
def off_on(address=0x76):
print("Off_on")
I2C_device = I2C(address)
I2C_device.write_bytes(0x06, 00)
I2C_device.write_bytes(0x07, 00)
I2C_device.write_bytes(0x02, 0x0)
I2C_device.write_bytes(0x03, 0x8)
sleep(5)
I2C_device.write_bytes(0x02, 0xF0)
I2C_device.write_bytes(0x03, 0xF0)
def blink_led(address=0x76, times = 5):
print("Blink LED")
I2C_device = I2C(address)
I2C_device.write_bytes(0x07, 00)
for cnt in range(times):
I2C_device.write_bytes(0x03, 0x40)
sleep(0.5)
I2C_device.write_bytes(0x03, 0x80)
sleep(0.5)
I2C_device.write_bytes(0x03, 0x40)
def Write_byte_ADC(ADC_reg_address, ADC_data, ADC_bytes=1, ADC_NR = 0, ADDRESS=0x20):
#
# Write Byte to the ADC
#
I2C_device = I2C(ADDRESS)
ADC_rw = 0x00 # 0 for write, 1 for read
stri = "Write : {0:2x} to Address : {1:2x}".format(ADC_data, ADC_reg_address)
print(stri)
data = ( ADC_rw << 23) + ( ADC_bytes << 21 ) + (ADC_reg_address << 8) + int(ADC_data)
I2C_device.write_bytes(0x06, 00) # Config registers IO-expander
I2C_device.write_bytes(0x07, 00) # Config registers IO-expander
I2C_device.write_bytes(0x03, (0x0F ^ (0x01 << ADC_NR)))
bit_array = "{0:{fill}24b}".format(data, fill='0')
print(bit_array)
for bit in bit_array:
for clk in range(2):
Write_data = 0x00 | (clk << SCLK[ADC_NR]) | (int(bit) << SDIO[ADC_NR])
I2C_device.write_bytes(0x02, Write_data)
# sleep(sleep_time)
for extra_cylces in range(5):
for clk in range(2):
Write_data = 0x00 | (clk << SCLK[ADC_NR]) | (0 << SDIO[ADC_NR])
I2C_device.write_bytes(0x02, Write_data)
Write_data = (0x00 | (0 << SCLK[ADC_NR]) | ( 0 << SDIO[ADC_NR] ))
I2C_device.write_bytes(0x02, Write_data)
I2C_device.write_bytes(0x03, 0x0F)
def Read_byte_ADC(ADC_reg_address, ADC_bytes=0, ADC_NR = 0, ADDRESS=0x20 ):
#
# Read Byte from the ADC
#
I2C_device = I2C(ADDRESS)
ADC_rw = 0x01 # 0 for write, 1 for read
stri = "Read ADC from Address {:8x}".format(ADC_reg_address)
print(stri)
data = ( ADC_rw << 15) + ( ADC_bytes << 13 ) + ADC_reg_address
# print("write read command")
I2C_device.write_bytes(0x06, 00)
I2C_device.write_bytes(0x07, 00)
I2C_device.write_bytes(0x03, (0x0F ^ (0x01 << ADC_NR)))
bit_array = "{0:{fill}16b}".format(data, fill='0')
for bit in bit_array:
for clk in range(2):
Write_data = 0x00 | (clk << SCLK[ADC_NR]) | ( int(bit) << SDIO[ADC_NR] )
I2C_device.write_bytes(0x02, Write_data)
# sleep(sleep_time)
I2C_device.write_bytes(0x03, 0x0F)
# print("read byte")
I2C_device.write_bytes(0x06, (1 << SDIO[ADC_NR]))
I2C_device.write_bytes(0x03, (0x0F ^ (0x01 << ADC_NR)))
read_bit = ''
for cnt in range(8*(ADC_bytes+1)):
for clk in [1,0]: # Read after faling edge
Write_data = 0x00 | (clk << SCLK[ADC_NR]) | ( int(bit) << SDIO[ADC_NR] )
I2C_device.write_bytes(0x02, Write_data)
ret_ack, ret_value = I2C_device.read_bytes(0x00, 1)
if ret_ack:
read_bit += str((int(ret_value, 16) >> SDIO[ADC_NR]) & 0x01)
else:
print("ACK nok")
I2C_device.write_bytes(0x03, 0x0F)
I2C_device.write_bytes(0x07, 00)
Write_data = 0x00 | (0 << SCLK[ADC_NR]) | ( 0 << SDIO[ADC_NR] )
I2C_device.write_bytes(0x02, Write_data)
I2C_device.write_bytes(0x03, 0x0F)
stri = "Read back data is: {0:2x} ".format(int(read_bit, 2))
print(stri)
return read_bit;
def rcu_sensors():
addr = 0x14
Vref = 3.3
one_step = Vref/(2**(16+1))
I2C_device = I2C(addr)
I2C_device.write_bytes(0xB8, 0xB0)
sleep(1)
ret_ack, ret_value = I2C_device.read_last_reg(3)
if ret_ack:
stri = "Return value input 0 : 0x{0} ".format(ret_value)
print(stri)
if int(ret_value, 16) >= 0xC00000:
print("over range")
else:
steps = (int(ret_value, 16) & 0x1FFFFF) >> 6
voltage = one_step * steps
string = "Voltage is {0:.4f}".format(voltage)
print(string)
else:
print("ACK nok")
sleep(1)
temp_slope = 93.5E-6 * 2**(16+1) / Vref
I2C_device.write_bytes(0xA0, 0xE0)
sleep(1)
ret_ack, ret_value = I2C_device.read_last_reg(3)
if ret_ack:
raw_value = (int(ret_value, 16) & 0x1FFFFF) >> 6
temperature_K = (raw_value/temp_slope)
temperature = temperature_K-273
stri = "Return value : 0x{0} Temperature : {1:.2f} gr. C".format(ret_value, temperature)
print(stri)
else:
print("ACK nok")
def rw_eeprom(value=0xAB):
ADDR = 0x50
I2C_eeprom = I2C(0x53)
I2C_eeprom.write_bytes(0x00, value)
I2C_eeprom.write_pointer(0x00)
ret_ack, ret_value = I2C_eeprom.read_last_reg(1)
if ret_ack:
stri = "EEPROM readback : {0} ".format(ret_value)
print(stri)
else:
print("ACK nok")
def power(state):
ADDRESS_IO = 0x76
I2C_IO_device = I2C(ADDRESS_IO)
I2C_IO_device.write_bytes(0x06, 00)
if state=='ON':
print("Switch ON")
bits_to_set = 0x40
I2C_IO_device.write_bytes(0x02, bits_to_set)
else:
I2C_IO_device.write_bytes(0x06, 0xFF)
print("Switch OFF")
bits_to_set = 0x0
def set_gain(gain, channel):
string = "Set Channel {0} to a gain of {1} dB".format(channel, gain)
print(string)
if channel <= 1:
ADDRESS_IO = 0x75
max_gain = 15
min_gain = -6
elif channel <= 2:
ADDRESS_IO = 0x76
max_gain = 20
min_gain = -4
else:
print(" wrong channel number 0 <= Channel <= 2 channel set to 2")
channel = 2
ADDRESS_IO = 0x76
max_gain = 20
min_gain = -4
if min_gain <= gain <= max_gain:
set_gain = max_gain-gain
else:
set_gain = max_gain-min_gain
bits_to_set = set_gain
I2C_IO_device = I2C(ADDRESS_IO)
I2C_IO_device.write_bytes(0x06, 00)
I2C_IO_device.write_bytes(0x07, 00)
if channel == 0:
I2C_IO_device.write_bytes(0x02, bits_to_set)
elif channel == 1:
I2C_IO_device.write_bytes(0x03, bits_to_set)
elif channel == 2:
I2C_IO_device.write_bytes(0x02, bits_to_set | 0x40)
else:
print("no update done")
if PWR_RST:
power(False)
sleep(1)
power(True)
if CHECK_I2C_DEVICES:
blink_led(address = 0x76, times=6)
rw_eeprom(0xAC)
rcu_sensors()
ADC_address = 0x3A # see address table
ADC_data = 0x00 # 8 bits data
ADC_bytes = 0x00 # 00 / 11 + 1 bytes
ADCNR = 1
ADCNR = 1
stri = "Set channel {} in test mode".format(ADCNR)
print(stri)
# Write_byte_ADC(0x5F, 0x14, ADC_NR=ADCNR) # OK ILAS normal mode standard value
# Write_byte_ADC(0x15, 0x07, ADC_NR=ADCNR) # OK CML level
#Write_byte_ADC(0x3A, 0x01, ADC_NR=ADCNR) # SYNC / SYSREF control
# Write_byte_ADC(0x60, 0x80, ADC_NR=ADCNR) # Single ended SYNC pulse
#Write_byte_ADC(0xFF, 0x01, ADC_NR = ADCNR) # ILAS normal mode standard value
#Read_byte_ADC(0x3A, ADC_NR = ADCNR)
#Write_byte_ADC(0x08, 0x35, ADC_NR = 0) # ADC OFF
#Write_byte_ADC(0x08, 0x35, ADC_NR = 1) # ADC OFF
#Write_byte_ADC(0x08, 0x35, ADC_NR = 2) # ADC OFF
#Write_byte_ADC(0x08, 0x00, ADC_NR = 0) # ADC ON
#Write_byte_ADC(0x08, 0x00, ADC_NR = 1) # ADC ON
#Write_byte_ADC(0x14, 0x05, ADC_NR = 2) # Invert signal
#Write_byte_ADC(0x0D, 0x06, ADC_NR = 0) # Ramp output
#Write_byte_ADC(0xFF, 0x01, ADC_NR = 0) # transfer settings
#Write_byte_ADC(0x0D, 0x06, ADC_NR = 1) # Ramp output
#Write_byte_ADC(0xFF, 0x01, ADC_NR = 1) # transfer settings
#Write_byte_ADC(0x0D, 0x06, ADC_NR = 2) # Ramp output
#Write_byte_ADC(0xFF, 0x01, ADC_NR = 2) # transfer settings
#
power('OFF')
blink_led(address=0x76, times=5)
power('ON')
blink_led(address=0x76, times=5)
power('OFF')
blink_led(address=0x76, times=5)
power('ON')