Hallo. Meine Frage dreht sich um das Thema SPI-Slave. Wie im Titel beschrieben, betreibe ich einen AT90CAN128 als Slave. Am Rande: Der Master ist ebenfalls ein AT90CAN128. Es wird eine Kette der Lange 6 übertragen. Die Kommunikation funktioniert soweit auch gut. Meine Frage: Wie kann der Slave den Beginn der Übertragung erkennen, um das erste Byte der Kette auch als solches zu identifizieren? Theoretisch würde ich den /SS abfragen und meine Zähler zurück setzen, aber den kann ich nicht als Interrupt konfigurieren. Denn /SS-Pin in der ISR abzufragen, wenn der Transfer eines Bytes erlegigt ist, macht auch keinen Sinn, weil der /SS dann ja immer auf LOW liegt. Momentan habe ich für die Anfang/Ende-Erkennung eine zusätzliche Verbindung vom Master auf einen INT-Pin des Slaves geführt. Aber das ist nicht Protokoll konform, oder? -- Nachtrag: Der Slave könnte natürlich auch die empfangenen Bytes mitzählen, aber das scheint mir auch nicht so der richtige Weg. -- Wie macht ihr das? Welchen "Trick" kann der Slave anwenden, um Anfang oder Ende der Kette zu identifizieren? Mir fällt einfach nichts weiter dazu ein. Gruß.
Wenn ich das richtig verstanden habe, verbindest DU zwei Teilnehmer über SPI. Zu Abgrenzung der "Botschaften" aus mehreren Bytes fallen mir ad hoc folgende Mechanismen ein: - "lange" pause zwischen den Telegrammen (deutlich länger als die zeit zwischen den Bytes) - senden eines Sync-Pattern zu Beginn jeder Botschaft. Dieses Zeichen (Sync) darf sonst nicht vorkommen. Beim parsen des Empfangsstrings ist dies das Kennzeichen für den Anfang. Gibr bestimmt noch viele andere Ansätze. Das sind erst mal zwei recht einfach umzusetzende Möglichkeiten.
Birgit P. schrieb: > Theoretisch würde ich den /SS abfragen und meine Zähler zurück setzen, > aber den kann ich nicht als Interrupt konfigurieren. Ja, das SPI der AVRs ist so ziemlich vergurkt (kein Sendepuffer usw.). Da hilft wohl nur eine Zinnbrücke zu PE7 daneben.
Nun, SPI ist jeweils ein bidirektionales Schieberegister. Und ja, du musst die bits und bytes zaehlen.
SPI ist ein Schieberegeister. Wenn dein Slave 3 Byte hat, muessen die 3 bytes reingeschoben werden und dann kommt der Latch-Puls. Dann werden diese 3 bytes uebernommen, Bedeutet man kann auch 20 bytes schieben, und die letzten 3 bytes vor dem Latchpuls werden reingelatcht, die anderen 17 koennen so fuer andere Devices in der Kette sein. Empfangen geht ebenso. Zuhinterst in der Kette wird eine Verbindung von Rx und Tx angenommen, muss aber nicht sein. Alle slaves legen ihr(e) Byte(s) ins schieberegister Der Master schiebt Nullen raus, und bekommt die Bytes der slaves rein.
Birgit P. schrieb: > Meine Frage: Wie kann der Slave den Beginn der Übertragung erkennen, um > das erste Byte der Kette auch als solches zu identifizieren? Dafür ist (wie richtig erkannt) der SS# zuständig. > Momentan habe ich für die Anfang/Ende-Erkennung eine zusätzliche > Verbindung vom Master auf einen INT-Pin des Slaves geführt. Aber das ist > nicht Protokoll konform, oder? Es ist letztlich völlig egal, wie du den Framebeginn erkennst. Es muss letztlich einfach nur zuverlässig funktionieren. Warum koppelst du deine beiden µC nicht über eine "normale" serielle Schnitte? Der SPI ist nur dann wirklich gut, wenn ein richtiger SPI-Slave oder ein Schieberegister dahinter sitzt. Jitterer schrieb: > SPI ist ein Schieberegeister. Allerdings können Empfangs- und Sende-Schieberegister durchaus getrennt sein. Und dann ist da nichts mit "durchschieben". > Wenn dein Slave 3 Byte hat, muessen die 3 bytes reingeschoben werden und > dann kommt der Latch-Puls. Dann werden > diese 3 bytes uebernommen, > Bedeutet man kann auch 20 bytes schieben, und die letzten 3 bytes vor > dem Latchpuls werden reingelatcht, die anderen 17 koennen so fuer andere > Devices in der Kette sein. Das nennt sich "Daisy Chain" und ist noch eine ganz andere Liga, denn das müssen dann alle an der Chain angeschlossenen Teilnehmer können. Ich kenne da so einige, die schieben nicht durch, sondern nehmen einfach nach dem aktivieren des SS# die ersten z.B. 24 Bits und ignorieren /den Rest/. Und zum Glück hat es nichts mit dem Problem hier zu tun... ;-)
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.