mikrocontroller.net

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


Autor: N. K. (bennjo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schonmal den SPI-Ready Interrupt angeschaut?

Wofür willst du denn den Start wissen?

Autor: N. K. (bennjo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: N. K. (bennjo)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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......

Autor: N. K. (bennjo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.....

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Hauke Sattler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: N. K. (bennjo)
Datum:

Bewertung
0 lesenswert
nicht 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

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.