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
Schonmal den SPI-Ready Interrupt angeschaut? Wofür willst du denn den Start wissen?
@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
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...
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......
@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
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.....
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?
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).
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.