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
@ 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
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
@ 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
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.