Forum: Mikrocontroller und Digitale Elektronik Datenaustausch von 2 Atmeag8 über SPI


von Benjamin (Gast)


Lesenswert?

Hallo!

Ich will Daten von einem Atmega8 zu einem 2. Atmega 8 via SPI 
übertragen.
Soweit hab ich das hingekriegt, ich übergebe mit dem SPI mehrere 8Bit 
Integer.
Jetzt passiert es aber manchmal wenn ich die Controller neu starte, dass 
sie sich irgenwie verhaspeln un nur noch schrott senden und nicht mehr 
die Integerwerte die ich haben will.
Jetzt bin ich auf der Suche wie ich sicherstellen kann, dass die beidern 
Controller synchronistert sind und somit ein verhaspeln nicht mehr 
möglich ist, oder eine andere Übertragunsart (String, etc.)
Kann mir da jemand weiterhelfen?

MfG

Benjamin

von Dirk H. (arm-dran)


Lesenswert?

Benjamin wrote:
> Hallo!
>
> Ich will Daten von einem Atmega8 zu einem 2. Atmega 8 via SPI
> übertragen.
> Soweit hab ich das hingekriegt, ich übergebe mit dem SPI mehrere 8Bit
> Integer.
> Jetzt passiert es aber manchmal wenn ich die Controller neu starte, dass
> sie sich irgenwie verhaspeln un nur noch schrott senden und nicht mehr
> die Integerwerte die ich haben will.
> Jetzt bin ich auf der Suche wie ich sicherstellen kann, dass die beidern
> Controller synchronistert sind und somit ein verhaspeln nicht mehr
> möglich ist, oder eine andere Übertragunsart (String, etc.)
> Kann mir da jemand weiterhelfen?
>
> MfG
>
> Benjamin

Übertrage die Daten im ASCII Format.

Daher statt 0FFh sendest Du auf 2 mal "F" "F" und nimmst die ASCII 
Steuercodes zur Synchronisation

von Benjamin (Gast)


Lesenswert?

Wie ich die 16 Bit in 2  8Bit aufteile ist mir nun klar, funktioniert 
auch.
Nur das syncronisieren funktioniert nicht.
Kannst du mir da etwas auf die Sprünge helfen?
Geht das nicht auch mit dem SS-Pin?
Ach ich verzweifel nioch!

MfG Benjamin

von Dirk H. (arm-dran)


Lesenswert?

Benjamin wrote:
> Wie ich die 16 Bit in 2  8Bit aufteile ist mir nun klar, funktioniert
> auch.
> Nur das syncronisieren funktioniert nicht.
> Kannst du mir da etwas auf die Sprünge helfen?
> Geht das nicht auch mit dem SS-Pin?
> Ach ich verzweifel nioch!
>
> MfG Benjamin

Ist die Übertragung bidirektional ???
Also Datenaustausch in beide Richtungen?

Den SS Pin brauchst Du ja, um dem 2.Controller mitzuteilen, das er nicht 
der Taktmaster ist.
Eine Möglichkeit wäre, wenn Du noch einen PIN pro MCU frei hättest.
Der Master würde dann beim Slave über diesen PIN eine Art FRAME also
den Beginn eines Datenpaketes freigeben. Wenn Du diesen PIN am Slave auf 
einen externen Interrupt legen würdest, könntest Du dem µC so mitteilen,
daß jetzt der Beginn einer neuen Übertragung stattfindet

von dsche (Gast)


Lesenswert?

herrje, is doch alles so schön im manual erklärt:

"After each data packet, the Master will synchronize the Slave by 
pulling high the Slave Select, SS, line."

"but the data will not be shifted out by incoming clock pulses on the 
SCK pin until the SS pin is driven low."

"In SPI Slave mode, the control logic will sample the incoming signal of 
the SCK pin."

"The SS pin is useful for packet/byte synchronization to keep the Slave 
bit counter synchronous with the master clock generator. When the SS pin 
is driven high, the SPI Slave will immediately reset the send and 
receive logic, and drop any partially received data in the Shift 
Register."


sollte ausreichend sein...

von Dirk H. (arm-dran)


Lesenswert?

dsche wrote:
> herrje, is doch alles so schön im manual erklärt:
>

