Ich habe ein NXP LPC1788-Entwicklungsboard verwendet , auf dem ich meine Anwendung entwickelt habe (.NET Microframework Cortex-M3-Port). Alles war schön und gut auf diesem Board, ich hatte keine Probleme mit RAM oder Ähnlichem, und so war ich bereit, mit der Entwicklung meines Produktionsboards zu beginnen.
Ich habe ein neues Board mit dem gleichen RAM und Prozessor erstellt, und ich habe die Binärdatei vom Entwicklungsboard genommen und auf das neue Board gelegt, und ich bekomme Probleme, wenn ich vom SDRAM aus laufe. Nicht das Übliche, wo es keine Verbindung gibt, noch gibt es einen sporadischen Fehler ... Ich kann einen Speichertest durchführen (den gesamten SDRAM-Block in 32 Bit, 16 Bit, 8 Bit schreiben und die richtigen Daten mehrmals zurücklesen).
Wenn ich jedoch versuche, meine Anwendung auszuführen, bekomme ich wirklich seltsame Probleme mit dem RAM, der entweder überschrieben oder überhaupt nicht geschrieben wird. Dies ist nur der Fall, wenn die Anwendung ausgeführt wird, die auf dem Entwicklungsboard perfekt ist. Es ist nicht intermittierend, es macht jedes Mal das Gleiche. Aus diesem Grund gehe ich davon aus, dass es nicht mein Routing ist, das mir Probleme bereitet (weil meine Speicherprüfung bestanden wird).
Gibt es eine seltsame Funktion des LPC1788 EMC (ARM PrimeCell™ MultiPort Memory Controller), die mir nicht bekannt ist und die Pufferungsprobleme oder Read-Ahead-Probleme verursachen könnte? Wenn jemand mit Erfahrung damit mich in die richtige Richtung weisen oder mir helfen könnte, einen besseren Gedächtnistest zu schreiben, um diese seltsamen Bedingungen zu testen, wäre das sehr hilfreich ...
Ich habe ein Bild des Routings angehängt, das zwar nicht optimal ist (ich habe nur 4 Layer, 2 Signal, 2 Power Plane), aber das RAM funktioniert und ich vom Gerät lesen kann.
Lange, parallele Spuren. Kein Signalabschluss. Keine Entkopplungskappen am RAM. Signalspuren, die von der oberen zur unteren Schicht verlaufen, ohne dass eine Kappe in der Nähe ist. Spuren mit langen, nicht abgeschlossenen Stummeln. Einige Signale gehen durch 5 Vias. Und möglicherweise nicht genügend Durchkontaktierungen an den Power / Gnd-Pins des BGA (aber auf Ihrem Bild schwer zu erkennen).
All dies kann zu Speicherproblemen führen, und einige bei jeder Geschwindigkeit. Untersuchen Sie Ihre Uhren am Zielort sorgfältig mit einem Hochgeschwindigkeits-Oskop (350 MHz oder mehr) und zeigen Sie uns, was Sie sehen. Wahrscheinlich haben Sie ein Problem mit der Signalintegrität.
Riecht nach einem datenabhängigen Problem. Möglicherweise haben Sie eine unglückliche Kopplung zwischen einigen der Daten- und/oder Adressleitungen, sodass das richtige Muster irgendwo einen Fehler verursacht.
Versuchen Sie, die Uhr zu verlangsamen. Wie sich das Symptom ändert oder nicht, kann einige Hinweise geben. Wenn zwischen einigen der Adress- und Datenleitungen ein Übersprechen auftritt, sollte das Problem dadurch behoben werden, da die Übertragungen durchgeführt werden, nachdem sich alles schließlich beruhigt hat. Wenn das Problem darin besteht, dass Rauschen auf die Taktleitung gelangt, ändert dies wahrscheinlich nichts.
Betrachten Sie einige der Signale mit einem Oszilloskop und sehen Sie, wie sauber sie aussehen. Haben Sie Widerstände in Reihe mit den Leitungen geschaltet, um die Leiterbahnimpedanz besser anzupassen und das Klingeln zu reduzieren? Stellen Sie sicher, dass Sie auch die Taktleitung überprüfen, nicht nur ein paar Datenleitungen. Überprüfen Sie auch, ob Sie wirklich die Setup- und Hold-Zeiten haben, die der Chip benötigt.
Denken Sie daran, dass ein scheinbar korrekter Betrieb kein Beweis für einen korrekten Betrieb ist, sondern nur für Glück.
Welche Gedächtnistests führen Sie durch? Füllen Sie es zusätzlich zu den Klassikern mit 0 und F und A und 5 und laufenden Einsen und all dem und der Adresse, um einen Adressbittest durchzuführen. Mein Favorit ist ein Pseudozufallstest. nimm ein lfsr (sehr einfach zu codieren, deterministisch und wiederholbar und ist "zufällig genug"), setze es, fülle den Speicher mit Zufallszahlen (überspringe keine oder höre kurz auf, beginne bis zum Ende einen Durchgang, einen Samen am Anfang, versichere / wähle das lfsr wiederholt sich nicht innerhalb des Bereichs, in dem Sie es verwenden), Seed es und lesen Sie es zurück. Seed it, Speicher mit den invertierten Werten aus dem Randomizer füllen, Seed it check. Ändere den Seed und wiederhole. Ich neige dazu, einen solchen Test eine Weile laufen zu lassen. Es findet Adressbitprobleme und Datenleitungsprobleme und viele der normalen Probleme sehr schnell schneller als die herkömmlichen Tests.
Was passiert, wenn Sie die Uhr(en) verlangsamen und langsamer laufen, ändert sich das?
Wenn es sich nicht um Hardware handelt, dann konzentrieren Sie sich auf Software. Was ist der Unterschied zwischen dem Entwicklungsboard und Ihrem Board? Zerlegen Sie die Anwendung in Teile und sehen Sie, ob etwas davon läuft oder fehlschlägt, egal wie sehr Sie es kürzen.
James
Benutzer3624