Elektroda.de
Elektroda.de
X
This content has been translated flag-pl » flag-de View the original version here.
  • Hallo
    Aufgrund der Tatsache, dass an dem Ort, an dem ich arbeite, SPI-Speicher programmiert werden müssen, deren Stapelverarbeitungsdatei gleich ist, habe ich mich entschieden, ein Gerät zu bauen, das den Inhalt eines Mikrocontrollers auf einen anderen kopiert. Anscheinend nichts, aber mit der Zeit möchte ich Mikrocontroller professionell entwerfen und programmieren, daher scheint es als erstes Projekt eine interessante Übung zu sein, zumal es häufig kommerziell genutzt wird.

    Natürlich kann man den/die Programmierer für die Massenproduktion verwenden, aber hier haben wir eine Platine, die man nicht an einen PC anschließen und irgendetwas ausführen muss. Wir schliessen zwei Chips an, drücken den Knopf und das war's. Die Schreibgeschwindigkeit ist die gleiche wie beispielsweise im Fall des RT809-Programmierers.
    Es ist auch mein erstes Projekt, das ich dermassen abgeschlossen habe, um es veröffentlichen zu können, obwohl es noch nicht zu 100 % fertig ist :P

    Als Prozessor habe ich STM32G431KBT6 verwendet. Das gesamte Projekt wird in STM32CubeIDE mit CMSIS erstellt, ohne HAL zu verwenden. An dieser Stelle möchte ich mich bei dem Kollegen bedanken, der die auf der Elektroda zu findende Anleitung zur Programmierung des STM32 "auf Register" erstellt hat. Ich habe die Anleitung vor einiger Zeit gelesen, dank ihr habe ich viel gelernt und der Wechsel zu jedem Mikrocontroller aus der STM32-Familie ist kein Problem.

    Die Schaltung selbst ist sehr interessant. Meine größte Überraschung in der G4-Serie war der Kerntakt, 170 MHz, ohne die Verwendung eines Quarzoszillators im Chip im LQFP32-Gehäuse, der (in der Krise) 4 Euro kostet. Der Prozessor selbst hat 3 SPI-Schnittstellen, dank denen LCD, die Chips target und source auf separaten Schnittstellen sein können. Mit diesem und DMA fülle ich beim Schreiben der Chips auch den Puffer (1 Sektor - 4 kB) aus der Quelle, sodass nach Abschluss des Schreibvorgangs der Puffer gefüllt ist und das Schreiben des nächsten Sektors sofort beginnen kann. Es sollte den Schreibprozess beschleunigen, und das ist es auch. Es stellte sich jedoch bald heraus, dass die Zeit zum Schreiben des Chips target lang genug ist, um den nächsten Sektor aus der Quelle zu lesen, um den Puffer vorzubereiten, selbst wenn sich die Chips auf einer Schnittstelle befanden. Es würde sogar noch etwas Zeit bleiben, um zum Beispiel mit der Diode zu blinken ;) Beim Programmieren des Prototypen habe ich sogar Speicher im QuadSPI-Modus verwendet, was sich aber als völlig sinnlos herausstellte, da die Zeitunterschiede, bedingt durch die Programmierzeit, vernachlässigbar sind. Der SPI-Takt für den Flash-Chip liegt bei 20 MHz, für das Display bei 40 MHz.

    Das verwendete LCD ist ILI9341. Ich habe die Anzeigebibliothek vor langer Zeit gefunden und modifiziert. Meine Änderungen umfassen die Unterstützung für DMA ohne HAL. Ich habe auch Unterstützung fürs Anzeigen von Grafiken (mit Image2Bitmap.exe generierte Tabellen) und Unterstützung für aus Windows über das Programm GLCDFontCreator2 importierte Schriftarten und mehrere Funktionen wie Fortschrittsbalken hinzugefügt. Wie gesagt, ich habe es vor langer Zeit gemacht und der Code kann hässlich und nicht sehr verständlich sein, aber nach dem Prinzip "wenn etwas funktioniert, fass es nicht an", glaube ich nicht, dass ich wirklich in der Stimmung bin für eventuelle Korrekturen.

    Den Chip target kann mit einem speziellen Programm, das ich in Visual Studio geschrieben habe, vom PC aus programmiert werden. Daten werden in Paketen von 4100 Byte gesendet. 4096 Bytes sind ein Sektor, 4 Bytes sind eine Prüfsumme, die bei jeder Übertragung überprüft wird. Die gesendete Datei muss die gleiche Größe haben wie der Chip in den Socket source eingesetzt, dies wird vom Programm überprüft, da Informationen über die Kapazität des Chips source bei der Initialisierung der Übertragung gesendet werden. Ist die Prüfsumme nicht korrekt, wird der Sektor erneut gesendet, ist die Prüfsumme ok, wird der Sektor programmiert. Ganz am Ende werden der Dateiname und die Prüfsumme des Ganzen gesendet. Stimmt die Prüfsumme des Ganzen überein, werden CRC32 und der Dateiname im Flash-Speicher des Mikrocontrollers gespeichert. Bei jedem Start wird der Chip source gelesen und der CRC überprüft, wodurch man überprüfen kann, ob der SPI-Speicher beschädigt oder ersetzt wurde. Um eine neue Prüfsumme in den Mikrocontroller zu schreiben, muss der Chip mit einem PC-Programm neu programmiert werden. Die Berechnung der Prüfsummen auf der Seite des Programmierers erfolgt durch den Hardware-CRC-Block.

    Die Kommunikation mit dem Programmiergerät erfolgt über einen virtuellen COM-Port auf Basis des MCP2221-Chips. Dies ist ein ziemlich alter Chip in einem DIP14-Gehäuse, aber zum Zeitpunkt der Bestellung von Komponenten war nur ein solcher Chip zu einem vernünftigen Preis erhältlich. Eine große Einschränkung ist hier die Übertragungsgeschwindigkeit, die maximale Baudrate beträgt 115200, was bedeutet, dass das Programmieren von 8 MB oder größeren Chips eine Weile dauert. Beim Erstellen des Prototyps habe ich einen Adapter auf Basis des PL2303-Chips verwendet, bei dem die Baudrate 921600 beträgt, was das Schreiben einer neuen Datei erheblich beschleunigte. Gelegentlich kam es bei einer solchen Geschwindigkeit zu Übertragungsfehlern, aber das Überprüfen der Prüfsumme in jedem Sektor ist kein Problem. Im Allgemeinen ist die langsame Übertragung kein großes Problem, es wird 4 Programmierer geben, jeder wird einen Flash mit einer anderen Datei haben, so dass die Programmierung nur einmal stattfindet. Wenn USB häufiger verwendet werden muss, kann dank der Tatsache, dass sich das MCP in einem DIP-Gehäuse befindet, eine schnellere Brücke verwendet werden, die auf dem Adapter montiert ist.

    Die "offline" Programmierung selbst basiert, wie ich bereits erwähnt habe, auf zwei Puffern von 1 Sektor von 4096 kB. Zum Zeitpunkt des Schreibens, wenn Daten aus Puffer 1 abgerufen werden, wird der nächste Sektor aus dem Chip source über DMA in Puffer 2 gelesen. Nachdem jeder Sektor geschrieben wurde (jeweils 256 B jede Seite), werden Daten aus Puffer 2 in den Chip geschrieben, und Puffer 1 wird mit neuen Daten neu gefüllt. Ganz am Ende ist die Prüfsumme des Chips target vergleichbar mit der Prüfsumme, die im Flash-Speicher des Mikrocontrollers gespeichert ist. Es ist möglich, eine größere Größe des Chips als target zu verwenden, das CRC selbst wird nur auf die Größe des Chips source überprüft.

    Die Platine selbst ist sehr einfach, 2-lagig mit viel Freiraum. Die Sockel selbst könnten etwas weiter vom Display entfernt sein, je nachdem, welchen Adapter wir verwenden, kann es sein, dass er nahe am Display ist. Es gibt auch Sockel für I2C-Speicher auf dem Programmierer, es wird derzeit nicht verwendet, im Laufe der Zeit, wenn sich herausstellt, dass es benötigt wird, werde ich ihre Unterstützung hinzufügen. Der Schaltplan wurde in Altium Designer erstellt, ich lerne dieses Programm noch :)

    SPI-Klon - Programmierer für SPI-Chips SPI-Klon - Programmierer für SPI-Chips SPI-Klon - Programmierer für SPI-Chips
    SPI-Klon - Programmierer für SPI-Chips



    Schaltplan:
    SPI-Klon - Programmierer für SPI-Chips SPI-Klon - Programmierer für SPI-Chips

    Der Quellcode für den Mikrocontroller ist auf github verfügbar: https://github.com/perpuchaty/SPI-Programmer
    Quellcode für Windows-Anwendung: https://github.com/perpuchaty/SPI-Programmer-WIN

    Cool? DIY-Rangliste
    Über den Autor
    XS_Sowa
    Niveau 13  
    Offline 
    XS_Sowa hat 89 Beiträge geschrieben mit der Bewertung 78, und dabei 6 Mal geholfen. Wohnt in der Stadt Rotterdam. Er ist seit 2014 bei uns.
  • #2
    ArturAVS
    Moderator HP/Truck/Electric
    Cool! Gibt es Einschränkungen bei der maximalen Speicherkapazität?
  • #3
    tmf
    Moderator Mikrocontroller Entwerfen
    Erstmal Glückwunsch zum Projekt, sehr gut. Liegt hier kein Fehler vor?
    XS_Sowa hat geschrieben:
    Der SPI-Takt für den Flash-Chip liegt bei 40 MHz, für das Display bei 80 MHz.


    Für den ILI9341 im Modus 4-Draht-SPI beträgt die SPI-Taktperiode mindestens 100 ns, sodass die maximale Taktrate 10 MHz beträgt. Sie schreiben, dass Sie 80 MHz haben, was irgendwie nicht real ist.
  • #4
    XS_Sowa
    Niveau 13  
    Zitat:
    Cool! Gibt es Einschränkungen bei der maximalen Speicherkapazität?

    Danke dir :) Chips über 128 MB erfordern ein zusätzliches Byte bei der Adressierung, es handelt sich also nicht um eine Hardwarebeschränkung, die Software selbst würde eine mögliche Änderung erfordern.

    Zitat:
    Für den ILI9341 im Modus 4-Draht-SPI beträgt die SPI-Taktperiode mindestens 100 ns, sodass die maximale Taktrate 10 MHz beträgt. Sie schreiben, dass Sie 80 MHz haben, was irgendwie nicht real ist.

    Im Allgemeinen neigt dieses Display zum "Übertakten" :) Aber ja, du hast Recht, ich habe mich in der Beschreibung geirrt und der SPI-Takt ist 160MHz/4 = 40MHz.
  • #5
    ArturAVS
    Moderator HP/Truck/Electric
    tmf hat geschrieben:
    Sie schreiben, dass Sie 80 MHz haben, was irgendwie nicht real ist.

    Es hat mich auch überrascht :D Übrigens, warum eine so schnelle Uhr für ein LCD? Immerhin zeigt es praktisch ein statisches Bild an.
  • #6
    XS_Sowa
    Niveau 13  
    Das ist richtig, aber bei allen Änderungen, sei es Text oder Fortschrittsbalken, mit langsameren Uhren kann man immer noch sehen, "in welche Richtung" das Bild generiert wird. Und da mich der Stromverbrauch bei Stromversorgung über USB nicht interessiert, habe ich die Uhr so weit wie möglich aufgedreht, damit user experience auf höchstem Niveau steht :)
  • #7
    tmf
    Moderator Mikrocontroller Entwerfen
    Wenn es irgendwann aus unbekannten Gründen nicht mehr funktioniert, wird user experience großartig sein :)
    Bei Nenntakt von 10 MHz ergibt sich eine Übertragungsrate von 1,25 MB/s. Mehr als genug, um Teile eines Fortschrittsbalkens absolut flüssig anzuzeigen. Wenn dies nicht der Fall ist, stimmt etwas mit Ihrer Streaming-/Grafikerstellung nicht. Der gekaufte LCD hat wohl keine abgeleitete TE um mit der Erstellung des Frames zu synchronisieren?
    Eine andere Sache ist, dass du so viele freie IO-Pins hast, wenn du Filme auf diesem LCD anzeigen möchtest, während der Stapel kopiert wird, dieses LCD über die parallele Schnittstelle anschließen kannst.
  • #8
    ArturAVS
    Moderator HP/Truck/Electric
    tmf hat geschrieben:
    dieses LCD über die parallele Schnittstelle anschließen kannst.

    In dieser Version nur SPI, ich habe mehrere davon.
  • #9
    XS_Sowa
    Niveau 13  
    Zitat:
    Wenn es irgendwann aus unbekannten Gründen nicht mehr funktioniert, wird user experience großartig sein :)
    Bei Nenntakt von 10 MHz ergibt sich eine Übertragungsrate von 1,25 MB/s. Mehr als genug, um Teile eines Fortschrittsbalkens absolut flüssig anzuzeigen. Wenn dies nicht der Fall ist, stimmt etwas mit Ihrer Streaming-/Grafikerstellung nicht. Der gekaufte LCD hat wohl keine abgeleitete TE um mit der Erstellung des Frames zu synchronisieren?
    Eine andere Sache ist, dass du so viele freie IO-Pins hast, wenn du Filme auf diesem LCD anzeigen möchtest, während der Stapel kopiert wird, dieses LCD über die parallele Schnittstelle anschließen kannst.

    Tatsache ist, dass es bei so kleinen Elementen keinen großen Unterschied gibt (obwohl es in einem anderen Projekt bei einer größeren Schriftart mit einer Höhe von 100 Pixeln oder beim Füllen mit Farbe besser sichtbar ist), ist es möglich, dass jemand es nicht einmal merken würde und nur ich bin überempfindlich. Sowieso, ich habe dieses LCD lange mit dieser Geschwindigkeit getestet, hatte nie irgendwelche seltsamen Probleme, aber ich werde es auf jeden Fall im Hinterkopf behalten, wenn etwas Unvorhergesehenes passiert :) Das LCD selbst hat, wie von Kollege ArturAVS erwähnt, nur die SPI-Schnittstelle.
    [F]