Diviser et conquérir, ou écrire lentement - lire rapidement


Dans l'un de mes projets, il était nécessaire d'enregistrer séquentiellement des ensembles de données numérisés à partir de 3 canaux de l'ADC. Les résultats des mesures devaient être stockés à une vitesse de 6 Ko / s, tandis que la durée du cycle de collecte des données pouvait être d'un jour ou plus. Ainsi, la quantité totale d'informations devant être stockées était de 500 Mo ou plus. En tant que périphérique de stockage, il a été décidé de choisir une carte SD.


La tâche était compliquée par le fait que les caractéristiques de conception de l'appareil créé ne permettaient pas d'extraire une carte pour lire les données. Le contrôleur XMega128A4U , sur lequel la tâche était implémentée à ce moment-là, n'avait pas de support matériel SDIO, mais permettait de travailler avec la carte via l'interface SPI, dont la bande passante était tout à fait possible d'écrire à la vitesse requise, mais en lisant une quantité de données dans l'ordinateur via la chaîne de carte SD via SPI -> contrôleur -> Le convertisseur USB-Com était plutôt morne et a pris un temps considérable.


Après réflexion (et tentatives infructueuses d'overclocker légèrement l'ensemble ci-dessus), il a été décidé d'utiliser un contrôleur de lecteur de carte SD matériel, pour lequel la puce GL823 prenant en charge USB 2.0 a été choisie. Il était maintenant nécessaire de fournir un accès séparé à la carte SD depuis le contrôleur via SPI pendant la collecte des données et depuis l'ordinateur via SDIO, via GL823 pendant la lecture à haute vitesse. Cette séparation a été réalisée à l'aide de deux multiplexeurs 2x1 4 canaux.



Les lignes des commutateurs U2, U3 avec le préfixe STM sont connectées au contrôleur, les lignes avec le préfixe SD sont connectées à la carte SD. Pour contrôler le circuit, des signaux SD2MCU sont utilisés, commutant la carte SD entre le MCU et GL823 et GL823_PWR, commutant l'alimentation GL823 via le mosfet .


Au départ, je considérais cette approche comme une sorte de «béquille», mais, à ma grande surprise, elle s'est avérée très fonctionnelle pour moi et a été confirmée par la pratique de l'utilisation réussie de l'appareil pendant plusieurs années.


De plus, dans les développements suivants basés sur STM32F407 , qui prend en charge SDIO pour accéder à la carte, et la possibilité d'augmenter USB MS HS MSD (bien que via une interface ULPI parallèle), la possibilité d'utiliser une solution GL823 basée sur bus est considérée.


En utilisant un bundle de STM32F407 avec un PHY USB3300 externe, il était possible d'atteindre une vitesse de lecture de carte de ~ 41 Mbit / s, tandis que lorsque vous utilisez un lecteur de carte matériel, la vitesse atteint ~ 150 Mbit / s, toutes choses égales par ailleurs. Les mesures ont été effectuées en lisant un fichier de 128 Mo à partir d'une carte SD formatée en FAT32. Les deux approches ont leurs propres nuances d'utilisation, mais, il me semble, les deux ont un «droit à la vie». Quant aux nuances: dans mon cas, à la prochaine itération du développement de cet appareil, le matériel devait être placé sur une planche de 26 mm de large.


La disposition du PCB pour le LQFP100 du boîtier STM32F407 dans ce cas est quelque peu difficile, mais son "frère cadet" STM32F405 dans le boîtier LQFP64 était même localisé. Mais le STM32F405 manque d'ULPI, donc USB 2.0 HS n'est pas disponible pour cela, et l'implémentation MSD FS perd beaucoup dans la vitesse de lecture des données de la carte. En utilisant la même solution décrite ci-dessus, vous pouvez obtenir une vitesse d'accès suffisante à SD depuis l'ordinateur tout en lisant les données de l'appareil.


Je serais heureux si mon expérience est utile à quelqu'un.


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


All Articles