MAX7221 / SPI Frage...

Hallo Leute,

Ich bin seit langem Leser des Forums und habe mich aufgrund eines, für mich bisschen komplexeren, Problems angemeldet:

Konkret geht es um eine zu realisierende große LED Matrix und eine 7-Segement Anzeige, geplant ist damit einen PN Übergang darzustellen.
Dazu werden 16 8x8 LED Matrizen, wovon 4 zweifarbig sind, und eine 3 stellige 7 Segment Anzeige verbaut, angesteuert wird das ganze mit jeweils einem MAX 7221 pro Matrix von einem Arduino Nano.

Die MAX7221 werden über SPI angesteuert, diese MAX können lt. Datenblatt und div. Tutorials kaskadiert werden, dabei fungieren sie als Schieberegister und teilen sich gemeinsam eine CS Leitung. Da dies jedoch nur für maximal 8 MAX hintereinander funktioniert brauche ich "4 SPI Busse".
Kann hier die aufteilung auf die 4 SPI Busse auch einfach mithilfe von CS passieren? D.h. ich spreche einfach mit der entsprechende CS Leitung meine gewünschte MAX Reihe an und hänge dabei alle auf die selbe SPI Clock und Datenleitung?
Oder ist es sinnvoller das ganze mit entsprechenden Libraries auf mehrere SPI Busse aufzuteilen, also zusätzliche Pins als SPI zu missbrauchen?

Hat das eventuell bereits mal jemand gemacht, ich sehe nichts was dem widersprechen würde...aber naja, scheint ja doch keine "Standardanwendung" zu sein...

Hab mal kurz was zur Verständlichkeit gezeichnet...
Schematic ist natürlich nur schematisch, und jegliche Beschaltung der MAX7221 fehlt hier...

danke für euren Input
Manuel

SPI.pdf (202 KB)

Hallo,

reinmanu:
Hat das eventuell bereits mal jemand gemacht, ich sehe nichts was dem widersprechen würde...aber naja, scheint ja doch keine "Standardanwendung" zu sein...

Ist doch die Standardvariante für den SPI-Bus. z.B. SD-Card, Display, Touchcontroller, XXX parallel am Bus und mit den jeweiligen /CS selektieren, wer gemeint ist.

Gruß aus Berlin
Michael

amithlon:
Hallo,

Ist doch die Standardvariante für den SPI-Bus. z.B. SD-Card, Display, Touchcontroller, XXX parallel am Bus und mit den jeweiligen /CS selektieren, wer gemeint ist.

Für einzelne Slaves eh, kann das mit den kaskadierten MAX aber nicht zu Problemen führen?

sg
Manuel

Hallo,

reinmanu:
Für einzelne Slaves eh, kann das mit den kaskadierten MAX aber nicht zu Problemen führen?

ich wüßte jetzt nicht, warum. Die Daten werden parallel in alle MAX-Ketten geschoben und mit LOAD/CS übernimmt die gewünschte Kette die Daten.
Buslast an CLK wird man evtl. beachten müssen, da ja da alle dranhängen, aber da muß man sich ja ohnehin immer Gedanken machen.

Gruß aus Berlin
Michael

Hallo,

warum soll man nur 8 MAX'e kaskadieren können? Da ist erstmal nichts limitiert. Du musst nur wissen das man immer das gesamte Protokoll durchschieben muss.

Hallo,

Doc_Arduino:
warum soll man nur 8 MAX'e kaskadieren können? Da ist erstmal nichts limitiert. Du musst nur wissen das man immer das gesamte Protokoll durchschieben muss.

stimmt, außer Buslast für CLK gibt es da eigentlich keine Grenze.

Gruß aus Berlin
Michael

Hallo,

vermutlich wurde der Abschnitt "Cascading Drivers" falsch verstanden. Da gehts nur darum eine ungünstige Anzahl seiner Digits optimal aufzuteilen um Helligkeitsunterschiede im Vorfeld auszugleichen. Ansonsten sind dem SPI Bus wie amithlon schon sagte nur elektrische Grenzen gesetzt.

Doc_Arduino:
Hallo,

warum soll man nur 8 MAX'e kaskadieren können? Da ist erstmal nichts limitiert. Du musst nur wissen das man immer das gesamte Protokoll durchschieben muss.

...tja ganz ehrlich, ich hab das in irgendeinem Tutorial gelesen und dann einfach so übernommen. Wobei das jetzt für mich auch nicht viel mehr Aufwand war, und so hab ich die jeweiligen Seiten jetzt einfach aufgetrennt. Unbedingt schlecht ist das Ganze ja auch nicht.

Vielen Dank für euren Input, hab mir eh gedacht das es kein Problem sein sollte. Wie schauts denn eigentlich aus mit der Buslast bei den MAX, ist das ganze irgendwie spezifiziert?

danke
Manuel

Hallo,

ganz ehrlich, ich weiß es nicht. Rein theoretisch, aber das stimmt so nicht, könnte man 20mA maximalen Ausgangstrom vom ATmega teilen durch den 1µA Eingangsstrom vom MAX. Da spielen aber noch Leitungskapazitäten usw. eine Rolle. Bei guter Leitungsführung können 20 schon möglich sein. Nur ist SPI kein Bus den man unendlich lang ausführen kann. Ähnlich I2C. Ich sage mal so. Das Maximum ist erreicht wenn die Signalflanken zu sehr verschliffen sind, sodass die Pegel nicht mehr eingehalten werden. Hilft dir jetzt nicht wirklich weiter ich weiß. Man könnte noch zur Not mit dem Takt runtergehen oder aller x IC einen Treiber-IC dazwischensetzen um das Signal aufzufrischen. 8 kaskadierte sehe ich aktuell nicht als Problem.
Um auf deine Eingangsfrage zurückzukommen. Die Leitungen kannste sowieso nicht aufteilen wie ein Wurzelgeflecht. Im Normfall ist alles außer /CS wie eine Leitung wo alle ICs der Reihe nach aufgeklemmt werden. Die /CS Leitung wird für jeden ICs einzeln geführt.

Die Kaskadierung bzw. DaisyChain spart einem nur die einzelnen /CS Leitungen. /CS und die Datenleitungen MOSI/MISO gehen von IC zu IC durch, nur Clock wird außen mitgeführt. Den Vorteil der wenigen Leitungen erkauft man sich mit dem gesamten Protokoll durchschieben. IC einzeln ansprechen geht nicht mehr, weil /CS gilt für alle.

Am Rande noch. Wenn es auf hohe Frameraten ankommt, kann man die 8 MAX'e in 2 Gruppen zu je 4 aufteilen. Nimmt zum Bsp. einen ATmega2560, nimmt hier statt der SPI Einheit zweimal USART und betreibt diese im SPI Mode. Hätte den Vorteil du kannst auf beiden Bussen wechselweise ein Byte rausschieben, weil ein Byte gepuffert ist. Die SPI Einheit hat nur einen Lesepuffer. Das zur Info wenn man es auf die Spitze treiben möchte.

Je nachdem was du machen möchtest. Es gibt nichts geschenkt. Kein Vorteil ohne Nachteil. :slight_smile: