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...
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
>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.
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
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...
> 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. ;-)
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
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.