Forum: Mikrocontroller und Digitale Elektronik Probleme mit DDS AD9954


von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe ein Problem bei der Inbetriebnahme eines DDS AD9954. Ich 
bekomme kein wirkliches Signal generiert.

Es gibt eine Reaktion die ich reproduzieren kann. Nach dem Senden der 
Werte aus dem 'detailed programming example' des Datenblattes wird mit 
dem IOUpdate der Differenzausgang auf 0V gezogen. Ein Reset führt wieder 
zu ca 120mV am Differenzausgang.

Die Signale des SPI-Buses liegen am Chip an, /CS wird richtig gesetzt. 
Reset ist low, ClkModeSelekt ist jetzt low(wegen Oszilator), IOSync wird 
vor jedem SPI-Befehl kurz auf high gezogen.
Ob der SPI-Bus funktioniert kann Ich nicht wirklich sagen. Wenn Ich die 
Befehle aus dem 'detailed programming example' nicht sende gibt es auch 
auf das IOUpdate/Reset keine Reaktion. Irgendetwas kommt also beim DDS 
an. Die verschiedenen SPI-Varianten clk Default high/low und Übernahme 
an steigender/fallender Flanke habe Ich zur Sicherheit auch ausprobiert. 
Richtig sollte clk Default low und Übernahme an der steigenden Flanke 
sein.
Ich habe verschiedenste Dinge probiert, ohne PLL, Taktausgabe ein, …. 
keine weiteren Reaktionen des DDS. Den Quarz habe Ich durch einen 
Oszilator ersetzt um auch mit dem Oszi etwas messen zu können. Ohne 
Quarz oder Oszilator lässt sich die beschriebene Reaktion nicht 
produzieren.

Ein Bild des Schaltplans schicke Ich mit. R71 ist jetzt 0Ohm, C128 ist 
100n

hier der Code für die Initialisierung
----
    {
      // control function register 1 (4 Bytes), // bit 13 autoclear 
phase
      //uint8_t cmd1[] = { DDSReg_CFR1, 0x00, 0x00, 0x20, 0x00 };
      uint8_t cmd1[] = { DDSReg_CFR1, 0x00, 0x00, 0x22, 0x00 };//bit 9 
SDIO=input only fuer SPI,
      rc = SendToDDS(&my_node, cmd1, sizeof(cmd1));
    }
    if(rc==0){
      // control function register 2 (3 Bytes)
      //bit9 clk_out=1 Ausgabe der Clk auf einem Pin
      //bit3:7 multipier=20, PLL aus wenn <4 oder >20
      //bit2 VCO 250-400MHz(sonst 100-250), uninteressant wenn ohne PLL
      //uint8_t cmd2[] = { DDSReg_CFR2, 0x00, 0x02, 0xA4 };
      //uint8_t cmd2[4] = { DDSReg_CFR2, 0x00, 0x00, 0xA4 };//dies ist 
die Version aus dem Beispiel
      //uint8_t cmd2[4] = { DDSReg_CFR2, 0x00, 0x00, 0x00 };//ohne PLL
      uint8_t cmd2[4] = { DDSReg_CFR2, 0x00, 0x02, 0x00 };//mit 
Taktausgang, ohne PLL
      rc = SendToDDS(&my_node, cmd2, sizeof(cmd2));
    }
    if(rc==0){
      //frequency tuning word (4 Bytes)
      uint8_t cmd3[] = { DDSReg_FTW0, 0x4E, 0x14, 0x7a, 0xE1 };
      rc = SendToDDS(&my_node, cmd3, sizeof(cmd3));
    }
    if(rc==0){
      //phase offset word (2 Bytes)
      uint8_t cmd4[] = { DDSReg_POW0, 0x80, 0x00 };
      rc = SendToDDS(&my_node, cmd4, sizeof(cmd4));
    }
    /* wird wohl nicht gebraucht, weil OSK nicht verwendet wird
    if(rc==0){
      //amplitude scale factor (2 Bytes)
      uint8_t cmd5[] = { DDSReg_ASF, 0x3f, 0xff };
      rc = SendToDDS(&my_node, cmd5, sizeof(cmd5));
    }*/
    if(rc==0){
      DDS_Update();  // hier gibt es eine Reaktion, nur wenn die ersten 
3 Initialisierungsbefehle gesendet wurden
      DDS_Reset();  // nur zum testen
    }
----

Hat da jemand noch einen Tip für mich?
Wie bekomme Ich heraus ob der SPI-Bus funktioniert? Was übersehe Ich 
hier…..

Vielen Dank schon mal.
Gruß Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.