Forum: Mikrocontroller und Digitale Elektronik SPI-Problem mit MAX7221


von Olly K. (rossi75)


Lesenswert?

Hallo liebe Gemeinde,

ich habe ein kleines SPI-Problem. Vorweg: In µC's mache ich schon etwas 
länger, aber SPI begegnet mir zum ersten Mal. I2C ist da irgendwie 
einfacher.

Aufbau:
AT89C5131 (8052-Derivat) mit HW-SPI, daran einen MAX7221, daran bis 
jetzt eine 2mA-LED bzw. Multimeter zwischen zwei wahllosen DIG + SEG. 
Als RSET-Widerstand habe ich etwa 10k gewählt.

Als ich mir das Datenblatt zum MAX7221 angeschaut habe, dachte ich mir 
dass ich ja LOAD/CS auf Masse ziehen kann. Ist ja der einzige der 
zuhört, also kann er auch ständig zuhören.

Die Firmware setzt nach der Initialisierung des SPI verschiedene 
Register und sendet dann den LED-Test. Die LED bleibt aber tot. Also 
Multimeter angeschlossen, ganze 0.05 V sind hier zu messen. Also messe 
ich hier eher das Urknallrauschen.

Vielleicht war das Kabel mit ~50cm (geflechtet) zu lang? Jetzt ist alles 
mit max. 10 cm Freiluftverdrahtet, rennt aber immer noch nit.

Gut, dachte ich mir, dann suchste Dir halt im Schaltplan/Board einen Pin 
der einfach zu erreichen/verlegen ist. P1.5 ist es geworden. FW 
geändert, dass die den P1.5 während der Übertragung auch auf LOW zieht, 
danach wieder zurücksetzt. Aber trotzdem ist weiterhin nix zu messen.

Dumm jetzt nur, dass auf P1.5 auch gerade MISO draufliegt - muss mich 
das stören? Weil empfangen wollte ich ja nicht. Oder muss es wirklich 
der SS-Pin auf P1.1 sein? Vielleicht wegen des Timings?

Ich bin ein wenig ratlos, gesucht hab ich auch schon, aber nix gefunden 
ob ich den MAX7221 nicht ständig zuhören lassen könnte...

Habt Ihr vielleicht Antworten auf eine der Fragen oben oder sonst noch 
ne Idee? Hab ich den MAX vielleicht schon in Richtung Beerdigung 
geschickt? Habe leider weder nen Logikanalyser noch ein Oszi da...

Schaltplan kann ich auf Anfrage schicken, C-Code ist angehangen. Die 
Firmware funktioniert auch soweit, hat noch andere Aufgaben zu 
erledigen, nur der SPI stört ein wenig... Ich komm noch nicht mal bis 
zum LED-Test, wie die anderen hier im Forum...

Danke für Eure Mühen,
Olly...

von Michael U. (amiga)


Lesenswert?

Hallo,

schonmal ins Datenblatt des MAX7221 geschaut?
/CS: die Daten werden bei /CS = Low ins Schieberegister geschrieben und 
mit der steigenden Flanke von /CS werden die letzten 16 Bit ins Latch 
des 7221 übernommen. Es hejt also nicht darum, wer "zuhört", SPI ist ein 
simples Schieberegister.

Weiter: ich kenne den AT89C5131 nicht, aber beim AVR ist es z.B. so, daß 
wenn SPI aktiv ist, dann ist kogischerweise MISO der SPI-Eingang und 
kann nicht als normaler I/O genutzt werden. Ist ja auch logisch, zu SPI 
gehört für die Daten numal MISO und MOSI, egal, ob man die letztlich 
benutzt.

Zum Verhalten des SS kann ich nur sagen, daß er beim AVR als SPI-Master 
als Ausgang prgrammiert werden muß oder wenn Eingang, dann auf H liegen 
muß.

Das sollte aber im Datenblatt des AT89C5131 beschrieben sein.

Gruß aus Berlin
Michael

von holger (Gast)


Lesenswert?

>Als ich mir das Datenblatt zum MAX7221 angeschaut habe, dachte ich mir
>dass ich ja LOAD/CS auf Masse ziehen kann.

Hmm, ich kenne das Datenblatt zwar nicht, aber das
LOAD/CS impliziert bei mir:

CS Low Daten zum Chip senden möglich.
CS High = LOAD Daten übernehmen. Ist bei SPI nicht
unbedingt ungewöhnlich eine Aktion erst mit der
steigenden Flanke von CS zu starten.

von Peter D. (peda)


Lesenswert?

Olly Krings wrote:
> Als ich mir das Datenblatt zum MAX7221 angeschaut habe, dachte ich mir
> dass ich ja LOAD/CS auf Masse ziehen kann.

Hm, dann dürfte es etwas schwierig werden, die geforderte steigende 
Flanke zu erzeugen:

"For the MAX7221, CS must be low to clock data
in or out. The data is then latched into either the digit or
control registers on the rising edge of LOAD/CS."


