ADC testing
authorDan White <dan@whiteaudio.com>
Wed, 18 Apr 2012 19:38:05 +0000 (14:38 -0500)
committerDan White <dan@whiteaudio.com>
Wed, 18 Apr 2012 19:38:05 +0000 (14:38 -0500)
python-lib/mpsse-test.py
python-lib/usbio.py

index 0e33bf94eb78352a8ee7a5b0006f62c33fec3e4f..7b61bb78314d7e97cdbc4a3fc4a342fa742024e1 100644 (file)
@@ -8,6 +8,7 @@ from myhdl import bin as b
 
 import mpsse
 import usbio
+from usbio import int2str
 
 
 
@@ -79,12 +80,6 @@ class AtoiI2C(mpsse.MPSSE):
 
 
 
-def int2str(value, width):
-    if (width % 8) != 0:
-        raise Exception, 'width must be multiple of 8'
-    v = intbv(value, max=2**width)
-    b = [v[i:i-8] for i in range(width, 0, -8)]
-    return ''.join(map(chr, b))
 
 
 
@@ -102,7 +97,7 @@ def w(v):
     spi.Write(v)
     spi.Stop()
 
-spi = AtoiSPI0(1e4)
+spi = AtoiSPI0(100e3)
 spi.SetLoopback(0)
 
 
@@ -115,20 +110,37 @@ v430 = usbio.AD524x(i2c, 3)
 
 
 
+#
+# DAC testing
+#
+if 1:
+    #turn on internal reference always
+    spi.SetCS('dac')
 
-#turn on internal reference always
-spi.SetCS('dac')
+    int_ref_always_on = intbv(0)[32:]
+    int_ref_always_on[27] = 1
+    int_ref_always_on[24] = 1
+    int_ref_always_on[19] = 1
+    int_ref_always_on[13] = 1
+    w(int2str(int_ref_always_on, 32))
 
-int_ref_always_on = intbv(0)[32:]
-int_ref_always_on[27] = 1
-int_ref_always_on[24] = 1
-int_ref_always_on[19] = 1
-int_ref_always_on[13] = 1
-w(int2str(int_ref_always_on, 32))
+    all_dacs_on = intbv(0)[32:]
+    all_dacs_on[26] = 1
+    all_dacs_on[8:] = 0xff
+    w(int2str(all_dacs_on, 32))
 
-all_dacs_on = intbv(0)[32:]
-all_dacs_on[26] = 1
-all_dacs_on[8:] = 0xff
-w(int2str(all_dacs_on, 32))
+    w(dacval(2**15))
+
+
+
+#
+# ADC testing
+#
+if 0:
+    adc = usbio.ADS8201(spi)
+    adc.setRegister(adc.TRIGGER_SCR, 0x02)
+    adc.getRegister(adc.TRIGGER_SCR)
+
+    adc.setRegister(adc.CHAN_SEL, 6)
+    adc.getRegister(adc.CHAN_SEL)
 
-w(dacval(2**15))
index 235d2976f5b0c390142b0fe48e9961da885a5555..0c4b17ff66962a416a2de8a9c15aa6385c6f358a 100644 (file)
@@ -4,6 +4,7 @@ from array import array
 import struct
 
 from myhdl import intbv
+from myhdl import bin as b
 
 
 
@@ -50,6 +51,14 @@ def truth(v):
         return False
 
 
+def int2str(value, width):
+    if (width % 8) != 0:
+        raise Exception, 'width must be multiple of 8'
+    v = intbv(value, max=2**width)
+    b = [v[i:i-8] for i in range(width, 0, -8)]
+    return ''.join(map(chr, b))
+
+
 class NCO(object):
     RST_POS = 14
     FCW_WIDTH = 14
@@ -523,7 +532,9 @@ class DAC8568(object):
         self.cs = 'dac'
         self._word = intbv(0)[self.CTL_WIDTH:]
     
-    @property
+    def __str__(self):
+        return ''.join(map(chr, self.bytes()))
+
     def bytes(self):
         """Return the control data as a byte sequence in MSB..LSB order."""
         w = self.word
@@ -532,8 +543,70 @@ class DAC8568(object):
 
     def send(self):
         self.bus.SetCS('dac')
+        self.bus.Start()
+        self.bus.Write(str(self))
+        self.bus.Stop()
         
 
+
+
+
+class ADS8201(object):
+    CH01_CCR = 0
+    CH23_CCR = 1
+    CH45_CCR = 2
+    CH67_CCR = 3
+    CHAN_SEL = 4
+    ADC_SCR = 5
+    INT_SCR = 6
+    STATUS_SCR = 7
+    TRIGGER_SCR = 8
+    RESET_SCR = 9
+    DELAY_SCR = 10
+
+    def __init__(self, spibus):
+        self.bus = spibus
+
+    def setRegister(self, address, value):
+        w = intbv(0x8000)[16:]
+        w[14:10] = intbv(address, max=2**4)
+        w[8:] = intbv(value, max=2**8)
+        print b(w, 16)
+        self.bus.SetCS('adc')
+        self.bus.Start()
+        self.bus.Write(int2str(w, 16))
+        self.bus.Stop()
+
+    def getRegister(self, address):
+        w = intbv(0x4000)[16:]
+        w[14:10] = intbv(address, max=2**4)
+        print b(w, 16)
+        self.bus.SetCS('adc')
+        self.bus.Start()
+        rval = self.bus.Exchange(int2str(w, 16))
+        self.bus.Stop()
+        i = 0
+        r = 0
+        for c in rval:
+            r += ord(c) << i
+            i += 8
+        return r
+
+    def read(self):
+        w = intbv(0x0000)[16:]
+        self.bus.SetCS('adc')
+        self.bus.Start()
+        rval = self.bus.Exchange(int2str(w, 16))
+        self.bus.Stop()
+        i = 0
+        r = 0
+        for c in rval:
+            r += ord(c) << i
+            i += 8
+        return r
+
+
+
 class I2C(object):
     def write(self, data):
         """Send i2c command data to slave."""