Er meint wohl nicht die Bit Synchronisation durch SS sondern
die eines Datenstrings, in dem alle Datenbytes den selben Wert annehmen 
können.

Verstehe das so:

Der Master sendet fortlaufend, der Slave schaltet an irgendeiner Stelle 
zu
und muß sich mit dem Datenstrom synchronisieren.
Und das lässt sich nicht mit dem SS-Signal realisieren.

von Benjamin (Gast)


Lesenswert?

Genau!
Das ist das exakt das Problem an dem ich hänge!
Ich übertrage (Master) eben fortlaufend Zahlen und schalte irgendwann 
den Slave dazu, der diese empfangen soll.
Es kommt aber nur Schrott an, es sei denn ich schalte ihn zufällig an 
der richtigen Stelle zu was aber sehr selten sein dürfte.
Kannst du mir da weiterhelfen das mit den ASII-Steuerzeichen war mit 
nicht ganz klar?!
Danke!

MfG  Benjamin

von Frankl (Gast)


Lesenswert?

Der Master schaltet den SS.
Slave gibt irgenwann den SPI interrupt frei, da er mit anderen 
Zeitkritischenroutinen beschäftigt ist. Im SPI Interrupt wird dann vom 
Slave ein Bestätigungssignal gesetzt, somit weiß der Master das der 
Slave Zeit für ihn hat und das er mit der Übertragung beginnen kann.

von Dirk H. (arm-dran)


Lesenswert?

Frankl wrote:
> Der Master schaltet den SS.
> Slave gibt irgenwann den SPI interrupt frei, da er mit anderen
> Zeitkritischenroutinen beschäftigt ist. Im SPI Interrupt wird dann vom
> Slave ein Bestätigungssignal gesetzt, somit weiß der Master das der
> Slave Zeit für ihn hat und das er mit der Übertragung beginnen kann.

Uiiii, jetzt wirds kompliziert. Hört sich nach einem Hard/Software 
Handshake an.

Also ich hab das sooo verstanden:

Der Master sendet und sendet und sendet, ähnlich wie ein Radio oder 
Fernsehsender und es ist Ihm dabei egal ob ein Teilnehmer zuhört.
(Das Problem mit der GEZ lassen wir hier mal außenvor ;-) )

Der Empfänger schaltet sich zu, also
Der Zuschauer schaltet seinen Fernseher ein. Da läuft gerade ein 
Sendung.
Ich will aber eine Sendung von Anfang an sehen. Also ist mir das was 
gerade läuft egal und ich warte bis zum Anfang der nächsten.

Die Aufgabenstellung ist nun, dem Zuhörer klar zu machen, was der Anfang 
der nächsten Sendung ist.

Für den µC als ASCII Format heisst das zum Beispiel:

STX [02],...........ETX [03]

Start    ........... Stop

Die Daten zwischen STX und ETX im ASCII Format umwandeln
Es können noch Funktions/ ID Bytes eingefügt werden
ByteCounter
Checksummenberechnung

Kommt auf den Anwendungsfall an.

Dirk



von Frankl (Gast)


Lesenswert?

Im Prinzip richtig. Aber das Sync-Signal vom Slave ist einfach eine 
Hardwareverbindung also ein Bit. Wenn man mehrer Slaves hat, kann man 
das Signal noch mit Dioden entkoppeln, da ja das aufschalten des 
Slave-Sync-Signal in der SPI Serviceroutine geschieht. So braucht man 
nur eine Leitung für mehrer Slaves.

von Dirk H. (arm-dran)


Lesenswert?

äähhmmm,

ich glaube der Sinn oder die Funtion des SS-Signal steht bereits fest.
Das SlaveSelect Signal gibt ja dem Slave nur an, daß jetzt eine 
Übertragung beginnt und er sich synchronisieren soll, für das zu 
übertragende Byte.

Er braucht aber ein Beispiel für ein Übertragungsprotokoll vieler Bytes
vom Master zu EINEM Slave.

Außerdem ist das SS Signal für Slave µCs oder Masterfähige Devices 
gedacht.

Bei Standard Peripherie Logik wie Schieberegister etc. kann dieses 
Signal
als Chipselect bzw. Latch für diese Bausteine genutzt werden.
Eine Taktsynchronisation ist hier nicht notwendig, da sie ausschließlich 
vom Master erzeugt wird.

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.