Clock und Datenempfang synchronisieren

Gast #1826657
Lesenswert?

Hallo Gemeinde!

Ich bekomme aus einer Schaltung die Clock- und die Datenleitung.
Beide Signale sind 32 Bit lang und werden synchron und parallel 
ausgegeben.
Diese 32 Bit Impulspakete trten ca alle 160ms auf. Die Pulsbreite ist 
nur 'wenige' µs breit.

Meine Frage: Wie muss im Prinzip die Empfangsroutine in der MCU aussehen 
damit die MCU immer auf die erste Flanke des ankommenden Clocksignals 
synchronisiert?


Viielen Dank für eure Antworten!
Angehängte Dateien:
#1826662
Lesenswert?

Prinzipal schrieb:

> Meine Frage: Wie muss im Prinzip die Empfangsroutine in der MCU aussehen
> damit die MCU immer auf die erste Flanke des ankommenden Clocksignals
> synchronisiert?

So wie jede andere auch, die auf eine Flanke an einem Eingang pollt.

Ständiger Vergleich des aktuellen Pegels mit dem vorhergehenden Pegel. 
Sind die beiden unterschiedlich, dann ist die Flanke gekommen.

Oder aber über eine Interrupt Routine, die aufgrund der Flanke am SCK 
Eingang des µC angesprungen wird.

Du kannst aber auch dem Chip vorgeben, dass nicht er derjenige ist, der 
das SCK Signal generiert, sondern das er gefälligst auf deinen Clock 
hören soll, und damit löst sich dann das Problem ganz von alleine in 
Luft auf. Wenn du die Schaltung noch ändern kannst/darfst, 
selbstverständlich.
Gast #1826683
Lesenswert?

Danke für die schnelle Antwort!

Ja, leider kann/darf ich die Schaltung nicht ändern, sondt hätte ich den 
Clock vorgegeben.

Mit Polling/Interrupt des Clocksignals hab ich noch Verständnissproblem.
Wenn ich z.B. auf die pos. Flanke teste, woher weiss ich, ob das der 
Anfang des Clocks ist, oder ob ich den Clock nicht mitten im 
32-Bit-Strom erfasst habe. Ich muss da doch die Zeit mitberücksichtigen. 
Oder denke ich zu kompliziert?
#1826693
Lesenswert?

Prinzipal schrieb:

> Mit Polling/Interrupt des Clocksignals hab ich noch Verständnissproblem.
> Wenn ich z.B. auf die pos. Flanke teste, woher weiss ich, ob das der
> Anfang des Clocks ist, oder ob ich den Clock nicht mitten im
> 32-Bit-Strom erfasst habe.


Du startest je selber die Funktionalität, durch Bedienen des Chip Select 
Signals.

Du ziehst Chip Select auf Low und dann kannst du schon anfangen auf die 
Flanke zu warten.
Gast #1826727
Lesenswert?

Hi, die Beschaltung die Du verwendest sendet kontinuierlich die 
Wandlungsergebnisse raus. Bevor das Ergebnis übertragen wird, ist der 
SCK auf "1". Also auf negative Flanke von SCK den Interrupt setzten, 
dann mit jeder folgenden positiven Flanke die Daten übernehmen. Die SPI 
Hardware ist vielleicht geeignet, aber üblicherweise nur 8Bit. Du mußt 
also die vier 8Bit Päckchen schnell genug abholen.

Der Trick besteht jetzt im richtigen Timing zwischen Freigeben/Sperren 
des Trigger Interrupts und der Verarbeitung der SPI Daten. Basis ist 
aber im Grunde die 32Bit SPI Übertragung. Da gibt's doch bestimmt was 
von Ratiopharm ;)

@Buchegger
CS ist fest auf low, damit ist eine aktive Steuerung nicht möglich.
#1826747
Lesenswert?

@Martin Fischer
Wenn schon das Abholen der Bytes aus der SPI-Hardware Probleme bereiten 
sollte, wie sieht es da erst mit der Interrupt-Lösung aus? ;)

Auf einem 8-Bit AVR würde ich das so machen:

SPI-ISR liest Byte aus, speichert es in einem Array, setzt Flag, wenn 
vier erreicht sind, setzt TimerX auf null, löscht TimerX-Overflow-Flag 
und aktiviert TimerX-Overflow Interrupt (für Time-Out)

TimerX-Overflow-ISR schaltet SPI aus und wieder ein (initialisiert sie 
dadurch wieder), setzt den Zähler für das Array wieder auf null und 
deaktiviert sich selbst.

Die Hauptroutine muss zu Beginn die SPI-Schnittstelle konfigurieren und 
den SPI-Interrupt aktivieren. Ab da läuft alles im Hintergrund und man 
muss nur noch das Flag abfragen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren