Ich versuche, meine SPI-Bus-Geräte auf einer benutzerdefinierten Leiterplatte zum Laufen zu bringen, die ich zusammengelötet habe. Leider habe ich es versäumt, Sondentestpunkte auf dieser speziellen Platine hinzuzufügen, und glaube nicht, dass ich die SPI-Bussignale direkt an den ICs testen kann. Einer ist ein stromziehender LED-Treiber mit 20 Pins in einem SSOP-Gehäuse und der andere ist ein microSD-Kartenhalter.
Ich bekomme beide Geräte nicht zum Laufen.
Meine MCU ist ein Teensy 3.1. (Arduino-kompatibel) In Bezug auf die Firmware verwende ich Arduino v1.06 (höchste Version, die von Teensyduino unterstützt wird) und Teensyduino V1.20. Ich verwende die SPI-Bibliothek/das Objekt für die Kommunikation mit dem LED-Treiber und die SdFat-Bibliothek für die Kommunikation mit der SD-Karte.
Hier ist das Schema, wie mein LED-Treiber und die SD-Karte angeschlossen sind:
Gemäß dem TLC59025-Datenblatt sieht das Zeitdiagramm für die Kommunikation mit dem LED-Treiber folgendermaßen aus:
Meine bisherige Testmethode, abgesehen von Software (dh dem Versuch, eine Datei auf der SD-Karte zu öffnen), war wie folgt:
Wenn der bestimmte LED-Ausgangspin verriegelt ist und Strom zieht, sollte die Spannung, die ich an diesem Pin messe, nahe 0 V liegen, richtig?
Meine Master-SPI-Taktrate liegt bei etwa 2 MHz . Ich weiß, dass der TLC59025 sagt, dass sein Arbeitspunkt 30 MHz ist . Ich dachte, solange der Master einen SCK verwendet , der niedriger ist als die Uhr des Slaves, würde die Kommunikation funktionieren. Liege ich falsch?
Ich dachte, dass vielleicht das Tri-State-Verhalten für meine Probleme verantwortlich ist, aber es sieht so aus, als ob der LED-Treiber TLC59025 so konzipiert ist, dass er immer Daten in sein Schieberegister akzeptiert, selbst wenn es nicht der beabsichtigte Slave ist, mit dem kommuniziert wird. Es sieht für mich so aus, als ob es so konzipiert ist, dass es einfach die letzten 16 Datenbits speichert, die über den SPI-MOSI-Bus gesendet werden, wenn der LE- Pin hoch gepulst wird.
Ich bin ratlos, wie ich bei der Fehlersuche vorgehen soll. Ich weiß, dass das Problem nicht am MISO-Bus liegen sollte, da ich nur ein Gerät (die SD-Karte) an diesen Bus angeschlossen habe. Könnte es der MOSI-Bus sein? Ist es möglich, dass der MOSI-Bus zu viel Kapazität hat, wenn ich versuche zu kommunizieren, wodurch das Datensignal verschlechtert wird? Wenn ich den MOSI/CS-Signalen auf der SD-Karte einen Tri-State-Puffer und dem Chipauswahlsignal der SD-Karte einen Pullup-Widerstand hinzufüge, würde dies dazu beitragen, die Signalintegrität auf dem MOSI-Bus aufrechtzuerhalten (dh die Kapazität von MOSI zu verringern Bus bis zu dem Punkt, dass zumindest der LED-Treiber funktionieren sollte?).
Der Zugriff auf die SD-Karte ist etwas komplizierter, da das FAT-Dateisystem usw. berücksichtigt werden muss. Wenn ich Sie wäre, würde ich mich also zuerst darauf konzentrieren, den LED-Treiber zum Laufen zu bringen. Zumindest wissen Sie dann, dass Ihr SPI-Bus funktioniert.
Um ein paar deiner Fragen zu beantworten:
Ein paar Dinge zu überprüfen:
Sie erwähnen das Pulsieren von LE hoch, aber Sie erwähnen nicht das Halten von OE niedrig, um die LED-Ausgänge zu aktivieren?
Sie müssen sicherstellen, dass Sie die Hauptuhr und die Datenpins richtig konfiguriert haben. Ich bin mit Arduino-Sachen nicht vertraut, daher kann ich Ihnen hier nicht mit den Einzelheiten helfen, aber es gibt verschiedene Modi des SPI-Betriebs, und Sie müssen Ihr Gerät entsprechend einrichten. Sie müssen sicherstellen, dass Sie den richtigen Modus eingerichtet haben, um die Daten an der steigenden Flanke der Uhr auszugeben, wobei die Daten in der Mitte abgetastet werden (für den LED-Treiber - vielleicht ist es für die SD anders!).
Wo ist der Chip-Select-Pin auf diesem Gerät? Der hat doch sicher einen? Konnte es auf dem mitgelieferten Diagramm nicht sehen. Wenn es keine Chipauswahl gibt, wie wechseln Sie zwischen den Daten, die auf der SD-Karte bereitgestellt werden, und den Daten, die dem LED-Treiber bereitgestellt werden? Sie benötigen zwei SPI-Peripheriegeräte? Es sei denn, der LED-Treiber sitzt gerne einfach da und empfängt Daten, auch wenn es nicht der beabsichtigte Empfänger ist, und es liegt an Ihnen, die LE- und OE-Pins zu steuern, wenn es sich um den beabsichtigten Empfänger handelt . Es lohnt sich, sich das einfach anzusehen, um alles zu klären.
Ich bin mir nicht sicher, was aus dem SDO-Pin des LED-Treibers kommen soll? Benutzt du es?
Wie soll sich SDI auf LED-Ausgänge beziehen? Ich bemerke im Zeitdiagramm, dass SDI für die Bits 0, 2, 5, 10, 11, 12 und 15 hoch ist. Die Ausgänge 0, 3 und 15 reagieren jedoch mit einem 'ON'-Zustand. Vielleicht wird dies an anderer Stelle im Datenblatt erklärt, da es aus dem Zeitdiagramm keinen offensichtlichen Sinn zu ergeben scheint ...
Viel Glück!
Also bekam ich mein Oszilloskop per Post, richtete es ein und schaffte es, die Sonden vorsichtig an die Teensy 3.1 MCU-Pins für SPI und meinen LED-Treiber (dh SCK-Pin und MOSI-Pin) anzuschließen.
Es scheint, als ob das Problem bei der SPI-Bibliothek liegt, die ich verwendet habe.
Der MOSI-Pin ging für das zweite Byte nicht hoch, als ich versuchte, zwei aufeinanderfolgende Bytes in den Treiber zu schreiben. Ich konnte die Ausgänge der Pins 8-15 des LED-Treibers so einstellen, dass sie aktiviert werden, aber ich konnte den MOSI-Pin anscheinend nicht dazu bringen, während des zweiten Byte-Schreibvorgangs hoch zu gehen.
Ich konnte das Problem lösen, indem ich eine Verzögerung von etwa 10 ms zwischen den beiden Byte-Schreibvorgängen hinzufügte.
Ich konnte die Geschwindigkeit weiter optimieren (so dass ich zwischen Byte-Schreibvorgängen nicht 10 ms warten musste), indem ich die Methoden SPI.beginTransaction() und SPI.endTransaction() der SPI-Klasse verwendete.
Indem ich jede Byte-Übertragung in diese Transaktionsmethoden einpackte, konnte ich den LED-Treiber zum Laufen bringen. Hier ist die Art der Codestruktur, die für mich funktioniert hat:
SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(firstByte);
SPI.endTransaction();
SPI.beginTransaction(LEDDriverSettings);
SPI.transfer(secondByte);
SPI.endTransaction();
Roger Rowland
macdonaldtomw