AD9832 DDS Sinewave (Based on MLabo's AD9834 DDS Sinewave)

Dependencies:   mbed

Revision:
0:df9eb1db9177
Child:
1:323280ad1468
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon May 28 00:21:06 2012 +0000
@@ -0,0 +1,88 @@
+/*AD9834 DDS Test 2011/07/14 MLabo*/
+/*AD9832 DDS Test based on 2011/07/14 MLabo, by Sakura,Fuyuno */
+#include "mbed.h"
+#include "TextLCD.h"
+
+#define XTAL_FREQ ((double)16160000.0)
+
+DigitalOut FSYNC(p8);
+DigitalOut SCLK(p7);
+DigitalOut SDATA(p5);
+Serial pc(USBTX,USBRX);
+
+void serial_out(uint16_t data) {
+    FSYNC = 0;
+    data & 0x8000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x4000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x2000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x1000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0800? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0400? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0200? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0100? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0080? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0040? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0020? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0010? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0008? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0004? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0002? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    data & 0x0001? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
+    FSYNC = 1;
+}
+
+typedef union {
+	uint32_t		UI;
+	uint8_t		B[4];
+} FREQDATA ;
+
+void AD9832_Init(void) {
+    FREQDATA FreqReg ;
+    FreqReg.UI = 0 ;
+	serial_out(0xF800);
+	serial_out(0x3300 + FreqReg.B[3]);
+	serial_out(0x2200 + FreqReg.B[2]);		
+	serial_out(0x3100 + FreqReg.B[1]);
+	serial_out(0x2000 + FreqReg.B[0]);
+	serial_out(0xC000);
+}
+
+void AD9832_SetFreq(double freq) {
+    FREQDATA FreqReg ;
+    FreqReg.UI = (uint32_t)(freq * (double)(0x100000000UL) / (XTAL_FREQ) + 0.5);
+	serial_out(0x3300 + FreqReg.B[3]);
+	serial_out(0x2200 + FreqReg.B[2]);		
+	serial_out(0x3100 + FreqReg.B[1]);
+	serial_out(0x2000 + FreqReg.B[0]);
+}
+
+int main() {
+    double freq ;
+    char buf[256] ;
+    int i,ptr ;
+    
+    pc.baud(38400);
+    SCLK = 1;
+    SDATA = 0;
+    FSYNC = 1;
+    AD9832_Init();
+    AD9832_SetFreq(60.0) ;
+    while(1) {
+        pc.printf("\r\nAD9832>");
+        ptr = 0;
+        while(1) {
+            if (pc.readable()) {
+                i = pc.getc() ;
+                if (i == 0x0D) {
+                    buf[ptr] = '\0' ;
+                    break ;
+                }
+                pc.putc(i) ;
+                buf[ptr++] = i ;
+            }
+        }
+        freq = atof(buf) ;
+        pc.printf("\r\nFreq SET:%g",freq);        
+        AD9832_SetFreq(freq) ;
+    }
+}