Forum: Mikrocontroller und Digitale Elektronik AT90CAN128 als SPI Slave: Wie Beginn oder Ende der SPI-Kette dedektieren?


von Birgit P. (bpie)


Lesenswert?

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ß.

von Hoschti (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Jitterer (Gast)


Lesenswert?

Nun, SPI ist jeweils ein bidirektionales Schieberegister. Und ja, du 
musst die bits und bytes zaehlen.

von Jitterer (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.