mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 & AD9826: SPI Anbindung


Autor: Pepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.
Ich möchte an einen STM32F7 einen AD9826 anbinden. Der AD9826 verfügt 
über ein serielles Interface für die Ansteuerung seiner Register.

Der AD9826 hat einen SDATA-Pin, der sowohl Ausgang(Read) als auch 
Eingang(Write) sein kann. Zur Auswahl, ob gelesen oder geschrieben wird, 
erwartet der AD9826 zuerst einen "4Bit-Header" mit der Info Read/Write 
und der Registernummer. Danach schaltet der AD9826 offensichtlich seinen 
SDATA entsprechend dieses Headers auf Input oder Output.

Ich hab jetzt schon einiges mit SPI gemacht. Aber dies kam mir noch 
nicht unter. Kann man sowas per SPI im STM32 lösen oder muss ich dies 
rein per Firmware lösen?

Vielen Dank schon mal.
Pepe.

Autor: Dabla Lesa (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Pepe schrieb:
> Zur Auswahl, ob gelesen oder geschrieben wird,
> erwartet der AD9826 zuerst einen "4Bit-Header" mit der Info Read/Write
> und der Registernummer.

Mit 4 Bit wird er nicht zufrieden sein. Denn ich sehe im
Protokoll 8 (in Worten acht) Bits die gesendet werden.
Davon werden dann 4 Bits ausgewertet. Wenn du ihm nur 4 Bits
sendest steht seine Zustandsmaschine, solange nicht weitere
4 Bits kommen oder der CS inaktiv wird.

Autor: Pepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die restlichen 3 Bits hab ich unterschlagen. (Wenn ich richtig gezählt 
habe, sind es übrigens 7 Low-High-Flanken.)

Mir geht's aber auch um was anderes:
Je nach "Header" schaltet der AD9826 ja sein SDATA auf Output oder 
Input. Somit muss ich den STM32 ja auch entsprechend konfigurieren. Z.B. 
den MOSI deaktivieren beim Lesen der Register, damit ich mir den Ausgang 
nicht brate.

Mich würde interessieren, ob man dies "automatisieren" kann oder nicht. 
Oder vielleicht ist dies ja auch gar kein SPI, sondern WasAuchImmer...

Autor: Dabla Lesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pepe schrieb:
> Die restlichen 3 Bits hab ich unterschlagen. (Wenn ich richtig gezählt
> habe, sind es übrigens 7 Low-High-Flanken.)

Das wäre die dümmste Implementierung ich ich je gesehen habe.
Das traue ich weder Analog Devices noch irgendeinem anderen
Chip Hersteller zu.

Zähle nochmals sorgfältig!

Autor: Pepe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab nochmal nachgezählt. Zuerst 7 Bits für den "Header" und dann
9 Bits für den Teil, den Du lesen oder schreiben willst.

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor allem will das Teil dann noch 9 Datenbits.
Echt nen komisches Protokoll, da bleibt wohl nurnoch Bitbanging als 
Lösung.
Insgesamt sins aber wieder 16 Taktflanken, vllt gibts doch nen Trick?

Der SPI im STM32 kann übrigens:
"Simplex synchronous transfers on two lines with or without a 
bidirectional data line"
Das wäre dann SPI mit einem bidirektionalen "SDATA", aber eben nur in 
8Bit Blöcken umschaltbar.
Dazu angucken was die BIDIMODE und BIDIOE Bits machen.

Autor: A. B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MISO vom STM32 direkt an SDATA, MOSI über Widerstand (10 bis 30 kOhm) an 
SDATA, 16-Bit Transfer beim SPI einstellen.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mw E. schrieb:
> Vor allem will das Teil dann noch 9 Datenbits.
> Echt nen komisches Protokoll, da bleibt wohl nurnoch Bitbanging als
> Lösung.

Nö, das kann jede normale SPI Einheit als 2 Byte transferrieren. Muss 
man beim Lesen dann hinterher halt zusammen fummeln oder beim Schreiben 
vorher zurecht schieben.

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann machmal ne Read Operation ohne D8 wu wissen, das gibt nen netten 
kurzen.

Autor: Pepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Schreiben seh' ich auch kein Thema. Die 16Bit raus und gut.
Nur beim Lesen bedeutet dies ja, dass ich zuerst 4 Bits (=Header) zur 
Auswahl des Registers rausschicken muss, dann hab ich die 3 Bits Zeit, 
um den STM32 auf "Read" umzustellen und dann kann ich die 9 Bits 
einlesen.

Oder: Der STM32 hat ja noch einen 2. SPI. Dann könnte ich ja einen nur 
zum Schreiben einsetzen und den anderen rein zum Lesen. Ich muss nur 
sicherstellen, dass der "Schreibende" beim setzen der Registeradresse 
nur die ersten 4 Bit schickt. Der Takt des schreibenden SPI wird dann 
als Takt für den Lesenden verwendet.

Autor: A. B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pepe schrieb:

> Oder: Der STM32 hat ja noch einen 2. SPI. Dann könnte ich ja einen nur
> zum Schreiben einsetzen und den anderen rein zum Lesen. Ich muss nur
> sicherstellen, dass der "Schreibende" beim setzen der Registeradresse
> nur die ersten 4 Bit schickt. Der Takt des schreibenden SPI wird dann
> als Takt für den Lesenden verwendet.

Man kann sich auch einen Knopf ans Knie nageln oder schrauben ...
Viel Spaß dabei ;-)

Autor: Pepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. B. schrieb:
> Man kann sich auch einen Knopf ans Knie nageln oder schrauben ...
> Viel Spaß dabei ;-)

Wahrscheinlich aber trotzdem einfacher, als das Ganze per Firmware 
aufzubauen. Noch dazu möchte ich ja während der Kommunikation noch was 
anderes tun...

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was haben die Leute nur früher gemacht als es noch keine SPI Einheiten 
gab. Nimm 2 normale I/O Pins und 2 Schleifen Put und Get. Oder ist das 
zu einfach ?

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder schau bei den UART Funktionen. Evtl gibts da was mit 9 bit.

Autor: Pepe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan schrieb:
> UART Funktionen

Würde sicherlich auch gehen. Aber mein Problem sind nicht die 9 Bits, 
sondern der Header mit 4 Bits. Die ersten 4 Bits muss der STM32 immer 
schreiben und dann Lesen oder Weiterschreiben.
Und beim Header kann ich im Datenblatt nicht raus finden, ab welchem 
Clock die Datenleitung von Input auf Output umgeschalten wird. Um auf 
Nummer Sicher zu gehen, würde ich meinen MOSI direkt nach dem 4 Bit 
"rausnehmen" (wie ich dies auch immer lösen werde...)

Autor: A. B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pepe schrieb:

> Würde sicherlich auch gehen. Aber mein Problem sind nicht die 9 Bits,
> sondern der Header mit 4 Bits. Die ersten 4 Bits muss der STM32 immer
> schreiben und dann Lesen oder Weiterschreiben.

Irgendwie die Funktionsweise vom SPI nicht verstanden.
Auch zum Lesen "schiebt" man gleichzeitig Bits heraus.

> Und beim Header kann ich im Datenblatt nicht raus finden, ab welchem
> Clock die Datenleitung von Input auf Output umgeschalten wird. Um auf

Irgendwo zwischen dem 4-ten und dem 7-tem. Wo genau, ist egal.

> Nummer Sicher zu gehen, würde ich meinen MOSI direkt nach dem 4 Bit
> "rausnehmen" (wie ich dies auch immer lösen werde...)

So ein Unfug! Mal abgesehen davon, dass eine eventuelle Fehlfunktion der 
Firmware, Glitch auf der Versorgung ...
Wie schon geschrieben, Widerstand zwischen MOSI und SDATA, MISO direkt 
an SDATA, dann geht das Lesen und Schreiben mit Einstellung 16 Bit 
problemlos.
Wenn der AD SDATA auf Ausgang schaltet, arbeiten dann zwar SDATA und 
MOSI u. U. gegeneinander, aber der Widerstand begrenzt den Strom auf 
sicheren Wert, und da MISO direkt am SDATA hängt, gewinnt der Pegel an 
SDATA.

Und wenn das immer noch zu hoch sein sollte: So paar kümmerliche Bits 
bekommt man wohl auch ohne irgendsoein Trallala per Bitbanging hin. Der 
Widerstand zwischen SDATA und dem GPIO Pin ist aber auch dann eine 
sinnvolle Sicherheitsmaßnahme.

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist mir grade übern Bildschirm gescrollt:
Bei nem STM32F030 kann der SPI: "the frame size is configurable from 4 
bits to 16 bits."

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.