Man kommt aber auch rein logisch darauf, wenn man berücksichtigt, daß 
Chips im allgemeinen nicht hellsehen können.
Irgendwie müssen sie ja gesagt kriegen, wann ein Befehl zu ende ist.


Peter

von Olly K. (rossi75)


Lesenswert?

Hallo zusammen,

danke für die prompten Antworten. Ja, jetzt ist es logisch und ich hab's 
verstanden. Testen konnte ich das noch nicht, erst morgen früh komm ich 
dazu. Werd Euch informieren.

Schönen Abend noch,
Olly...

von Helix (Gast)


Lesenswert?

> Man kommt aber auch rein logisch darauf, wenn man berücksichtigt, daß
> Chips im allgemeinen nicht hellsehen können.
> Irgendwie müssen sie ja gesagt kriegen, wann ein Befehl zu ende ist.

Naja, dafür müsste der Chip nur die Anzahl der Clockimpulse zählen. 
Theoretisch ginge es also auch ohne CS und ohne Hellsehen. ;-)

von crazy horse (Gast)


Lesenswert?

naja, dann könnte man die nicht kaskadieren...

von Peter D. (peda)


Lesenswert?

Helix wrote:

> Naja, dafür müsste der Chip nur die Anzahl der Clockimpulse zählen.
> Theoretisch ginge es also auch ohne CS und ohne Hellsehen. ;-)

Theoretisch ja, bei den DOG-M LCDs soll das laut einigen Beiträgen sogar 
gehen.

Aber schon ein kleinster Spannungseinbruch, der MC resettet und fängt 
neu an zu zählen, das Display aber nicht und dann sind beide für alle 
Zeiten asynchron.
Und solange der MC im Reset ist, d.h. seine Ausgänge hochohmig, darf 
natürlich keinerlei Störung einkoppeln.
Praktisch ist diese Methode also völlig unzuverlässig.


Peter

von Olly K. (rossi75)


Lesenswert?

So, ich hab mal ein wenig geforscht und versucht...

also zum Programmablauf: Wenn der 8051 startet, sollte eigentlich ein 
Displaytest kommen, dann nach ein paar Sekunden die normale Anzeige.

Sobald der MAX7221 Spannung bekommt, sagt mein Messgerät auch dass da 
zwischen 1,7 und 2,3 V anliegen. Aber nur für einen kleinen Moment. Also 
ne 2mA-LED draufgepinnt geht nicht an. 1,7-2,3 V könnte auch am 
Messgerät liegen, vielleicht liegen da wirklich 5 V an - aber warum geht 
dann die LED nicht mit an?

Daraufhin hab ich den Displaytest in der Firmware entfernt und trotzdem 
sehe ich kurz ne Spannung anliegen. Die DIN-Ltg. abgeklemmt, trotzdem 
bricht die Spannung nach 0,5 Sekunden weiterhin ein. Vielleicht denkt er 
jetzt trotz dem CLK-Signal dass da Daten kommen, also alles Einsen.

Dann dachte ich mir, dass ich mal teste ob am MAX überhaupt was ankommt. 
Also LED auf 5V, andere Seite auf die CLK-Ltg. und die LED leuchtet 
ständig. DIN + LOAD/#CS flackern nur wenn Daten übertragen werden.

Hab jetzt die FW soweit abgeändert dass der ganze SPI nur aktiv ist wenn 
Daten gesendet werden sollen. Zu anderen Zeiten ist das CLK-Signal nun 
auf HIGH. Aber das Ergebnis bleibt weiterhin das Gleiche. Hat sonst noch 
jmd ne Idee? Werd sonst nächste Woche ma zum Elektroniker meines 
Vertrauens fahren und mir noch nen MAX besorgen. Nen Oszi hab ich leider 
nicht zur Hand.

cu,
olly...

von Stephan (Gast)


Lesenswert?

olly,

SPI kann die ganze Zeit an sein wenn DU willst.
Könnte ja noch mehr dran hängen.
ABER, Load bzw. CS nur dann wenn die letzten 16 Bit für den MAX bestimmt 
waren. Sonst lass den CS oder Load einfach "oben"
Wenn Daten rein sollen dann eben den CS runter, Daten auf SPI und CS 
Hoch.
Dort bleibt er dann auch. Das geht zu 100% !!
UND den Init des MAX nicht vergessen. Steht hier öfter beschreiben.

von Olly K. (rossi75)


Lesenswert?

Hier bin ich wieder und muss mich erst einmal entschuldigen. Ich habe 
gerade von nem alten Wecker das LED-Display benutzen wollen, da fiel mir 
auf dass ich den Widerstand V+ an SEG_C statt an ISET gelegt hatte.

Jetzt leuchtet es, aber noch nicht so wie ich will. Das wird mein 
persönliches Problem werden.

Danke erst einmal für Eure zahlreichen Hilfen.

Schönen Fussballabend,
Olly...

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.