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