ООО «Остек-Электро»
Молдавская ул., д. 5, стр. 2, Москва, Россия, 121467
Тел.: +7 (495) 788-44-44, факс: +7 (495) 788-44-42,
www.ostec-group.ru, info@ostec-group.ru
ИНН 7731483966, КПП 773101001, ОГРН 5147746324754,
ОКПО 17184889
Группа Остек +7 495 788-44-44
Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
JFT-скрипты на Python'е, Размещайте здесь интересные скрипты на Питоне для JTAG-тестирования
 
Приглашаем всех желающих размещать в данной теме скрипты на языке Python, которые были использованы вами для проверки различных компонентов и узлов изделий при помощи технологии периферийного сканирования.
 
Вот интересный скрипт для проверки датчика температуры TCN75A от Microchip. В функции
Declare_I2C_Pins("U12.E21","U12.F22") выводы моей FPGA (U12), естественно, необходимо заменить на свои. Скрипт еще проверяет, что считанная температура входит в заданный диапазон в конструкции IF. Если температура не входит в диапазон, формируется флаг выхода Exit(1) для того, чтобы при тестировании было FAIL. Можно использовать как пример, адресс и данные конечно зависят от применяемых девайсов. нужно чтобы была установлена библиотека I2C.py
Код

from jft import *
from I2C import *

Declare_I2C_Pins("U12.E21","U12.F22") #I2C.py function. Declares SCL and SDA nets
Set_I2C_Address("1001000") #Set the I2C address. Datasheet for TCN75A shows address is 0x48
WRITE("00000000") #Access Register 0x00 (Ambient temperature register)
Ambient_Temp_Reg_Byte1 = READ()
Ambient_Temp_Reg_Byte2 = READ()
print("Ambient temp register upper half = ",Ambient_Temp_Reg_Byte1)
print("Ambient temp register lower half = ",Ambient_Temp_Reg_Byte2)

Temp = ( Ambient_Temp_Reg_Byte1 & 0x7F) + (0.5 * ( Ambient_Temp_Reg_Byte2 >> 7))

print("Temperature is", Temp, "degrees")

if (Temp < 10 or Temp >= 29):
    print ("Temperature out of range!")
    exit (1)
 
Имеется скрипт для проверки (аналогично предыдущему примеру) температуры, но уже не по I2C-интерфейсу, а по SPI.
Компонент AD7814.
Используются две библиотеки: "jft" и "time".
В итоге в течение 10 секунд происходит измерение температуры внутреннего датчика микросхемы.

Код

#******************************************#
# Application: D13_readingTemperature
#******************************************#

#******************************************#
# Imports
#******************************************#
# Write your Imports here.
import jft
import time
#******************************************#
# Program
#******************************************#
# Write your Program here.
jft.DeclareVars((
    ("CS","D1.K1"),
    ("SCK","D1.H2"),
    ("MISO","D1.H1"),
    ("MOSI","D1.J3")
    ))

def GetT():
    jft.IH("CS")
    jft.IH("SCK")
    jft.IL("MOSI")
    jft.ID("MISO")
    jft.IL("CS")    # select D13
    readBit=[0,0,0,0,0,0,0,0,0,0,0]
    #begin
    for counter in range (0,11):
        jft.IL("SCK")  
        jft.IH("SCK")
        readBit[counter]=jft.GetVar("MISO")
        jft.IL("SCK")

    temp=readBit[8]+readBit[7]*2+readBit[6]*4+readBit[5]*8+readBit[4]*16+readBit[3]*32+readBit[2]*64+readBit[9]*0.5+readBit[10]*0.25
    
    jft.IH("CS")
    jft.IH("SCK")
    return temp
    

start_time=time.time()
while (time.time()-start_time)<10:
    a=GetT()
    print("Real temperature is",a, "degrees")


 
Модераторы сказали, что теперь должна работать загрузка файлов: не обязательно писать код в тексте поста
 
Предлагаю вашему вниманию скрипт, написанный для тестирования микросхемы часов реального времени RTC8564 (Epson), которая имеет интерфейс I2C.
Рекомендуется считывать данные о дате и времени несколько раз в течение некоторого отрезка времени. Связано это с тем, что бывает, часы "не ходят", хотя и записать, и считать информацию не составляет проблемы. В этом случае неисправность микросхемы можно прозевать.
Данный код можно легко модифицировать для работы с любым I2C-устройством, хранящим информацию во внутренних регистрах. Следует только подставить требуемые адреса регистров, скорректировав их длину.
Потребуется библиотека "I2C.py".

Код

#******************************************#
# Импорт библиотек
import jft
import I2C
import time

#******************************************#
# Зададим функции

def write2reg(register,data):
    # Подпрограмма записи данных в регистры в корректной форме
    bit7="0"
    bit6="0"
    bit5="0"
    if data>=40:
        bit7="1"
        data=data-40
    if data>=20:
        bit6="1"
        data=data-20
    if data>=10:
        bit5="1"
        data=data-10
    lbits=bin(data)[2:]
    while len(lbits)!=4:
        lbits="0" + lbits
    bindata="0" + bit7 + bit6 + bit5 + lbits
    binreg=bin(register)[2:]
    while len(binreg)!=8:
        binreg="0" + binreg
    #print (bindata)
    #print (binreg)
    I2C.WRITE(binreg)
    I2C.WRITE(bindata)
    I2C.STOP_CONDITION()
    
