Designüberprüfung: SPI, ISP und mehrere Slaves

Ich entwerfe ein kleines Breakout-Board für einen AVR ATmega8U2, mit dem ich etwas über AVRs, SPI, ISP und USB lernen kann. Dabei bin ich auf etwas gestoßen, worüber ich mich ein wenig wundere: Wie man das Daisy-Chaining der SPI-Geräte entwirft.

Ich beabsichtige, abhängig von einem einfachen Schalter / Jumper mehrere derselben Platine als Master und Slave verwenden zu können. Designoption Nr. 1 adressiert dies, wobei ein Auswahlschalter bestimmt, welcher Slave-Auswahlkanal mit dem !SS-Pin des Chips verbunden werden soll. Die 1k-Widerstände dienen dazu, den SPI-Bus zu isolieren, wenn ISP läuft.

Meine Designoption Nr. 2 (siehe unten) erstellt einen SPI-Header, in dem das Board der Master ist, und einen, in dem es der Slave ist. Dies scheint nicht gut genug Lösung zu sein. Jedes Slave-Board, das ich anschließen möchte, benötigt einen Header auf dem Master-Board. Ich bin auch nicht auf nur 6-Pin-Header beschränkt, sodass Option 1 mehrere weitere Slaves pro Header bereitstellen kann, selbst wenn Vcc und GND Teil des Anschlusses sein müssen.

Bei Option 2 muss ich auch fest codieren, welchen Slave-Header ich zur Kompilierzeit verwende, und die Konnektoren verschieben, wenn sich während der Ausführung etwas ändern muss. Wenn ich Option Nr. 1 verwende, kann ich den Chipauswahlschalter einfach in die richtige Position drehen.

Ich möchte auch andere SPI-Peripheriegeräte an Bord anschließen können.

Geben Sie hier die Bildbeschreibung ein

[Alle Pin/Port-Namen entsprechen dem ATmega8U2. Pins PB[4..6] sind einfache Ausgänge. PB0 ist !SS auf dem Chip, PB1 ist SCLK, PB2 ist MOSI, PB3 ist MISO. PC1 ist !RESET.]

1) Welcher meiner Ansätze wird am besten funktionieren? Verletze ich irgendwelche wichtigen Regeln über SPI?

2) Wird es notwendig sein, einen GND-Pin auf dem Header zu haben, um einen gemeinsamen Referenzpunkt bereitzustellen? Beide/alle Platinen werden von einer 9V-Batterie versorgt, die einen 5V-Regler versorgt.

3) Muss ich die Slave-Select-Ausgänge vom Header isolieren oder über einen Vorwiderstand oder andere Mittel schalten? Reicht es aus, die Slave-Select-Leitung niemals zu ziehen, da der Master-Chip selbst auf Low ist, oder gibt es eine Hardware-Lösung für dieses mögliche Problem?

4) Ist eine Terminierung an jedem Slave / Master notwendig? Wie kann ich das ggf. umsetzen? Bitte beachten Sie, dass die maximale Kabellänge von Platine zu Platine 15 cm beträgt.

5) Wie kann ich einen saubereren, besser lesbaren Schaltplan erstellen?

(Etwas chaotische Frage, bitte fragen Sie, wenn etwas unklar ist)

EDIT: Nummerierung korrigiert.

Antworten (2)

Zunächst haben Sie einen wirklich lästigen Teil von SPI auf dem AVR identifiziert: Das Anschließen von SPI-Slaves stört den ordnungsgemäßen Betrieb von ICSP.

Zweitens: Der SPI-Bus hat MISO, MOSI und einen Chip-Select-Pin. Sie können die MISO-, MOSI- und GND-Pins und möglicherweise VCC sowie einen anderen CS-Pin für jede Tochterplatine, die Sie anschließen möchten, ausbrechen. Solange der CS für die Tochterplatinen nicht aktiv ist und die Chips der Tochterplatine nicht versuchen, den Bus im Master-Modus zu verwenden, sollten Sie in Ordnung sein.

Drittens: Sie können eine Art Pufferchip (vielleicht 74HC125 oder ähnliches) mit einer Tri-State-Funktion verwenden, um die ICSP-Funktion von der SPI-Talking-to-Slaves-Funktion zu isolieren; Stellen Sie den Pufferchip so ein, dass ein bestimmter Pin hoch ist, um Signale durchzulassen, und verwenden Sie Software, um diesen Pin nur dann hoch zu ziehen, wenn Ihr Code mit den Slaves sprechen möchte, und halten Sie ihn nach einem Code-Reset niedrig.

Verwenden Sie externe Pullups (z. B. 10K) an allen !SS-Pins. Dadurch wird sichergestellt, dass Peripheriegeräte während der Programmierung deaktiviert sind.

Wie soll das helfen? Wenn alle Peripheriegeräte avrs sind, dann kümmern sie sich nicht um den SS-Pin-Status für die Programmierung.