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
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
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
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.
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
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
@ 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
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.
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
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
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
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
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
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
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)