Forum: Mikrocontroller und Digitale Elektronik DAC AD5065 über SPI


von Christian S. (vivus)


Angehängte Dateien:

Lesenswert?

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
von MWS (Gast)


Lesenswert?

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.

von Christian S. (vivus)


Lesenswert?

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
von MWS (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von Christian S. (vivus)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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

von Christian S. (vivus)


Lesenswert?

Es geht nicht darum es zu tun, sondern zu verstehen...

von MWS (Gast)


Lesenswert?

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.

von Christian S. (vivus)


Lesenswert?

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.

von MWS (Gast)


Lesenswert?

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.

von Christian S. (vivus)


Lesenswert?

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
Noch kein Account? Hier anmelden.