Forum: Mikrocontroller und Digitale Elektronik Analog Devices: DDS IC (AD9959) mit ATMega64L ansteuern SPI


von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

bin gerade mit einer Projektarbeit beschäftigt und probieren von Analog 
Devices ein DDS IC (genauer gesagt den AD9959) mit einem AVR ATMega 64 
Atmel uC anzusteuern. Die Verbindungen habe ich wie folgt vorgenommen:

//    uC ATMega              DDS IC
// PB1 (Pin 11) SCK  <---> Pin 48 SCLK
// PB2 (Pin 12) MOSI <---> Pin 50 SDIO_0
// PB3 (Pin 13) MISO <---> Pin 52 SDIO_2
// PF1 (Pin 60)      <---> Pin 46 IO_Update

Am DDS IC kommen die Daten auch an (mit Oszi geprüft), das DDS IC lässt 
den Quarz schwingen, gibt an den vorgesehenen Pins das CLK Signal aus, 
zieht Pins (per Pull-Up) auf High usw., verhält sich also völlig normal.

An den Ausgängen erscheint jedoch nichts (!) und ein Einlesen der 
Register scheitert auch!

Anbei einmal der Code des uCs (ATMega 64) in C (direkt aus dem 
Datenblatt übernommen) und der Schaltplan zum DDS IC sowie für den uC.
Hat evtl. schon mal jemand von euch ein DDs IC von Analog Devices in 
Betrieb genommen und kann mir verraten was da schief läuft, bzw. könnte 
mir seinen Quellcode (inkl. Schaltplan oder Auszügen davon) zur 
Verfügung stellen?

Gruß und Danke,

Robert

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Schaltplan zum uC ATMega64L

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Schaltplan zum DDS IC

von Robert (Gast)


Lesenswert?

01: 3,3V (SYNC IN)          29: 0
02: 0V (SYNC OUT)           30: 0
03: 0V (MASTER RESET)       31: 1,8
04: 0V (PWR_DWN_CTL)        32: 0
05: 1,8V                    33: 1,8
06: 0                       34: 0
07: 1,8                     35: 0
08: 0                       36: 0
09: 0                       37: 1,8
10: 0                       38: 0
11: 1,8                     39: 1,8
12: 0                       40: 2,0
13: 0                       41: 0
14: 0                       42: 0
15: 1,8                     43: 0
16: 0                       44: 0
17: 1,2V (DAC_RSET)         45: 1,8
18: 0                       46: 0
19: 1,8                     47: 0,1
20: 0                       48: 0
21: 1,8                     49: 3,3
22: 0,6 Schwingung (Quarz)  50: 0
23: 0,6 Schwingung (Quarz)  51: 0
24: 1,8 (CLK_MODE_SEL)      52: 3,3
25: 0                       53: 2,0
26: 1,8                     54: 3,0 Schwingung
27: 1,8 (LOOP_FILTER)       55: 1,8
28: 0                       56: 0

von Falk B. (falk)


Lesenswert?

@ Robert (Gast)

>Atmel uC anzusteuern. Die Verbindungen habe ich wie folgt vorgenommen:

//    uC ATMega              DDS IC
// PB1 (Pin 11) SCK  <---> Pin 48 SCLK
// PB2 (Pin 12) MOSI <---> Pin 50 SDIO_0
// PB3 (Pin 13) MISO <---> Pin 52 SDIO_2
// PF1 (Pin 60)      <---> Pin 46 IO_Update

Und wo hängt CS? Das braucht man für den SPI-Transfer.

MfG
Falk

von Robert (Gast)


Lesenswert?

Hallo Falk,

da nur ein DDS IC zum Einsatz kommt, ist /CS mittels Pull-Down auf GND 
gezogen (Pin 47, nachgemessen mit 0,1V), d.h. das IC sollte aktiv sein. 
Das einzige was mich daran wundert: warum das nicht 0V sind (so wie bei 
den anderen Pins auch die auf GND gezogen werden). Habe das aber 
mehrmals nachgemessen und immer ca. 108mV erhalten.

Gruß,

Robert

von Volker (Gast)


Lesenswert?

>An den Ausgängen erscheint jedoch nichts (!)

Hast du bedacht, dass die Ausgänge Stromausgänge und keine 
Spannungsausgänge sind?

Gruß Volker

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Volker,

ja, habe ich (denke ich zumindest). Anbei einmal die 
Ausgangsbeschaltung, die an den jeweiligen Pins hängt (also z.B. an 
Channel 0 und /Channnel 0).
Ein Fehler bei den Ausgängen würde jedoch auch nicht erklären, warum man 
über SPI nichts einlesen kann.
Egal, freue mich über jeden Tipp und jede Hilfe.

Robert

von Müller (Gast)


Lesenswert?

Also bis vor kurzem hatte ich genau das gleich Problem mit dem 9951!
Da kamen auch die Leute und laberten was von CS und falscher 
Initialisierung.

Bei mir hat es letzenendes daran gelegen, dass die Resets von µC und DDS 
nicht in der richtien Reihenfolge waren.

Nachdem Start vom µC zuerst (mit dem µC) den DDS resetten. Dann kannst 
du die Daten über die SPI rüberschieben.

Wenn du zuerst den DDS hochfährst und dann den µC resettest, wird die 
SPI am DDS (ist ja mit dem µC verbunden) ganz "durcheinander" gebracht. 
Dann weiß der DDS nicht mehr wo vorne und hinten ist und verweigert jede 
Eingabe.

von Robert (Gast)


Lesenswert?

Hallo Müller,

danke für den Hinweis. Muss zu meiner Schande gestehen: das DDS-IC wird 
überhaupt nicht resettet, d.h. nach dem Einschalten stehen halt die 
Spannungen an und gut ist die Sache. Werde mal den Master Reset auf 
einen uC Pin legen, den uC das DDS IC resetten lassen und dann erst mit 
der Kommunikation beginnen. Komme ich aber erst morgen zu, berichte dann 
wieder.

Danke,

Robert

von Robert (Gast)


Lesenswert?

Hallo,

habe nun /CS mit angeschlossen und entsprechend beschaltet (geht nun 
auch auf 0V runter) und zusätzlich Master Reset. Zu Beginn legt der uC 
ein High Puls von 10msec Dauer am Master Reset Pin an, bevor der Pin 
wieder auf low gezogen wird und die eigentliche Programmierung via SPI 
beginnt.
Bringt nur leider keine Besserung. Das DDS-IC gibt nach wie vor nichts 
von sich.

Gruß,

Robert

von Realplotter (Gast)


Lesenswert?

Mit dem CS wird ueblicherweise die reingeclockten Daten reingelatcht, 
auf die steigende flanke. Ohe die steigende flanke an CS geschieht 
nichts.

von Falk B. (falk)


Lesenswert?

@ Robert (Gast)

>Bringt nur leider keine Besserung. Das DDS-IC gibt nach wie vor nichts
>von sich.

Erstmal solltest du auch den Lesevorgang hinbekommen. Wenn das nicht 
geht ist was grundlegendes faul.

MFG
Falk

von Müller (Gast)


Lesenswert?

2 Dinge fallen mir da noch ein:

1.
Also beim AD9951 war es so, dass man den Takt intern vervielfachen 
konnte. Dazu musste man irgendein Register setzen...
Falls das bei deinem Chip genauso ist, könntest du mal einen Faktor von 
vielleicht 2 einstellen. Dann schaust du am Pin für den internen Takt, 
ob diese Vervielfachung funktioniert.

2.
Das mit der SPI ist so eine Sache. Da gibts nämlich verschiedene 
Standards eine SPI von AD muss nicht die gleiche sein wie die von einem 
anderen Chipanbieter (bei dir ATMEL). Wenn du die eingebaute Hardware 
SPI vom µC benutzt und dir nix mehr anderes einfällt, dann programmiere 
die SPI von Hand. Das ist übrigens gar nicht soviel Arbeit wie du 
denkst.

von Robert (Gast)


Lesenswert?

Hallo zusammen,

Danke für eure Beteiligung. Das Datenblatt ist unter: 
http://www.analog.com/UploadedFiles/Data_Sheets/AD9959.pdf verfügbar.

@Realplotter:
Im DB auf Seite 10: I/O_Update (Pin 46) übernimmt die Daten aus dem 
Puffer in die Register, /CS wählt "nur" das IC aus. Zum SCLK Pin: Daten 
werden bei steigender Flanke geschrieben und bei fallender gelesen 
(steht allerdings im Gegensatz zu Seite 32 und 33, Bild 43 wo die Daten 
anscheinend immer bei steigender Taktflanke übernommen werden, egal ob 
lesen oder schreiben)

@ Falk Brunner:
Das ist auch erst mal mein Ziel. Wenn du dir den Code ansiehst, siehst 
du, dass kleine SPI Frequenzen gewählt sind und am Ende des schreibens 
auch probiert wird was zu lesen.

@ Müller:
1) Kann der AD9959 auch mittles integrierter PLL (und ist ja auch nötig 
bei 500MSps), Funktion werde ich Montag überprüfen. Auf jeden Fall liegt 
dort ein Takt an, muss mal die Periode/Frequenz messen.
2) Das mit dem SPI scheint zu stimmen. Daten können ja "nur" auf 
steigenn/fallenden Flanken übernommen werden. So ein schönes DB wie von 
Atmel würde ich mir auch von Analog Devices wünschen...

@all:
Werde übers Wochenende SPI in Software schreiben, /CS, I/O-Update dabei 
berücksichtigen und das ganze am Montag nachmessen/prüfen.

Bis dahin: Schönes Wochenende und Vielen Dank für eure Mühen.

Robert

von Robert (Gast)


Lesenswert?

Hallo,

also, anbei ein paar (unbefriedigende) Neuigkeiten:

/CS darf fest auf GND gelegt werden, vgl. Datenblatt Seite 31 ("unten" 
linke Spalte):
The /CS pin can be tied low in systems that maintain control of SCLK.

SDIO_3 habe ich nun noch zusätzlich per Pull Down auf GND gelegt (vgl. 
Datenblatt Seite 31).

Am SYNC_CLK (Pin 54) ist immer nur 25MHz/4 zu sehen, d.h. auch die 
Erhöhung des Taktes mittels PLL funktioniert nicht!

Morgen kommt ein neuer DDS Chip drauf, evtl. hat das Teil einfach zu 
viel Wärme abbekommen.

Nach wie vor kein Lesen möglich und keine Reaktion an den Ausgängen!

Gruß,

Robert

von Stefan H. (shaun)


Lesenswert?

Hallo,
bin durch Zufall hier reingestolpert und wollte mal kurz meine 
Erfahrungen mit dem 9959 zum Besten geben.
Der Chip ist hier über SDIO0 mit dem uC verbunden, ich benutze zwar den 
3-Wire-Single-Bit Modus, lese aber nicht vom DDS. Der ATmega läuft mit 
5V, daher habe ich einen 5V-toleranten Leitungstreiber (74LVX244), der 
selbt mit 3,3V läuft, dazwischen. SDIO3 ist fest auf low, sonst geht gar 
nichts.
Die Ausgänge habe ich z.T. über 51 Ohm nach +1,8V gelegt und kopple dann 
kapazitiv auf ein asymmetrisches LC-Filter 7. Ordnung, an einem Ausgang 
hängt auch ein Trafo, weil ich damit ein ganzes Stück über die Platine 
zu einer anderen Masse muss (Trafo: ADTT1-6). Der DAC wird mit einem 
1,82k Widerstand gesetzt.
Den Takt von 402,8MHz bekommt er von einem MAX2608 VCO mit reaktiver 
Anpassung, um den gerforderten Pegel zu erhalten. Nach vielem Rumgeier 
habe ich unter die 2-lagige Platine mit vielen vielen Vias noch eine 
Masseplane aufs Kupferfolie gelötet. Der Chip sitzt über 9 Vias, unter 
dem Chip ist 5x5mm (?) verzinnte Fläche, gelötet habe ich von Hand. 
Inzwischen hätte ich dann auch eine Heissluftstation, aber es geht auch 
ohne.

Sicher interessiert Dich mein Codeschnipsel am meisten:
void set_frequency( uint32_t freq ) {
  uint8_t dummy;
  uint64_t ftemp;
  ftemp = (uint64_t) freq;
  ftemp = ftemp << 32;
  ftemp /= 402800000;

        SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);
        PORTC &= ~(1<<AD9959_nCS); /* AD9959 selektieren */
  send_spi( 0x00 );  /* Register 0 (CSR) zum Schreiben */
  send_spi( 0xE2 );  /* CH1,2,3 selektieren, Single-bit 3-Wire, MSB 
first */
  send_spi( 0x04 );  /* Register 4: CTW0 */
  send_spi( (uint8_t) ( ( ftemp>>24) & 0xFF ) );  /* Bit31..24 */
  send_spi( (uint8_t) ( ( ftemp>>16) & 0xFF ) );  /* Bit23..16 */
  send_spi( (uint8_t) ( ( ftemp>>8) & 0xFF ) );  /* Bit15..8 */
  send_spi( (uint8_t) ( ftemp & 0xFF ) );    /* Bit7..0 */
  PORTC |= (1<<AD9959_nCS);    /* Übertragung beendet */
  PORTC |= (1<<AD9959_IOUPDATE);  /* Werte übernehmen */
  for( dummy=0; dummy<10; dummy++ );
  PORTC &= ~(1<<AD9959_IOUPDATE);
}

send_spi macht nichts weiter als das übergebene Byte zu senden und auf 
das Ende der Übertragung zu warten.

Dazu sei gesagt, dass das Ding so von 10kHz-100MHz hervorragend 
funktioniert und mir im Gegensatz zur PLL und einer kleinen 
Glasfaserstrecke keine wirklichen Sorgen macht.

Gruß
Stefan

von Christian Z. (Gast)


Lesenswert?

Hallo,

hab mit nem kleinen AD9833 auch Probleme gehabt. Bei mir lag es einfach 
daran das die Signale die der DDS-IC vom µC bekommen hat die 
erforderliche Flankensteilheit nicht aufgewiesen haben. Vielleicht 
einfach mal die gesendeten Daten am Oszi sichtbar machen, ich geh mal 
davon aus dass dir eins zur Verfügung steht wenn du mit einem DDS-IC 
arbeitest.

MfG Christian

von Robert (Gast)


Lesenswert?

Hallo Stefan,

danke für deinen Erfahrungsbericht.
Wie im ersten Posting ersichtlich nutze auch ich den Single Bit 3-Wire 
Modus, d.h. SDIO_0 und SDIO_2. Der uC selbst läuft mit 3,3V, um von 
vornherein Problemen mit Levelshiftern aus dem Weg zu gehen.
SDIO_3 (Pin 53) ist jetzt auch über einen Pull-Down auf GND und hat 0V 
Potential (war vorher unconnected und lag bei ca. 2V). Brachte aber 
keine Besserung :=(
Das mit der Ausgangsbeschaltung werde ich mal testweise ändern, da 
könnte ein ernstes Problem liegen (vgl. Posting 9.8.2007).
DAC_RSET ist hier 1,91k, auf das mA mehr/weniger am Ausgang sollte es 
aber nicht ankommen.
Das DDS IC wurde mit in einem Ofen eingelötet (war perfekt). Unter das 
IC wurde vorher ein 3mm Loch gebohrt, in das von unten ein Stück 
Messingstange gelötet wurde, an die eine Messingplatte (ca. 3x3cm) 
gelötet ist. Das wiederum geschah per Hand. Insofern ist dort evtl. was 
kaputt gegangen.
Was deine Übertragung angeht: so mache ich es (mittlerweile) auch, wobei 
ich zu Anfang /CS auf GND gezogen hatte (was aber lt. Datenblatt erlaubt 
ist, siehe 13.8.2007).
Wie schaut's bei dir mit der Beschaltung des Loop Filters aus? Im 
Datenblatt steht 0Ohm + C, im Evaluation Board wurde 698Ohm + C 
verwendet (an letzterem habe ich mich orientiert/gehalten).

Danke,

Robert

von Robert (Gast)


Lesenswert?

Hallo Christian,

da der SPI Takt momentan nur bei ca. 500kHz liegt, sind die Flanken sehr 
steil und die Verbindungsleitungen (alle drei, also SCK, MISO, MOSI) 
auch "nur" ca. 10cm lang. Werde das aber nachher mal prüfen, am Mittag 
kommt das neue IC.

Robert

von Robert (Gast)


Lesenswert?

Hallo,

das Thema hat sich erledigt: neuen DDS-IC am Mittag erhalten, alten 
ausgelötet und den neuen rein => Programm läuft. /CS braucht (bei einem 
DDS-IC) nicht beschaltet werden und kann (per Pull-Down) auf GND gelegt 
werden, nur IO-Update wird halt benötigt. Probeweise mal 1m Leitung 
(Flachbandkabel) für MISO, MOSI und SCLK genommen: geht auch wunderbar.
Das letzte IC hat wohl "nur" die Anbringung des Kühlblechs nicht so ganz 
verkraftet.

Gruß und Danke für eure ganzen Tipps,

Robert

an Stefan: wäre nett wenn du deine (komplette) Ausgangsbeschaltung 
posten könntest, denn momentan gehts hier nur bis ca. 40MHz sauber, 
danach steigt der Klirrfaktor doch recht stark an (bei 500MHZ 
Systemtakt)

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.