Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.63 KB | None | 0 0
  1. from __future__ import print_function
  2. from timeit import default_timer as timer
  3. import numpy
  4. import os, sys
  5. from pyLMS7002Soapy import *
  6.  
  7. ###############
  8. measurementFrequency = 2e9
  9. txLoss = 10
  10. ###############
  11.  
  12.  
  13. LNA = 'LNAH'
  14.  
  15. #################################################
  16. # MCU related
  17.  
  18. def mcuProgram():
  19. # Load MCU program
  20. logTxt("Loading MCU program...\t", end="")
  21. mcu = lms7002.mSPI
  22. mcu.loadHex("vna.hex")
  23. # Check MCU firmware
  24. mcu.P0 = 0
  25. mcu.P0 = 0xFF
  26. firmwareID = mcu.P1-0x80
  27. if firmwareID != 0x31:
  28. logTxt("Wrong firmware ID : "+str(firmwareID)+", expected 49")
  29. exit(1)
  30. else:
  31. logTxt("OK (Firmware ID = "+str(firmwareID)+")")
  32. mcu.P0 = 0
  33. lms7002.MAC = 'A'
  34.  
  35. def mcuRSSI():
  36. # Read averaged RSSI from MCU
  37. mcu = lms7002.mSPI
  38. mcu.SPISW_CTRL = 'MCU'
  39. mcu.P0 = 1
  40. while(mcu.P1==0xFF):
  41. pass
  42. mcu.P0 = 0x12
  43. RSSI = mcu.P1*1.0
  44. mcu.P0 = 0x11
  45. RSSI = mcu.P1*1.0 + RSSI*256.0
  46. mcu.P0 = 0x10
  47. RSSI = mcu.P1*1.0 + RSSI*256.0
  48. mcu.SPISW_CTRL = 'BB'
  49. return RSSI
  50.  
  51.  
  52. def mcuPhase():
  53. # Use MCU to determine the phase
  54. mcu = lms7002.mSPI
  55. RxTSP = lms7002.RxTSP['A']
  56. RxTSP.GC_BYP = 'USE'
  57. RxTSP.GCORRI = 0
  58.  
  59. mcu.SPISW_CTRL = 'MCU'
  60. mcu.P0 = 2
  61. while(mcu.P1==0xFF):
  62. pass
  63. mcu.P0 = 0x11
  64. phase = 1.0*mcu.P1
  65. mcu.P0 = 0x10
  66. phase = mcu.P1 + phase*256.0
  67. mcu.SPISW_CTRL = 'BB'
  68. if phase>2**15:
  69. phase = -(2**16)+phase
  70. phase = 180.0 * phase / (1.0*0x6487)
  71. RxTSP.GC_BYP = 'BYP'
  72. RxTSP.GCORRI = 2047
  73. return phase
  74.  
  75. #################################################
  76. # Auxiliary functions
  77.  
  78. def logTxt(text, end="\n"):
  79. print(text, end=end)
  80. sys.stdout.flush()
  81.  
  82. def userConfirmation(msg):
  83. userReady = 'n'
  84. while userReady != 'y':
  85. userReady = raw_input(msg + '. Type y to continue. ')
  86.  
  87. def syncPhase(lms7002):
  88. TRF = lms7002.TRF['A']
  89. RFE = lms7002.RFE['A']
  90. SXT = lms7002.SX['T']
  91. SXT.PD_FDIV = 1
  92. TRF.PD_TLOBUF_TRF = 1
  93. RFE.PD_QGEN_RFE = 1
  94. TRF.PD_TLOBUF_TRF = 0
  95. RFE.PD_QGEN_RFE = 0
  96. SXT.PD_FDIV = 0
  97.  
  98. def adjustRxGain(lms7002):
  99. RBB = lms7002.RBB['A']
  100. RFE = lms7002.RFE['A']
  101. RxTSP = lms7002.RxTSP['A']
  102. TxTSP = lms7002.TxTSP['A']
  103.  
  104. TxTSP.CMIX_BYP = 'USE'
  105. RxTSP.GC_BYP = 'USE'
  106. RxTSP.GCORRQ = 0
  107.  
  108. pgaGain = 1
  109. pgaStep = 8
  110.  
  111. lnaGain = 1
  112.  
  113. while pgaStep>0:
  114. RBB.G_PGA_RBB = pgaGain + pgaStep
  115. RFE.G_LNA_RFE = lnaGain
  116. if mcuRSSI()<50e3:
  117. pgaGain += pgaStep
  118. pgaStep = pgaStep/2
  119.  
  120. RBB.G_PGA_RBB = pgaGain
  121. RFE.G_LNA_RFE = lnaGain
  122.  
  123. TxTSP.CMIX_BYP = 'BYP'
  124. RxTSP.GC_BYP = 'BYP'
  125. RxTSP.GCORRQ = 2047
  126.  
  127. I = 0x7FFF
  128. Q = 0x8000
  129. TxTSP.loadDCIQ(I, Q)
  130. return (pgaGain, lnaGain)
  131.  
  132. #################################################################
  133.  
  134. logTxt("Searching for LimeSDR... ", end="")
  135. limeSDR = pyLMS7002Soapy(0)
  136. if limeSDR.boardName=="LimeSDRMini":
  137. isMini = True
  138. lms7002 = limeSDR.LMS7002
  139. lms7002.fRef = 40e6
  140. else:
  141. isMini = False
  142. lms7002 = limeSDR.LMS7002
  143. lms7002.fRef = 30.72e6
  144.  
  145. lms7002.MIMO = 'MIMO'
  146. logTxt("FOUND")
  147.  
  148. # Initial configuration
  149. logTxt("Tuning CGEN... ", end="")
  150. startTime = timer()
  151. lms7002.CGEN.setCLK(300e6)
  152. endTime = timer()
  153. logTxt("OK\t("+str(float(round(float(endTime-startTime)*10))/10)+" s)")
  154.  
  155. logTxt("Tuning SXT... ", end="")
  156. startTime = timer()
  157. lms7002.SX['T'].setFREQ(measurementFrequency)
  158. endTime = timer()
  159. logTxt("OK\t("+str(float(round(float(endTime-startTime)*10))/10)+" s)")
  160.  
  161. # Make ADC and DAC clocks equal
  162. lms7002.CGEN.EN_ADCCLKH_CLKGN = 0
  163. lms7002.CGEN.CLKH_OV_CLKL_CGEN = 2
  164.  
  165. cal = lms7002.calibration
  166.  
  167. calThreshold = 500 # RSSI threshold to trigger RX DC calibration
  168.  
  169. RBB = lms7002.RBB['A']
  170. TBB = lms7002.TBB['A']
  171. if isMini:
  172. TBB.CG_IAMP_TBB=5
  173. else:
  174. TBB.CG_IAMP_TBB=15
  175.  
  176. RxTSP = lms7002.RxTSP['A']
  177. RxTSP.GCORRQ = 2047
  178. RxTSP.GCORRI = 2047
  179. RxTSP.AGC_MODE = 'RSSI'
  180. RxTSP.AGC_BYP = 'USE'
  181. RxTSP.RSSI_MODE = 'RSSI'
  182.  
  183. TxTSP = lms7002.TxTSP['A']
  184. TxTSP.TSGMODE = 'DC'
  185. TxTSP.INSEL = 'TEST'
  186. TxTSP.CMIX_BYP = 'BYP'
  187. TxTSP.GFIR1_BYP = 'BYP'
  188. TxTSP.GFIR2_BYP = 'BYP'
  189. TxTSP.GFIR3_BYP = 'BYP'
  190. TxTSP.GC_BYP = 'BYP'
  191. TxTSP.DC_BYP = 'BYP'
  192. TxTSP.PH_BYP = 'BYP'
  193. I = 0x7FFF
  194. Q = 0x8000
  195. TxTSP.loadDCIQ(I, Q)
  196.  
  197. TxNCO = lms7002.NCO["TXA"]
  198. NCOfreq = 50e3
  199. TxNCO.MODE = 0
  200. TxNCO.setNCOFrequency(0, NCOfreq)
  201. TxNCO.SEL = 0
  202.  
  203. TRF = lms7002.TRF['A']
  204. TRF.EN_LOOPB_TXPAD_TRF = 0
  205. TRF.L_LOOPB_TXPAD_TRF = 0
  206. TRF.PD_TLOBUF_TRF = 0
  207. if isMini:
  208. TRF.LOSS_MAIN_TXPAD_TRF = txLoss
  209. TRF.SEL_BAND1_TRF = 1
  210. TRF.SEL_BAND2_TRF = 0
  211. limeSDR.configureAntenna(measurementFrequency)
  212. else:
  213. TRF.LOSS_MAIN_TXPAD_TRF = txLoss
  214. TRF.SEL_BAND1_TRF = 0
  215. TRF.SEL_BAND2_TRF = 1
  216.  
  217. RFE = lms7002.RFE['A']
  218.  
  219. lms7002.SX['R'].EN_G = 0
  220. lms7002.SX['R'].EN_DIR = 0
  221. lms7002.SX['T'].PD_LOCH_T2RBUF = 0 # Both RX and TX use the TX PLL
  222.  
  223. mcuProgram() # Load the program to MCU SRAM
  224.  
  225. print("Calibrating RX path...")
  226.  
  227. lnaGain = 1
  228. pgaGain = 16
  229.  
  230. TRF.PD_TXPAD_TRF = 1 # Turn off TXPAD while calibrating RX DC
  231. cal.rxDCLO('A', LNA, lnaGain=lnaGain, pgaGain=pgaGain) # Calibrate RX DC
  232. TRF.PD_TXPAD_TRF = 0 # Turn on TXPAD
  233.  
  234. print(isMini)
  235.  
  236. userConfirmation("Connect THRU")
  237.  
  238. freqs = [measurementFrequency] # operating frequency
  239. res = []
  240. resPhase = []
  241. pgaGains = []
  242. lnaGains = []
  243.  
  244. i = 0
  245. # Measure reference power levels and phase
  246. f = freqs[i]
  247. logTxt("f="+str(f)+"... ", end="")
  248. startTime = timer()
  249.  
  250. lms7002.verbose=0
  251. lms7002.SX['T'].setFREQ(f)
  252. lms7002.SX['T'].PD_LOCH_T2RBUF = 0
  253. syncPhase(lms7002)
  254.  
  255. pgaGain, lnaGain = adjustRxGain(lms7002)
  256. pgaGains.append(pgaGain)
  257. lnaGains.append(lnaGain)
  258.  
  259. TRF.PD_TXPAD_TRF = 1
  260. calRSSI = RxTSP.RSSI
  261. if calRSSI>calThreshold:
  262. cal.rxDCLO('A', LNA, lnaGain=lnaGain, pgaGain=pgaGain)
  263. calRSSI = RxTSP.RSSI
  264. TRF.PD_TXPAD_TRF = 0
  265.  
  266. TxTSP.CMIX_BYP = 'USE'
  267. RxTSP.GC_BYP = 'USE'
  268. RxTSP.GCORRQ = 0
  269.  
  270. rssi = 1.0*mcuRSSI()
  271.  
  272. TxTSP.CMIX_BYP = 'BYP'
  273. RxTSP.GC_BYP = 'BYP'
  274. RxTSP.GCORRQ = 2047
  275.  
  276. refRSSI = rssi
  277. refPhase = mcuPhase()
  278. phase = 0.0
  279. endTime = timer()
  280.  
  281. lms7002.verbose = 0
  282.  
  283. userConfirmation("Connect DUT")
  284.  
  285. while (True):
  286. # Measure the DUT reflected power and phase
  287. TxTSP.CMIX_BYP = 'USE'
  288. RxTSP.GC_BYP = 'USE'
  289. RxTSP.GCORRQ = 0
  290.  
  291. rssi = 1.0*mcuRSSI()
  292.  
  293. TxTSP.CMIX_BYP = 'BYP'
  294. RxTSP.GC_BYP = 'BYP'
  295. RxTSP.GCORRQ = 2047
  296.  
  297. phase = mcuPhase()-refPhase
  298. dB20Mag = 20*math.log10(rssi/refRSSI)
  299. logTxt("20*log10(mag) = "+str(dB20Mag)+", phase = "+str(phase))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement