Forum: Mikrocontroller und Digitale Elektronik Ansteuerung Analog Devices DDS IC: AD9958 (SPI) mit Atmega


von Holger Meyer (Gast)


Lesenswert?

Hallo,

habe hier netterweise aus einer Industrieauflösung zwei Boards mit einem 
"Siganalgenerator-IC" (DDS-Prinzip) rumliegen, auf denen jeweils das IC 
selbst (jeweils ein Analog Devices AD9958, Datenblatt z.B. unter 
http://www.analog.com/en/prod/0%2C2877%2CAD9958%2C00.html ) und ein 
wenig Beschaltung inkl. Pinadapter drauf ist. Letztednlich muss ich die 
Dinger wohl "nur" noch ansteuern und synchronisieren.
Da hapert es aber auch schon dran, da ich im Grunde genommen keine/kaum 
Ahnung von der Materie habe und, speziell mit SPI, noch nie was gemacht 
habe. Als Controller soll ein ATMega128 dienen, gab es gleich dazu. 
Angeblich alles ganz einfach, sagte man mir mit einem Grinsen dazu :=)
Wenn ich nun das Datenblatt des AD9958 richtig verstanden habe, benutzt 
das DDS-IC eine SPI Schnittstelle zur Konfiguration. Allerdings hat der 
im Standard nur die Leitungen SCLK (ok, das dürfte/ist die "Clock" 
Leitung), SDIO_0 und SDIO_3. Letztere können unterschieldich belegt 
sein, per default mit Serial Data I/O bzw. SYNC_I/O. Der uController 
(ATMega 128) hat aber nur SCLK, MISO und MOSI. Was ist da zu machen, 
bzw. was haben die LEitungen am DDS-IC zu bedeuten? Komme damit 
irgednwie nicht klar, hätte gedacht, dass dort halt auch ein Master in, 
Slave out bzw. Master out, Slave in zu finden sein müsste.
Deshalb meine folgenden drei Fragen:

1) Wie wird ein SPI Bus überhaupt hardwaremäßig an den uController 
angeschlossen (euer Wiki sagt dazu leider nichts), da darüber ja auch 
die Programmierung erfolgt?
2) Wie muss der SPI Bus vom uController mit dem DDS-IC verbunden werden?
3) Gibt es Beispielcode (mit Interrupts/Hardware SPI) für den 
uController?

Ich weiß, ziemlich dreist von mir als Neuling, aber vor allem mit dem 
Anschluss des DDS-ICs (Frage 2) komme ich überhaupt nicht klar. Zum Rest 
(Frage 1 und 3) habe ich teilweise schon was gefunden, würde es nur 
gerne bestätigt wissen, bzw. wiederlegt bekommen.

Vielen Dank und Guten Rutsch vorab,

Holger

von Falk (Gast)


Lesenswert?

@ Holger Meyer

> 1) Wie wird ein SPI Bus überhaupt hardwaremäßig an den uController
> angeschlossen (euer Wiki sagt dazu leider nichts), da darüber ja auch
> die Programmierung erfolgt?

Naja, eben halt mit 3 wesenlichen Pins.

SCK, Taktausgang, geht vom uC (der ja meist der Master ist) zu allen 
Slaves
MOSI, Master Out, Slave in, geht vom uC zu allen Slave Dateneingängen
MISO, Master in, Slave out, geht vom Slave(s) zum uC

Dazu hat jeder Slave ein individuelles CS (Chip select), welches im 
allgemeinen LOW active ist.

> 2) Wie muss der SPI Bus vom uController mit dem DDS-IC verbunden werden?

AVR           DDS

SCK           SCLK
MOSI          SDIO_0
MISO          SDIO_2

optional
beliebiges IO Pin   CS

> 3) Gibt es Beispielcode (mit Interrupts/Hardware SPI) für den
> uController?

Möglich, hab aber keine Links zur Hand.

MFG
Falk

von Holger Meyer (Gast)


Lesenswert?

Hallo Falk,

vielen Dank für deine Antworten.
Das zu 1) war mir schon fast klar, bei einigen Schaltungen habe ich nur 
Widerstände integriert gesehen, bzw. teilweise gegen irgend ein 
Potential (GND, VCC) gezogen gesehen.
2) Hmmm, per default unterstützt der DDS-IC am SDIO_2 aber nichts (da er 
sich im Single Bit, 2-Wire-Mode befindet), d.h. ich muss ihn erst einmal 
in diesen Modus bekommen. Im Single Bit, 3-Wire-Mode wäre mir die Sache 
klar (bzw. zu der würde deine Beschreibung passen). Fragt sich nur, kann 
ich diesen Modus bei gleichbleibender Beschaltung (so wie du es unter 2) 
angegeben hast) erreichen? Sprich wenn ich am uController nur Daten an 
den DDS-IC senden kann, ob ich den Modus wechseln kann, so dass ich auch 
Daten auslesen kann.
3) ein paar Dinge habe ich schon zusammengetragen, würde mich aber immer 
über Tipps freuen.

Danke,

Holger

von Falk (Gast)


Lesenswert?

@ Holger Meyer

Nun ich nehme mal stark an (hab jetzt nicht das Datenblatt im Detail 
studiert) dass man einfach ein Register beschreiben muss, um den 3-Wire 
Modus einzuschalten. Ab da kann man dann auch lesen.

MFG
Falk

von Mirko (Gast)


Lesenswert?

richtig so wird es gemacht!

im dateblatt des AD9958 ist gaaaanz am Ende eine Register Map (Seite 34 
ff) und da steht auch drin welches Pin (CSR Bit 1 und 2) gesetzt werden 
(seite 36 links oben) muss um den 3-wire mode zu aktivieren! das kann 
man bei der initialisierung tun, denn es muss einiges eingestellt 
werden, damit das ganze sauber läuft! (z.B. lsb first, die 
sendereihenfolge muss beachtet werden, wie sieht die taktversorgung 
aus[quarzgenerator, grundewellenquarz], u.s.w.)

ich habe allerdings den "rückkanal" nie genutzt, mir hat es genügt, das 
die DDS die Frequenz rausgewürfelt hat, die ich mit dem Frequenzwort 
reingeschrieben habe!
-> man muss die 9958 nicht im 3-wire mode betreiben!
1
//Register 0 CSR
2
SPI_MasterTransmit(0x00); //ChannelSelectRegister beschreiben
3
SPI_MasterTransmit(0b11000010); //beide kanäle senden, einstellen des seriellen datenübertragungsmodus: 3wire, MSB first(default)

dann hättest du die DDS im 3-wire mode!

von Nides (Gast)


Lesenswert?

Hallo!

Ich wärm den Thread wieder auf, da ich auch ein Problem mit dem AD9958 
habe.

Der DDS läuft nur auf dem CH1 Kanal, auf dem CH0 bekomme ich kein 
Ausgangssignal.

Ablauf:

0x82       -> CSR  (setze kanal 1 , SPI)
0xA80000   -> FR1  (VCO Gain, Faktor 10)
0x00FFFFFF -> CTW0
IO_UPDATE

Kanal 1 läuft.

Gleiche Pruzedur mit 0x42 -> CSR funktioniert nicht.
Wenn ich die Register auslese, stehen aber richtige Werte drin.

Layoutfehler ausgeschlossen (>20 Kontollen),
den Chip hab ich auch schon getauscht (weil ich dachte ich hab den Kanal 
abgeschossen).

Da es beim 2ten Chip das selbe Problem ist, dachte ich an ein 
Konfigurationsproblem, aber ich komm einfach nicht dahinter.

Gibts irgendwelche infos die im Datenblatt fehlen? (Rev. 0)
Hat schon jemand beide Kanäle in Betrieb?

Danke für eure Hilfe,

Nides

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.