Hallo, habe einen AVR 328P der via SPI den AD5065 steuern soll. Kurze Vorgeschichte: Ich habe die Funktion für den DAC gestern kurz geschrieben. Dabei bin ich davon ausgegangen, dass der MCU bereits auf fallende Flanke eingestellt ist. ALs ich dann die Werte gesendet habe, passierte nichts. Dann hab ich versucht die Werte zu variieren, um den Fehler zu finden. Es hat dann bei 0x04 oder 0x05 für den CMD funktioniert. Dann ist mir aufgefallen, dass ich den MCU garnicht auf fallende, sondern auf steigende Flanke eingestellt hab. Dies hab ich dann umgestellt un seit dem klappts nimmer. Nun zu meinem Problem: Hab mir die 32Bit zusammen gesetzt und versende diese. (Anhang) Leider will der DAC aber nicht so wie ich das will. OUTA und B bleiben bei 0V. Ich habe das Gefühl, ich sehe einen Hinweis im Datenblatt nicht. Wenn ich das richtig verstehe, reagiert der DAC auf die fallende Flanke. Dh. die Bis müssten sein: Adresse: 1111 (Beide DACs auswählen) Command: 0010 (Ins Register schreiben und alle updaten) 16 Bit hab ich irgend nen Wert drin. Aktuell 3.xxV Die Frage ist nur, ob der Anhang so korrekt ist oder ob ich das Datenblatt nicht verstehe. Die Schaltung habe ich einmal aufgebaut und seit gestern nicht mehr geändert. Gruß // Update: CH1: SCK CH2: DIN CH3: SS Pin (Sync)
:
Bearbeitet durch User
Christian S. schrieb: > Wenn ich das richtig verstehe, reagiert der DAC auf die fallende Flanke. Richtig verstanden: "Data from the DIN line is clocked into the 32-bit shift register on the falling edge of SCLK." Das DB spricht von: "The SYNC line must be brought high within 30 ns of the 32nd falling edge of SCLK." Auf LA.jpg sieht's nicht wie 30ns, eher wie 2µs aus.
Das habe ich auch schon überlegt. Allerdings setze ich den SS bin direkt nachdem ich die Daten versendet habe wieder auf high.
1 | void spi_tranceiver (int cmd) { |
2 | SPDR = cmd; |
3 | while(!(SPSR&(1<<SPIF))); |
4 | }
|
Der MCU läuft mit 16Mhz extern.
:
Bearbeitet durch User
Christian S. schrieb: > Das habe ich auch schon überlegt. Allerdings setze ich den SS bin > direkt > nachdem ich die Daten versendet habe wieder auf high. Die Abarbeitungszeit im Code dauert, das ändert nichts daran, dass das Timing lt. DB nicht eingehalten werden kann. Du wirst das Timing nicht einhalten können, denn selbst bei 20MHz Systemtakt würde jede einzelne Pozessortakt bereits 50ns dauern. Nachfolgende Befehle benötigen ein Vielfaches davon. Die Hard-SPI des ATM328 bietet nicht an, SS gleichzeitig mit dem letzten der Takte hochzuziehen. Einzige Chance das Timing einzuhalten, wäre m.E. eine angepasste Soft-SPI, bei der Sync zeitgleich mit der letzten fallenden Flanke gesetzt wird.
Christian S. schrieb: > Der MCU läuft mit 16Mhz extern. Da komme ich auf 62,5 ns pro Takt - deutlich zu langsam. Übrigens wartet Dein Code nach der 32. fallenden Flanke wieder auf eine ansteigene, was wegen o.g. SYNC Verhaltens nie funtionieren kann. Die 30 ns klingen für mich nach Software-SPI. SCK und SYNC auf denselben PORT legen, denn sie müssen in derselben Instruktion im 32. SPI Takt geschrieben werden.
Dh. ich könnte z.b. AD5663 verwenden. Hier finde ich nämlich keine Angabe, nur das es "0" min sein sollte. Denke ja mal, dass es da dann keine Rolle spielt...
Christian S. schrieb: > Dh. ich könnte z.b. AD5663 verwenden. Hier finde ich nämlich keine > Angabe, nur das es "0" min sein sollte. Denke ja mal, dass es da dann > keine Rolle spielt... Einfach so lange Bauteile tauschen, bis die HW zum Code passt. LOL
Christian S. schrieb: > Es geht nicht darum es zu tun, sondern zu verstehen... Ist bloß zweckfrei, wenn man eine bestimmte HW hat und man sich an die Anforderungen der betreffenden HW zu halten hat.
Nochmal: Ich will nicht die HW ändern, ich will nur um etwas dazu zu lernen wissen, ob ich mit der obigen Aussagen korrekt liege. Ich habe damit nicht Soft SPI ausgeschlossen.
Christian S. schrieb: > Nochmal: Ich will nicht die HW ändern, ich will nur um etwas dazu > zu > lernen wissen, ob ich mit der obigen Aussagen korrekt liege. Ich habe > damit nicht Soft SPI ausgeschlossen. Was verstehst Du daran nicht, dass Du Dich an das DB Deines spezifischen Bausteins zu halten und die Timings irgendwie zu erfüllen hast? Wenn ein anderer Baustein bestimmte Anforderungen des einen Bausteins nicht hat, so wird's bei dem wohl tatsächlich anders sein - oder das DB ist falsch, unvollständig, oder was auch immer.
Jim Meba schrieb: > Übrigens wartet Dein Code nach der 32. fallenden Flanke wieder auf eine > ansteigene, was wegen o.g. SYNC Verhaltens nie funtionieren kann. Kannst du genauer erklären, was du damit meinst? Warum wartet er auf eine ansteigende?
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.