SNLA267A March 2019 – June 2019 DS90UB953-Q1 , DS90UB954-Q1 , DS90UB960-Q1
## BIST_953_954_WithForcedError.py
##
## revision 1.1 June 13, 2017
##
########
######################
##
## This script file is used to check the link between the 953 and 954
##
## The Built In Self Test (BIST) generates a puesdo random sequence
## and checks for CRC errors between transmitted and received sequence.
##
## Rev. 1.1
## Added Parity Errors, restructured code
##
##
######################
print "\n\n"
import time
# Define 954 and 953 Addresses
UB953 = 0x30 #953 SER Alias ID, check 0x5C on 954 for confirmation
UB954 = 0x7A #954 Device ID, check 0x00 on 954 for confirmation
# Port selection, Passthrough, and aliasing
#board.WriteI2C(UB954, 0x4C, 0x01) #Enable Port 0 writes
#board.WriteI2C(UB954, 0x58, 0x5E) #I2C Pass through Enabled and BC = 50Mbps
#board.WriteI2C(UB954, 0x5C, 0x18) #953 Alias defined as 0x18
# Digital Reset except for registers
board.WriteI2C(UB953, 0x01, 0x01) #Resets 953
time.sleep(0.5)
board.WriteI2C(UB954, 0x01, 0x01) #Resets 954
time.sleep(0.5)
print ("Devices Reset")
# Confirm Devices can communicate with each other
print ("954 Device ID (0x00):", hex(board.ReadI2C(UB954, 0x00, 1))) #954 Device ID, should be 0x7A, check 0x00 for confirmation
time.sleep(0.5)
print ("953 Device ID (0x00):", hex(board.ReadI2C(UB953, 0x00, 1))) #953 Device ID, should be 0x30, check 0x5B for confirmation
print ("------------------------------------------------------------------")
time.sleep(0.5)
# Read Receiver Lock Status
print ("Receiver Lock Status (0x04):", hex(board.ReadI2C(UB954, 0x04, 0x1))) #0x04 is DEVICE_STS of 954
print ("Should read 0xCF")
print ("------------------------------------------------------------------")
time.sleep(1)
# Enable write for Port0 of FPD3_PORT_SEL
board.WriteI2C(UB954, 0x4C, 0x01) #0x4C is FPD3_PORT_SEL
# Clear Errors and Error Count
board.WriteI2C(UB953, 0x49, 0x28) #0x49 is BC_CTRL. 0x28 selects BIST_CRC ERR CLR and CRC ERR CLR
print ("Read BCC Error Status (0x79):", hex(board.ReadI2C(UB953, 0x79, 1))) #Clear possible BCC_Error by Reading BCC Error Status
print ("Consult Register 0x79 on the SER for more information")
print ("------------------------------------------------------------------")
print ("Pre-Error Link Status of 953 (0x52):", hex(board.ReadI2C(UB953, 0x52,1))) #0x52 is GENERAL_STS of 953
print ("Should read 0x45 = RX Lock Detect, HS PLL Lock, Link Detect")
print ("------------------------------------------------------------------")
print ("BIST CRC Error count (0x54) on 953 before forced error.", hex(board.ReadI2C(UB953, 0x54, 1)))#0x54 is BIST ERR CNT
print ("------------------------------------------------------------------")
time.sleep(1)
# Enabling BIST, Error, and Lock-Change Status
print ("Read BIST CTL register (0xB3) Before BIST ENABlED", hex(board.ReadI2C(UB954, 0xB3, 1))) #0xB3 is BIST_CTL, bit 1 controls if enabled or not
print ("Should read 0x00 or 0x08\n")
board.WriteI2C(UB954, 0xB3, 0x01) #Enable BIST using BIST_CTL
print ("Read BIST CTL (0xB3) register After BIST ENABLED", hex(board.ReadI2C(UB954, 0xB3, 1))) #0xB3 is BIST_CTL
print ("Should read 0x01")
time.sleep(0.25)
print ("------------------------------------------------------------------")
print ("Read BIST Lock Status Change of 954 RIGHT AFTER BIST enabled (0x4D):", hex(board.ReadI2C(UB954, 0x4D,1))) #0x4D is RX_PORT_STS1 of 954
print ("Read to clear BIST enable Lock Status Change.")
board.WriteI2C(UB954, 0xD0, 0x01) #Force 1 Error, 0xD0 is PORT_DEBUG register
#board.WriteI2C(UB954, 0xD0, 0x02) #Force Continuous errors, 0xD0 is PORT_DEBUG register
time.sleep(10) #Can run BIST for as long as needed
#board.WriteI2C(UB954, 0xD0, 0x00) #If forced continuous errors, stop forcing errors
print ("Read Post-BIST Lock Status Change of 954 RIGHT BEFORE BIST disabled (0x4D):", hex(board.ReadI2C(UB954, 0x4D,1))) #0x4D is RX_PORT_STS1 of 954
print ("Should read 0x03, If lock status changed during BIST, will read 0x13")
# Disable BIST and Port0
board.WriteI2C(UB954, 0xB3, 0x00) #Disable BIST, using BIST_CTL
board.WriteI2C(UB954, 0x4C, 0x00) #0x4C is FPD3_PORT_SEL
print ("------------------------------------------------------------------")
time.sleep(1)
# Check if Error(s) occurred
print ("Post-Error Link Status of 953 (0x52):", hex(board.ReadI2C(UB953, 0x52,1))) #0x52 is GENERAL_STS of 953
print "Should read 0x4D = RX Lock Detect, HS PLL Lock, Link Detect, and BIST CRC Error"
print ("Receiver Lock Status (0x04):", hex(board.ReadI2C(UB954, 0x04, 0x1))) #0x04 is DEVICE_STS of 954
print ("Should read 0xCF")
print ("------------------------------------------------------------------")
print ("BIST CRC Error count (0x54) on 953.", hex(board.ReadI2C(UB953, 0x54, 1))) #0x54 is BIST ERR CNT
print ("Parity Error count MSB (0x56) on 954.", hex(board.ReadI2C(UB954, 0x56, 1))) #0x56 is number of Parity error 8 most significant bits
print ("Parity Error count LSB (0x55) on 954.", hex(board.ReadI2C(UB954, 0x55, 1))) #0x55 is number of Parity error 8 least significant bits
print ("------------------------------------------------------------------")
#print ("953 Device ID (0x00):", hex(board.ReadI2C(UB953, 0x00, 1))) #953 Device ID, should be 0x30, check 0x5B for confirmation,
#Usually use this to see if 954 is stuck in BIST mode
# Clear BIST Errors on 953
board.WriteI2C(UB953, 0x49, 0x28) #0x49 is BC_CTRL. 0x28 selects BIST_CRC ERR CLR and CRC ERR CLR
print "\n\n" #New line Printed