Add Python program to test core via serial port.
This commit is contained in:
parent
e402b88b3d
commit
8bd2d389ef
|
@ -0,0 +1,131 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Test sine/cosine core via serial port.
|
||||||
|
|
||||||
|
Sends a series of commands to the test driver via the serial port
|
||||||
|
and verifies answers.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
python test_sincos_serial.py /dev/ttyUSB0
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import numpy
|
||||||
|
import serial
|
||||||
|
import struct
|
||||||
|
|
||||||
|
|
||||||
|
def testPhase(dev, coresel, databits, phasebits, phase):
|
||||||
|
|
||||||
|
print("\r phase=%-10d" % phase, end='')
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
dev.write(struct.pack("<BBI", 0x41, 0x42 + coresel, phase))
|
||||||
|
|
||||||
|
reply = dev.read(8)
|
||||||
|
|
||||||
|
if len(reply) != 8:
|
||||||
|
print()
|
||||||
|
print("ERROR: got %d bytes from serial port while expecting 8" %
|
||||||
|
len(reply))
|
||||||
|
return
|
||||||
|
|
||||||
|
(vsin, vcos) = struct.unpack("<ii", reply)
|
||||||
|
|
||||||
|
ampl = (1 << (databits - 1)) - 1
|
||||||
|
theta = 2 * numpy.pi * phase / 2.0**phasebits
|
||||||
|
refsin = ampl * numpy.sin(theta)
|
||||||
|
refcos = ampl * numpy.cos(theta)
|
||||||
|
|
||||||
|
if abs(vsin - refsin) > 1.5 or abs(vcos - refcos) > 1.5:
|
||||||
|
print()
|
||||||
|
print("phase=%d sin=%d cos=%d refsin=%.2f refcos=%.2f" %
|
||||||
|
(phase, vsin, vcos, refsin, refcos))
|
||||||
|
print("ERROR: wrong answer")
|
||||||
|
|
||||||
|
|
||||||
|
def testCore(dev, clkmod, coresel, databits, phasebits):
|
||||||
|
|
||||||
|
if clkmod:
|
||||||
|
# Start clock-enable modulation.
|
||||||
|
dev.write("AD")
|
||||||
|
else:
|
||||||
|
# Stop clock-enable modulation.
|
||||||
|
dev.write("AE")
|
||||||
|
|
||||||
|
print("test least significant phase bits")
|
||||||
|
for p in range(64):
|
||||||
|
phase = p
|
||||||
|
testPhase(dev, coresel, databits, phasebits, phase)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print("test most significant phase bits")
|
||||||
|
for p in range(64):
|
||||||
|
phase = p << (phasebits - 6)
|
||||||
|
testPhase(dev, coresel, databits, phasebits, phase)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print("test pseudorandom phase values")
|
||||||
|
phase = 0
|
||||||
|
for i in range(5000):
|
||||||
|
phase = (phase + 123457) & ((1 << phasebits) - 1)
|
||||||
|
testPhase(dev, coresel, databits, phasebits, phase)
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print(__doc__, file=sys.stderr)
|
||||||
|
print("ERROR: Invalid/missing command line arguments", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
devname = sys.argv[1]
|
||||||
|
|
||||||
|
# Open serial port.
|
||||||
|
print("opening serial port", devname)
|
||||||
|
dev = serial.Serial(port=devname,
|
||||||
|
baudrate=115200,
|
||||||
|
bytesize=8,
|
||||||
|
parity='N',
|
||||||
|
stopbits=1,
|
||||||
|
timeout=1)
|
||||||
|
|
||||||
|
# Flush input.
|
||||||
|
print("flush serial port buffer")
|
||||||
|
dev.flushInput()
|
||||||
|
dev.flushOutput()
|
||||||
|
dev.read(1000)
|
||||||
|
|
||||||
|
# Write series of Z to force test driver to idle state.
|
||||||
|
dev.write("ZZZZZZZZ")
|
||||||
|
|
||||||
|
print()
|
||||||
|
print('Test 18-bit data, 20-bit phase core')
|
||||||
|
testCore(dev, 0, 0, 18, 20)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print('Test 24-bit data, 26-bit phase core')
|
||||||
|
testCore(dev, 0, 1, 24, 26)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print('Test 18-bit data, 20-bit phase core with clock-enable modulation')
|
||||||
|
testCore(dev, 1, 0, 18, 20)
|
||||||
|
print()
|
||||||
|
|
||||||
|
print('Test 24-bit data, 26-bit phase core with clock-enable modulation')
|
||||||
|
testCore(dev, 1, 1, 24, 26)
|
||||||
|
print()
|
||||||
|
|
||||||
|
# Close serial port.
|
||||||
|
dev.close()
|
||||||
|
|
||||||
|
print("done")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
Loading…
Reference in New Issue