Teilen und erobern oder langsam schreiben - schnell lesen


In einem meiner Projekte bestand die Notwendigkeit, digitalisierte Datensätze von 3 Kanälen des ADC sequentiell aufzuzeichnen. Die Messergebnisse mussten mit einer Geschwindigkeit von 6 KB / s gespeichert werden, während die Dauer des Datenerfassungszyklus einen Tag oder mehr betragen konnte. Somit betrug die Gesamtmenge an Informationen, die gespeichert werden mussten, 500 MB oder mehr. Als Speichergerät wurde beschlossen, eine SD-Karte zu wählen.


Die Aufgabe wurde durch die Tatsache erschwert, dass die Konstruktionsmerkmale des erstellten Geräts es nicht ermöglichten, eine Karte zum Lesen von Daten zu extrahieren. Der XMega128A4U- Controller, auf dem die Aufgabe zu diesem Zeitpunkt implementiert wurde, hatte keine SDIO-Hardwareunterstützung, konnte jedoch über die SPI-Schnittstelle mit der Karte arbeiten, deren Bandbreite durchaus mit der erforderlichen Geschwindigkeit geschrieben werden konnte, aber eine Datenmenge über SPI über die SD-Kartenkette in den Computer eingelesen werden konnte -> Controller -> USB-Com-Konverter war ziemlich trostlos und nahm viel Zeit in Anspruch.


Nach einigen Überlegungen (und erfolglosen Versuchen, das obige Bundle leicht zu übertakten) wurde entschieden, einen Hardware-SD-Kartenleser-Controller zu verwenden, für den der GL823- Chip ausgewählt wurde, der USB 2.0 unterstützt. Jetzt war es notwendig, während der Datenerfassung vom Controller über SPI und vom Computer über SDIO über GL823 während des Hochgeschwindigkeitslesens einen separaten Zugriff auf die SD-Karte bereitzustellen . Diese Trennung wurde unter Verwendung von zwei 4-Kanal-2x1-Multiplexern implementiert.



Leitungen von den Schaltern U2, U3 mit dem STM-Präfix werden an die Steuerung angeschlossen, Leitungen mit dem SD-Präfix werden an die SD-Karte angeschlossen. Zur Steuerung der Schaltung werden SD2MCU-Signale verwendet, wobei die SD-Karte zwischen der MCU und GL823 und GL823_PWR umgeschaltet und die GL823-Leistung über den Mosfet umgeschaltet wird .


Anfangs betrachtete ich diesen Ansatz als eine Art „Krücke“, aber zu meiner großen Überraschung erwies er sich für mich als recht funktionell und wurde durch die Praxis bestätigt, das Gerät mehrere Jahre lang erfolgreich zu betreiben.


Darüber hinaus wird in den folgenden Entwicklungen basierend auf STM32F407 , das SDIO-Unterstützung für den Zugriff auf die Karte bietet, und der Möglichkeit, USB 2.0 HS-MSD (allerdings über eine parallele ULPI-Schnittstelle) zu erhöhen, die Möglichkeit der Verwendung einer busbasierten GL823- Lösung in Betracht gezogen.


Mit einem Bündel STM32F407 mit einem externen PHY USB3300 konnte eine Kartenlesegeschwindigkeit von ~ 41 Mbit / s erreicht werden, während bei Verwendung eines Hardwarekartenlesers die Geschwindigkeit ~ 150 Mbit / s erreicht, wobei alle anderen Faktoren gleich sind. Die Messungen wurden durch Lesen einer 128-MB-Datei von einer in FAT32 formatierten SD-Karte durchgeführt. Beide Ansätze haben ihre eigenen Nutzungsnuancen, aber meiner Meinung nach haben beide ein "Recht auf Leben". Was die Nuancen betrifft: In meinem Fall musste die Hardware bei der nächsten Iteration der Entwicklung dieses Geräts auf einer 26 mm breiten Platine platziert werden.


Das PCB- Layout für den LQFP100 des STM32F407-Gehäuses ist in diesem Fall etwas schwierig, aber sein "jüngerer Bruder" STM32F405 im LQFP64-Gehäuse wurde sogar gefunden. Dem STM32F405 fehlt jedoch ULPI, weshalb USB 2.0 HS nicht verfügbar ist, und die MSD FS-Implementierung verliert viel an Geschwindigkeit beim Lesen von Daten von der Karte. Mit der oben beschriebenen Lösung können Sie vom Computer aus eine ausreichende Geschwindigkeit für den Zugriff auf SD erhalten, während Sie Daten vom Gerät lesen.


Ich würde mich freuen, wenn meine Erfahrung für jemanden nützlich ist.


Source: https://habr.com/ru/post/de440308/


All Articles