Forum: Mikrocontroller und Digitale Elektronik Atmega8 als SPI Slave - wie SS-Leitung auswerten?


von N. K. (bennjo)


Lesenswert?

Hallo,
ich Programmiere grade einen Atmega8 als SPI Slave und will nun
rausfinden wann ein "Daten-Packet" anfängt uns aufhört.

Dies wird durch den Master über die SlaveSelect-Leitung vorgegeben.

Zwischen 2 Packeten geht SS immer kurz auf High. Nun Frage ich mich,
wie ich SS am besten auswerte? Dachte mir vielleicht die SS Leitung auf
INT0 zu legen, damit bekomme ich Start und Ende mit nur wenn ich PB2(SS)
dann per Software setzte, bin ich zu langsam. Ich bin doch bestimmt
nicht der Erste mit diesem Problem hat, oder?

Gruß,
Nikias

von Simon K. (simon) Benutzerseite


Lesenswert?

Schonmal den SPI-Ready Interrupt angeschaut?

Wofür willst du denn den Start wissen?

von N. K. (bennjo)


Lesenswert?

@Simon:
Diesen Interupt habe ich in der Atmega8 Doku nicht gefunden.

Ich buffere alles in einen Ringpuffer, weil die Daten schneller
reinkommen als ich sie verarbeiten kann. Die einzelnen Logisch
zusammengehörenden Datenblöcke können zwischen 2 und 100 Byte groß
sein.

Da ich später gerne die zusammenhängenden Blöcke wieder Rekonstruieren
möchte...muss ich wissen wanns losging und wanns wieder aufhört. Sonst
hab ich nur einen riesen Bytesalat :-)

Gruß,
Nikias

von N. K. (bennjo)


Lesenswert?

Mal noch ne andere Frage:
...ich hab jetzt SS und INT0 einfach beide per Kabel
zusammengelegt...was löst jetzt zuerst aus?
der SPI-Daten Fertig- oder der INT0 Interupt?
Bzw. ist das überhaupt genau geregelt?
Werden da überhaupt beide Flags gesetzt? - Müsste doch oder? Geht das
nach der Vektoradresse?

Bin grad etwas verwirrt...

von Ulrich (Gast)


Lesenswert?

Ich kenne einen der in diesem Moment zu mir sagen würde "Überdenke dein
Design"

Meine Persönliche Meinung ist auch nicht anders.
Schicke doch im 1. Byte einfach mit wieviel empfangen werden soll. Dann
zählst du einfach die Bytes im Interupt mit. Wenn alle Bytes da sind
wird ein Flag gesetzt und die main() verarbeitet die Daten......

von N. K. (bennjo)


Lesenswert?

@Ulrich: So einfach gehts leider nicht ... es wird ein
SPI-Display-Adapter, der Master ist auch ein µC und will nicht auf den
Slave warten...bis der seinen ganzen Display-Kram erledigt hat.

Das mit den Bytes habe ich schon...habe derzeit ein Protokoll welches
aus einem Byte "Opcode", einem Byte "Size", und dann eben Size
vielen Bytes Nutzdaten besteht. So eine Einheit nenne ich "Packet"
und während diesem Packet bleibt SS low.

Es kann nun sein, dass der Master eine ganze Salve von Befehlspacketen
wie Putchar, GotoXY, clrscr, ... usw. auf einmal ausführt. Diese sollen
zwischengespeichert, und dann eben so schnell wie möglich abgearbeitet
werden. Zusätzlich muss das ganze während dem Betrieb "Steckbar"
sein, das heißt ich muss zu einem beliebigen Zeitpunkt in den
Datenstrom einsteigen können. Dafür brauche ich nun aber die
"Physikalische" Packetgröße. Damit ich Packete die nicht vollständig
sind verwerfen kann.

Gruß,
Nikias

von Ulrich (Gast)


Lesenswert?

Kannst du vom SPI-Master noch eine Leitung zum SPI-Slave ziehen? Du
Könntest damit dem Slave immer ein Signal geben wenn ein Paket
anfängt.....

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich versteh das Problem nicht.

Der SPI-Interrupt löst aus, sobald ein Byte komplett im SPI Buffer
vorliegt.

Ist dies der Fall, wird das Byte in deinen Ringbuffer geladen.
Zusätzlich kannst du jetzt bei jedem SPI-Interrupt einen Zähler
hochzählen, der dir die Anzahl empfangener Bytes gibt.

Was willst du da mit externen Interrupts machen?

von inoffizieller WM-Rahul (Gast)


Lesenswert?

So wie ich das Problem verstehe, braucht man nur beim Auslösen
desSPI-Interrupt nachgucken, ob die /SS-Leitung noch auf L-Pegel
(weitere Daten werden gesendet) oder wieder "oben" ist (Übertragung
vollständig).

von Hauke Sattler (Gast)


Lesenswert?

Also wenn dass ganze Steckbar sein soll dann brauchst du evt. ein Signal
vom Stecker zum Slave, welches signalisiert ob eingesteckt ist oder
nicht eingesteckt ist.
Wenn man dann noch die CS->SS Leitung (auf der Slave Seite) mit einem
schwachen Pulldown versieht, dann wird es recht einfach.

Zuerst wartet der M8 darauf eingesteckt zu werden. SPI bleibt zu diesem
Zeitpunkt DEAKTIVIERT. Es können ja keine Daten kommen.

Sobald er das Signal "eingesteckt" bekommt wartet er darauf das er
ein  HIGH Signal auf die SS Leitung bekommt. Der SPI ist immer noch
deaktiviert, deshalb ist das eine ganz normale Pinabfrage.

Wenn das Signal low ist dann läuft noch ein Datenpaket.
Wenn das Signal HIGH ist dann wird gerade nichts Übertragen.

Sobald er das HIGH Signal bekommt wird der SPI vom M8 aktiviert.
Dadurch wartet der M8 ab, bis ein unvollständiges Paket beendet ist,
bevor sein SPI Daten empfangen kann.

Beim nächsten Datenpaket wird die SS wieder (vom Master) auf low
gezogen und der M8-SPI (durch den SS Pin) reagiert entsprechend
darauf.

Dadurch kann man sicherstellen das man nur Pakete mit Kopf erhält.
Wie es mit dem Ausstecken aus einer laufenden übertragung gehandhabt
werden soll bleibt dir überlassen.

bis dann
Hauke

von N. K. (bennjo)


Lesenswert?

Danke für die Ganzen Ideen.

Habs jetzt aber doch mit INT0 gelöst...SS ist nämlich etwas länger low
als das letzte Byte...das heißt bei einer positiven Flanke von INT0 ist
das Packet fertig.

Gruß,
Nikias

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.