Forum: Mikrocontroller und Digitale Elektronik 16 Bit SPI Übertragung


von Michael M. (moonuser)


Lesenswert?

Hallo,
ich bekomme von einem Prozessor über SPI Datenworte mit 16 Bit 
übertragen, die ich gerne mit einem Mega 16 empfangen möchte. Es gibt 
keine Pause nach 8 Bit. Geht das mit Atmega und co? Was ist der maximale 
externe Takt? 20 MHz /2  bei 20 MHz Quarz?

Wäre nett wenn ich ein paar Tips bekommeen könnte

Grüße

von aaa (Gast)


Lesenswert?


von Matthias (Gast)


Lesenswert?

...Es gibt keine Pause nach 8 Bit....

Im Atmel schon, nach einem empfangenen Byte gibts ein Flag bzw. 
Interruppt. du hast dann "ein Byte lang" Zeit, das da rauszulesen, bevor 
das nächste kommt...

von aaa (Gast)


Lesenswert?

dann must du ein array bauen und die daten reinschieben.welchen compiler 
benutzt du ??

von aaa (Gast)


Lesenswert?

The clock rate selects the division of the of the oscillator frequency 
that serves as the SPI clock. So with 4 you will have a clockrate of 
4.000000 / 4 = 1 MHz , when a 4 MHZ XTAL is used.

von Michael M. (moonuser)


Lesenswert?

aaa wrote:
> dann must du ein array bauen und die daten reinschieben.welchen compiler
> benutzt du ??

Hallo aaa,
das mit dem Array ist kein Problem solange ich es in C programmiere.
Verwende GCC.

Auf jeden Fall hört sich das alles schon mal gut an.

von Michael M. (moonuser)


Lesenswert?

aaa wrote:
> The clock rate selects the division of the of the oscillator frequency
> that serves as the SPI clock. So with 4 you will have a clockrate of
> 4.000000 / 4 = 1 MHz , when a 4 MHZ XTAL is used.

Hi,
the smallest div for SPI is 2- that means it can work with 10 MHz!?

thx

von Ralph (Gast)


Lesenswert?

@ Mathias
Die Daten liegen ohne Pause an. Wenn also der Atmel nach 8 Bit eine 
Pause macht, dann gehen die nächsten 8 Bit verloren da der Master diese 
Pause nicht macht.
Der Master interessiert sich nicht für die Pause die sich der AVR gönnt, 
sondern taktet stur weiter.



Die Frage lautet doch einfach ausgedrückt:
Können die AVR's ein 16 Bit datenwort empfangen, oder können die AVR's 
nur 8 Bit. ==> Wieviele Bit hat das Schieberegister.

@Michael
Kannst du die 16 Bitübertragung in 2 x 8Bit aufteilen, oder kommst du da 
nicht ran ?

Falls es nicht geht wirst du dir anstatt der AVR's einen µC suchen 
müssen, der an der SPI 16 Bitworte unterstützt. z.B. ARM 7

von aaa (Gast)


Lesenswert?


von Michael M. (moonuser)


Lesenswert?

Hey Ralph,

habe das schon befürchtet- z.B. Arm 7.
Aber warum sollte der AVR 8 Bit vergessen? Soweit ich gelesen habe, ist 
das Register doppelt gepuffert- Dann müsset es doch klappen. 8 Bit 
werden übernommen, wenn diese eingetroffen sind. Dann kann ich 8 
auslesen, währen die nächsten 8 eintreffen.

Ich komme da nicht rsan was gesendet wird- sonst wärs ja kein Problem.

Michael

von aaa (Gast)


Lesenswert?

also so viel ich weiss kann man die SPI schnittstelle auch per software
nachbilden,

von Dieter Werner (Gast)


Lesenswert?

> Soweit ich gelesen habe, ist das Register doppelt gepuffert- Dann müsste > es 
doch klappen. 8 Bit werden übernommen, wenn diese eingetroffen sind. > Dann kann 
ich 8 auslesen, währen die nächsten 8 eintreffen.

Das Datenblatt sagt dazu:

When receiving data, however, a received character must be read from the 
SPI Data Register before the next character has been completely shifted 
in. Otherwise, the first byte is lost.

Es sollte also tatsächlich klappe(r)n.

von Ralph (Gast)


Lesenswert?

Ich kenne die AVR Struktur nicht gut genug um dir das genau sagen zu 
können. Aber es gibt hier im Forum schon genug Spezi's.

Nur der Master taktet die Daten stur raus. Wenn der AVR nur ein 8 Bit 
Schieberegister hat, vergeht einige Zeit für das Verschieben der 1. 8 
Bit ins Pufferregister. Der Master taktet weiter. Die Frage ist, ob das 
Timing dann noch hinkommt , oder ob dabei Bits verloren gehen.

Eine zuverlässige Übertragung wirst du nur hinbekommen wenn dein µC ein 
16 Bit Schieberegister hat.


von aaa (Gast)


Lesenswert?


von Michael M. (moonuser)


Lesenswert?

Ich sehe zu, das ich morgen die Signale etwas bügel und mir nen 20 MHz 
Quartz besorge. Dann teste ich es morgen- ich denke theoretisch sollte 
es klappen.

von Ralph (Gast)


Lesenswert?

@ Dieter
Das funktioniert aber nur wenn du garantieren kannst das der IRQ, um das 
Datenbyte zu lesen, abgeabeitet ist, BEVOR das 2. Byte übertragen ist.
Wie willst du das garantieren können?

@ aaa
Welche Datenrate ist denn mit einer Softwarenachbildung der SPI 
erreichbar?
Ich bezweifele das eine Softwarelösung schnell genug ist.

"Was ist der maximale externe Takt? 20 MHz /2  bei 20 MHz Quarz?"

von aaa (Gast)


Lesenswert?

sage mal betreibts du deine spi über interrupt

von Michael M. (moonuser)


Lesenswert?

Nein bei den Zeiten werde ich wohl einen Loop um die Abfrage nach einem 
neuen Byte drum bauen. Da kommen mehrere Datenworte rein und dann ist 
erst mal Pause. Die Pause ist fest und dann habe Zeit für andere Sachen.
Und man kann sich die Dauer der Opereationen ausrechen, bzw. ausmessen.

Michael

von Matthias (Gast)


Lesenswert?

...Wenn also der Atmel nach 8 Bit eine Pause macht, dann g...

nein, das habe ich nicht gesagt:

Der Atmel (die Hardware) informiert die Applikation (Sotfware) nach dem 
Empfang von 8bit = 1Byte, dass ein Byte eingetrudelt ist. Währenddessen 
kann das nächste Byte (bei dir: die nächsten 8bits) hereingeschoben 
werden.

BEVOR dieses zweite Byte (deine nächsten 8bit) komplett hereingeschoben 
ist, musst du dieses abgeholt haben, sonst ist das erste verloren!
ich zitiere Dieter Werner (Gast)
...
When receiving data, however, a received character must be read from the
SPI Data Register before the next character has been completely shifted
in. Otherwise, the first byte is lost.


Also, es geht definitiv!

Wenn du aber mit dem Atmel Daten empfängst, also im Slavemode, kann die 
max. SPI-Taktfrequenz nur ein Viertel des Quartztaktes sein (glaub das 
war so).
Also bei deinen 20MHz würdest du auf 625kByte/s kommen und hättest somit 
1,6µsek Zeit, das Byte abzuholen..

von Ralph (Gast)


Lesenswert?

@aaa
Wie denn sonst? für Polling musst du auf dem µC viel "freie" Zeit haben.
Hat dein µC mehr zu tun als die SPI bleibt gar nichts anderes übrig.


von aaa (Gast)


Lesenswert?

interrupt ist aber nun mal das schnellste wie du wissen solltest.

von Matthias (Gast)


Lesenswert?

@ Ralph (Gast):

Was anderes als Polling ist definitiv NICHT möglich!
Ein Interrupteinsprung+raus dauert länger als ein Byte zu übertragen!
(1Byte=8bits=8*4=32Quartztakte= ~16..32ASM Befehle...)

Ich habe ähnliche Versuche (nur halt µC als Master) schon gemacht.
Ohne Interrupt hab ichs geschafft, 24Bytes in 35µsek aus einem nicht 
sortierten Array zu holen und komplett zu versenden..

von Ralph (Gast)


Lesenswert?

1,6µsek Zeit für den Einsprung in die IRQ Routine und auslesen des 1. 
Bytes.
Ein Strammes Timing, wie willst du garantieren das du das einhalten 
kannst.

von Ralph (Gast)


Lesenswert?

@Michael

Du solltest mal ernsthaft darüber nachdenken, ob der AVR Mega der 
richtige µC für DIESE Anwendung ist.
Ich hab da meine Zweifel.

Ein µC der 16 Bit SPI hardwareseitig unterstützt wäre hier wesentlich 
sinnvoller.

von keksladen (Gast)


Lesenswert?

Der Master gibt den Takt an und sofern der Slave das SPI Protokoll 
richtig unterstützt, was wir nunmal vorraussetzen, dann sollte das kein 
Problem sein erst das eine Byte und anschließend das andere Byte 
auszulesen.

Der Slave muss doch zwangsweise warten, bis der Master weitertaktet. 
Das hat nichts mit irgendeiner internen Pufferung zu tun.

Einziges Problem das auftreten könnte, ist, dass das slave device einen 
gewissen timeout hat und somit eine Übertragung abbricht, falls diese 
nicht in einer gewissen Zeitspanne stattgefunden hat. Einfach um zu 
gewährleisten, dass es nicht selber in einem Endlos-Wartezustand hängt.
Das ganze halte ich aber für eher unwarscheinlich.

von Ralph (Gast)


Lesenswert?

@keksladen

Der SLAVE macht die Pause.
Der MASTER taktet die 16 Bit ohne Unterbrechung durch.

von Matthias (Gast)


Lesenswert?

Der Slave macht keine Pause!

Das Schieberegister ist drekt mit dem Takt des Masters verbunden!

von aaa (Gast)


Lesenswert?

versuch mal ein schiebe register einzubauen..
MC74HC589A
http://www.onsemi.com/pub/Collateral/AND8148-D.PDF

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ralph wrote:
> 1,6µsek Zeit für den Einsprung in die IRQ Routine und auslesen des 1.
> Bytes.
> Ein Strammes Timing, wie willst du garantieren das du das einhalten
> kannst.
So schwer zu garantieren ist das nun wirklich nicht...

Der Einsprung in die ISR dauert je nach gerade ausgeführtem Befehl 4 
Takte
macht bei 20Mhz: 0,2µs

Dann mußt du das Byte holen und Speichern, also etwa so:

push r17
in r17, SPIDATABYTE
st Z+, r17
pop r17

sind 5 Takte also
0,25µs

man sollte natürlich noch ein reti durchführen das sind nochmal 2 Takte 
also 0,1µs

Summa Summarum komme ich auf 0,55µs bleiben dir noch 1,05µs oder 21 
Takte um irgenwas anderes zu machen.

Also soooo stramm find ich das Timing nicht, man sollte halt dann keine 
anderen Interupts am laufen haben, aber das ist bei der Polling Variante 
ebenso.
Warum wird eigentlich immer gleich nach nem größeren Prozessor geschrien 
ohne es mal einfach zu probieren?

von Matthias (Gast)


Lesenswert?

Du hast folgendes vergessen:
Z Register muss initialisiert werden
somit muss es auch gesichert und zurückgeholt werden..


Und jetzt mache das mal in C...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich seh in der Frage nix mit C...
Und klar sollte man das Z register am Anfang mal initialisieren, seh ich 
aber nicht das Problem drin er sagt ja er hat zwischendrinn ne pause und 
das Z-Reg zu pushen und zu popen ist ja mal dämlich, der witz ist doch 
das der Pointer automatisch incrementiert wird und ich beim nächstenmal 
nicht auf die gleiche Speicherstelle schreib.

Sorry C mag ja komfortabel sein, aber manchmal sollte man ASM auch nicht 
ausser Acht lassen.

von Michael M. (moonuser)


Lesenswert?

Hallo,

das wird ja eine rege Diskussion. Ich habe 15 cm Flachbandleitung 
zwischen Sender und Empfänger- Resultat nichts mehr zu sehen vom Takt 
auf meinem STK 500. Daher brauche ich erst mal ein paar Tage um eine 
neue Platine zu machen.
@ aaa: Ja ich denke das ist das beste, damit vertödel ich keine 
Rechenzeit beim pollen. Ich werde allerdings ein 64 Bit shift register 
(Habe ein 74 HC irgendwas gefunden) nehmen, damit ich keine 8 Steine 
einbauen muss. (Bekomme halt bis zu 64 Bit Daten).

Wo wir gerade dabei sind, ein loggisch AND im Takt sollte es doch 
ermöglichen, zum Auslesen einen anderen Takt zu benutzen, wie fürs 
Reinschieben oder?

@läubi
Ich möchte auf jeden Fall beim ATMega bleiben, da ich die Werkzeuge 
dafür habe und da das ganze auch recht günstig ist

Also wie geschrieben mache ich erst mal die neue Schaltung- hoffe das 
sieht dann besser aus.

Grüße Michael

von Gast (Gast)


Lesenswert?

Das Timimg ist nicht soo kritisch. Als Slave kannst Du maximal 5MHz 
SPI-Takt noch sicher abfragen (20MHz / 4). Ein Byte wir demnach in 32 
AVR-Takten übertragen. Ein einmaliges Auslesen von 2 Byte, wenn der AVR 
sonst nichts tut, geht ohne Interrupt am schnellsten (man benötigt keine 
Zeit zum Ein- und Ausspringen aus der Interrupt-Routine):

loop11:
   sbis spsr,spif
   rjmp loop11
   in R17, Spdr

 loop12:
   sbis spsr,spif
   rjmp loop12
   in R18, Spdr

Die Frage ist eher, wieviele dieser 16Bit-Werte Du in welchem Zeitraum 
speichern und verarbeiten mußt.

von aaa (Gast)


Lesenswert?

32 bit ist für den hobby breicht einfach TO MUCH-der C -compiler ist sau 
teuer und die hartware ebenfalz.ausserdem gibts keine alternative als C
basic oder pascal compiler gibts dafür nicht.

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.