def readData(register):
# Подпрограмма чтения данных из регистров
    binreg=bin(register)[2:]
    while len(binreg)!=8:
        binreg="0" + binreg
    #print(binreg)
    I2C.WRITE(binreg)
    ans=I2C.READ()
    I2C.STOP_CONDITION()
    if register==4 or register==5:
        ret = 20*(ans >> 5 & 1) + 10*(ans >> 4 & 1) + (ans & 0b1111)
    elif register==7:
        ret = 10*(ans >> 4 & 1) + (ans & 0b1111)
    else:
        ret = 40*(ans >> 6 & 1) + 20*(ans >> 5 & 1) + 10*(ans >> 4 & 1) + (ans & 0b1111)
    strret=str(ret)
    while len(strret)!=2:
        strret="0" + strret
    return strret
    
def setDate(day,month,year):
# Подпрограмма установки даты
    write2reg(5, day)
    write2reg(7, month)
    write2reg(8, year)
    
def setTime(hours,minutes,seconds):
# Подпрограмма установки времени
    write2reg(4, hours)
    write2reg(3, minutes)
    write2reg(2, seconds)
    
def getDate():
# Подпрограмма считывания даты
    day = readData(5)
    month = readData(7)
    year = readData(8)
    return day + "." + month + "." + year
    
def getTime():
# Подпрограмма считывания времени
    hours = readData(4)
    minutes = readData(3)
    seconds = readData(2)
    return hours + ":" + minutes + ":" + seconds
    
#******************************************#
# Программа
#******************************************#

I2C.Declare_I2C_Pins("D1.P15","D1.N14")    # Указываем JTAG-пины, к которым подключена шина I2C
I2C.Set_I2C_Address("1010001")                # Указываем адрес микросхемы часов на шине I2C
setDate(16,1,14)    # d,m,yy                   # Запишем в микросхему часов дату - 16 января 2014 года
setTime(16,17,0)    # h,m,s                     # Запишем в микросхему часов время - 16:17

# Теперь проверим
print ("Time in RTC device - ", getTime(), " | Date in RTC device - ", getDate())

 
Предлагаем вам скрипт, который позволяет протестировать напряжения, подающиеся на расположенный на печатной плате 12-битный АЦП AD7888.
АЦП общается с JTAG-компонентом D1 через последовательный интерфейс SPI. Функции для работы с SPI взяты из библиотеки "SPI.py", доступной пользователям систем JTAG Live Studio и JTAG ProVision.
Мы последовательно опрашиваем 4 входных канала АЦП, к которым подключены различные напряжения со стабилизаторов платы - 5В, 3.3В, 2.5В и 1.2В. Т.к. опорное напряжение ЦАП равно 2.5 В, первые три величины подаются на входы через резистивные делители с разными коэффициентами деления. Вследствие этого рассчитанные напряжения требуется увеличить в 3 или 2 раза (см. текст скрипта).

Код

#******************************************#
# Imports
#******************************************#
import jft
import time
import SPI
#******************************************#
# Program
#******************************************#

def readV(command):              # Подпрограмма чтения данных из АЦП
    readUnits = SPI.writeRead_bitwise(command,"0000111111111111") # Маска для принимаемых данных – первые 4 бита игнорируются
    Units = int(readUnits, 2)    # Перевод из двоичной формы в десятичную
    V = 2.5*Units/4096           # Перевод показаний АЦП в напряжение, опорное напряжение UREF = 2.5 В, разрядность АЦП: 12 бит - 2^12 = 4096 единиц
    return V

SPI.Declare_SPI_Pins("D1.L19","D1.L23","D1.L22","D1.L21")     # Декларируем выводы SPI: #SS, SCLK, MISO, MOSI
SPI.Declare_SPI_Mode(3, 0)           # Режим работы SPI: MSB-FIRST, CPOL=0. См.файл SPI.py

print ("Voltage measurements:")
V0 = readV("10000100")                         # Опрос нулевого регистра для синхронизации
V1 = readV("10001100") * 3                     # Опрос канала №1, расчет реального напряжения на резистивном делителе 3:1
print ("Net '+5V' = %0.3f" %(V1), "Volts")     # вывод измеренного напряжения на цепи «+5V»
V2 = readV("10010100") * 2                     # Опрос канала №2, делитель 2:1
print ("Net '+3V3' = %0.3f" %(V2), "Volts")    # вывод измеренного напряжения на цепи «+3V3»
V3 = readV("10011100") * 2                     # Опрос канала №3, делитель 2:1
print ("Net '+2V5' = %0.3f" %(V3), "Volts")    # вывод измеренного напряжения на цепи «+2V5»
V4 = readV("10100100") * 1                     # Опрос канала №4, делитель 1:1
print ("Net '+1V2' = %0.3f" %(V4), "Volts")    # вывод измеренного напряжения на цепи «+1V2»

Страницы: 1
Читают тему