SFUD est une bibliothèque de pilotes Universal SPI Flash open source. Puisqu'il existe de nombreux types de flash série sur le marché, les spécifications et les commandes de chaque flash sont différentes. SFUD est conçu pour résoudre les différences actuelles dans ces éclairs, permettant à nos produits de prendre en charge le flash de différentes marques et spécifications, améliorer la réutilisabilité et l'évolutivité des logiciels impliquant des fonctions de flash, et en même temps, il peut également éviter les risques apportés au produit à l'extérieur ou l'arrêt du flash.
/sfud/inc/sfud_flash_def.h ). S'il n'est pas pris en charge, vous pouvez ajouter les informations des paramètres de ce flash dans le fichier de configuration (voir Flash qui n'est actuellement pas pris en charge dans la bibliothèque d'ajout 2.5 pour plus de détails). Après avoir obtenu les spécifications de Flash, toutes les opérations sur Flash peuvent être réalisées. Le tableau suivant montre tous les flashs qui ont été testés en temps réel sur la plate-forme de démonstration. Flash qui ne prend pas en charge la norme SFDP a été défini dans la table d'information des paramètres Flash. Plus de flash qui ne prend pas en charge la norme SFDP doit être amélioré et maintenu à l'avenir (GitHub | Oschina | codage) .
Si vous pensez que ce projet open source est super, vous pouvez cliquer sur Star dans le coin supérieur droit de la page d'accueil du projet et le recommander à plus d'amis dans le besoin.
| modèle | Fabricant | capacité | Vitesse maximale | Norme SFDP | Mode QSPI | Remarque |
|---|---|---|---|---|---|---|
| W25Q40BV | Vigilant | 4 Mo | 50 MHz | Non pris en charge | Double ligne | La production a été interrompue |
| W25Q80DV | Vigilant | 8 Mo | 104 MHz | soutien | Double ligne | |
| W25Q16BV | Vigilant | 16 Mo | 104 MHz | Non pris en charge | Double ligne | par Slipperstree |
| W25Q16CV | Vigilant | 16 Mo | 104 MHz | soutien | Non testé | |
| W25Q16DV | Vigilant | 16 Mo | 104 MHz | soutien | Non testé | par Slipperstree |
| W25Q32BV | Vigilant | 32 Mo | 104 MHz | soutien | Double ligne | |
| W25Q64CV | Vigilant | 64 Mo | 80 MHz | soutien | Quatre lignes | |
| W25Q128BV | Vigilant | 128 Mo | 104 MHz | soutien | Quatre lignes | |
| W25Q256FV | Vigilant | 256 Mo | 104 MHz | soutien | Quatre lignes | |
| MX25L3206E | Macronix | 32 Mo | 86 MHz | soutien | Double ligne | |
| MX25L3233F | Macronix | 32 Mo | 133 MHz | soutien | Non testé | par Jiapengli |
| KH25L4006E | Macronix | 4 Mo | 86 MHz | soutien | Non testé | par Jiapengli |
| KH25L3206E | Macronix | 32 Mo | 86 MHz | soutien | Double ligne | |
| Sst25vf016b | Puce | 16 Mo | 50 MHz | Non pris en charge | Non pris en charge | SST a été acquis par Microchip |
| M25p40 | Micron | 4 Mo | 75 MHz | Non pris en charge | Non testé | par redoccheng |
| M25P80 | Micron | 8 Mo | 75 MHz | Non pris en charge | Non testé | par redoccheng |
| M25p32 | Micron | 32 Mo | 75 MHz | Non pris en charge | Non pris en charge | |
| EN25Q32B | Eon | 32 Mo | 104 MHz | Non pris en charge | Non testé | |
| GD25Q16B | Gigadevice | 16 Mo | 120 MHz | Non pris en charge | Non testé | par Tanekliang |
| GD25Q32C | Gigadevice | 32 Mo | 120 MHz | Non pris en charge | Non testé | par Gaupen1186 |
| GD25Q64B | Gigadevice | 64 Mo | 120 MHz | Non pris en charge | Double ligne | |
| S25FL216K | Cyprès | 16 Mo | 65 MHz | Non pris en charge | Double ligne | |
| S25fl032p | Cyprès | 32 Mo | 104 MHz | Non pris en charge | Non testé | par yc_911 |
| S25FL164K | Cyprès | 64 Mo | 108 MHz | soutien | Non testé | |
| A25L080 | Amic | 8 Mo | 100 MHz | Non pris en charge | Double ligne | |
| A25LQ64 | Amic | 64 Mo | 104 MHz | soutien | soutien | |
| F25L004 | ESMT | 4 Mo | 100 MHz | Non pris en charge | Non pris en charge | |
| PCT25VF016B | PCT | 16 Mo | 80 MHz | Non pris en charge | Non pris en charge | La licence SST sera identifiée comme SST25VF016B |
| AT45DB161E | Adesto | 16 Mo | 85 MHz | Non pris en charge | Non pris en charge | Adesto acquiert une gamme de produits Flash Serial Flash |
| NM25Q128EV | Nor_mem | 128 Mo | Non testé | Non pris en charge | Non testé | SFDP peut lire les informations et les identifier comme plus de 32 Go. |
| P25d40h | Puya | 4 Mo | Non testé | soutien | Non testé | par Shan |
| P25Q80H | Puya | 8 Mo | Non testé | soutien | Non testé | par Shan |
Remarque: En mode QSPI, le double fil signifie la lecture rapide à double fil à double fil, et à quatre fils signifie prendre en charge la lecture rapide à quatre fils.
D'une manière générale, Flash, qui prend en charge la lecture rapide à quatre lignes, prend également en charge la lecture rapide à deux lignes.
Expliquons d'abord une structure principalement utilisée dans cette bibliothèque sfud_flash . Sa définition est située dans /sfud/inc/sfud_def.h . Chaque flash SPI correspondra à une structure et le pointeur de structure est collectivement appelé l'objet de périphérique flash. Une fois l'initialisation réussie, les paramètres Flash SPI courants seront stockés dans sfud_flash->chip . Si SPI Flash prend également en charge SFDP, vous pouvez également voir des informations de paramètres plus complètes via sfud_flash->sfdp . De nombreuses fonctions suivantes utiliseront l'objet Flash Device comme premier paramètre d'entrée pour implémenter les opérations sur le flash SPI spécifié.
sfud_device_init sera appelé pour initialiser tous les périphériques de la table de périphérique flash. S'il n'y a qu'un seul flash, vous pouvez utiliser sfud_device_init pour une seule initialisation uniquement.
Remarque : le flash SPI initialisé n'a pas été protégé par défaut. Si vous avez besoin d'activer la lecture de Write-Protect, veuillez utiliser la fonction SFUD_WRITE_STATUS pour modifier l'état SPI Flash.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| paramètre | décrire |
|---|---|
| éclair | Appareil flash à initialiser |
Lorsque SFUD s'active sur le mode QSPI, le pilote flash dans SFUD prend en charge la communication à l'aide du bus QSPI. Par rapport au mode SPI traditionnel, l'utilisation de QSPI peut accélérer la lecture des données Flash. Cependant, lorsque les données doivent être écrites, la vitesse d'écriture des données du flash elle-même est plus lente que la vitesse de transmission SPI, de sorte que la vitesse d'écriture des données en mode QSPI n'est pas significativement améliorée.
Par conséquent, la prise en charge de SFUD pour le mode QSPI est limitée aux commandes de lecture rapide. Cette fonction vous permet de configurer la largeur de ligne de données maximale prise en charge réelle du bus QSPI utilisé par Flash, tel que: 1 ligne (par défaut, c'est-à-dire le mode SPI traditionnel), 2 lignes et 4 lignes.
Après le réglage, SFUD combinera la largeur de ligne de données de bus QSPI actuellement définie pour correspondre à la commande de lecture rapide la plus appropriée et la plus rapide dans la table d'informations d'extension Flash QSPI. Après cela, lorsque l'utilisateur appelle sfud_read (), il utilisera la fonction de transmission du mode QSPI pour envoyer la commande.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| paramètre | décrire |
|---|---|
| éclair | Dispositifs flash |
| data_line_width | La largeur de ligne de données maximale prise en charge par le bus QSPI, comme: 1, 2, 4 |
La table de périphérique flash est définie dans le fichier de configuration SFUD, qui est responsable du stockage de tous les objets de périphérique flash à utiliser, donc SFUD prend en charge plusieurs périphériques Flash à conduire simultanément. La configuration de la table de périphérique est définie dans la macro SFUD_FLASH_DEVICE_TABLE dans /sfud/inc/sfud_cfg.h . Pour les méthodes de configuration détaillées, reportez-vous à la méthode de configuration 2.3 Flash). Cette méthode renvoie l'objet de périphérique flash en indexant le périphérique flash dans la table de périphérique et renvoie NULL au-delà de la plage de table de périphérique.
sfud_flash * sfud_get_device ( size_t index )| paramètre | décrire |
|---|---|
| indice | La valeur d'index du périphérique flash situé dans la table du périphérique flash |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| addr | Adresse de départ |
| taille | La taille totale des données lues à partir de l'adresse de départ |
| données | Lire les données |
Remarque: l'opération d'effacement sera alignée en fonction de la granularité d'effacement de la puce Flash (voir la fiche de données Flash pour plus de détails, généralement la taille du bloc. Une fois l'initialisation terminée, vous pouvez le visualiser via
sfud_flash->chip.erase_gran). Veuillez veiller à vous assurer que l'adresse de démarrage et la taille des données d'effacement sont alignées en fonction de la granularité effaçante de la puce flash. Sinon, après avoir effectué l'opération d'effacement, d'autres données seront perdues.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| addr | Adresse de départ |
| taille | La taille totale des données d'effacement de l'adresse de départ |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| addr | Adresse de départ |
| taille | Taille totale des données écrites à partir de l'adresse de départ |
| données | Données à écrire |
Remarque: l'opération d'effacement sera alignée en fonction de la granularité d'effacement de la puce Flash (voir la fiche de données Flash pour plus de détails, généralement la taille du bloc. Une fois l'initialisation terminée, vous pouvez le visualiser via
sfud_flash->chip.erase_gran). Veuillez veiller à vous assurer que l'adresse de démarrage et la taille des données d'effacement sont alignées en fonction de la granularité effaçante de la puce flash. Sinon, après avoir effectué l'opération d'effacement, d'autres données seront perdues.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| addr | Adresse de départ |
| taille | Taille totale des données écrites à partir de l'adresse de départ |
| données | Données à écrire |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| statut | Valeur du registre d'état actuel |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| paramètre | décrire |
|---|---|
| éclair | Objet de périphérique flash |
| is_volatile | Est-il facile de manquer? Vrai: facile à manquer et sera perdu après une panne de courant |
| statut | Valeur du registre d'état actuel |
Toutes les configurations sont situées dans /sfud/inc/sfud_cfg.h . Veuillez vous référer à l'introduction de la configuration ci-dessous pour sélectionner la configuration qui convient à votre projet.
Activer / désactiver SFUD_DEBUG_MODE Définition de macro
Activer / désactiver la définition de macro SFUD_USING_SFDP
Remarque: Après la fermeture, seule la table d'information Flash fournie par la bibliothèque dans
/sfud/inc/sfud_flash_def.hsera interrogée. Bien que cela réduira l'adaptabilité du logiciel, cela réduira la quantité de code.
Allumez / désactivez SFUD_USING_FAST_READ . De nombreux modes de lecture flash peuvent ne pas répondre à la fréquence SPI supérieure (pour plus de détails, veuillez vous référer aux caractéristiques d'échange de la fiche technique de chaque flash), et le mode de lecture rapide doit être activé.
Remarque: Parce que le mode de lecture rapide insère un octet nulle par défaut lors de la lecture, il peut être plus lent que le mode de lecture lorsque le débit SPI est plus lent.
Activer / désactiver SFUD_USING_FLASH_INFO_TABLE DEMIFICTION DE MACRO
Remarque: Après la clôture, cette bibliothèque ne fera que le flash qui prend en charge les spécifications SFDP, qui réduiront également de manière appropriée la quantité de code. De plus, les deux définitions macro de 2.3.2 et 2.3.3 définissent au moins une d'entre elles, et elles peuvent également être sélectionnées dans les deux sens.
Afin de réduire davantage la quantité de code, SFUD_USING_SFDP et SFUD_USING_FLASH_INFO_TABLE peuvent également être définis .
À l'heure actuelle, spécifiez simplement les paramètres Flash lors de la définition du périphérique Flash, puis appelez sfud_device_init pour initialiser l'appareil. Reportez-vous au code suivant:
sfud_flash sfud_norflash0 = {
. name = "norflash0" ,
. spi . name = "SPI1" ,
. chip = { "W25Q64FV" , SFUD_MF_ID_WINBOND , 0x40 , 0x17 , 8L * 1024L * 1024L , SFUD_WM_PAGE_256B , 4096 , 0x20 } };
......
sfud_device_init ( & sfud_norflash0 );
...... S'il y a plusieurs flashs dans le produit, vous pouvez ajouter la table de périphérique flash. Modifier la définition de macro de SFUD_FLASH_DEVICE_TABLE , l'exemple est le suivant:
enum {
SFUD_W25Q64CV_DEVICE_INDEX = 0 ,
SFUD_GD25Q64B_DEVICE_INDEX = 1 ,
};
#define SFUD_FLASH_DEVICE_TABLE
{
[SFUD_W25Q64CV_DEVICE_INDEX] = {.name = "W25Q64CV", .spi.name = "SPI1"},
[SFUD_GD25Q64B_DEVICE_INDEX] = {.name = "GD25Q64B", .spi.name = "SPI3"},
} Ce qui précède définit deux dispositifs flash (l'un des produits la plupart est suffisant). Les noms des deux appareils sont "W25Q64CV" et "GD25Q64B" , correspondant aux deux noms de périphériques SPI "SPI1" et "SPI3" respectivement (il sera utilisé lors de la migration de l'interface SPI, située dans /sfud/port/sfud_port.c ). Les deux énumérations de SFUD_W25Q16CV_DEVICE_INDEX et SFUD_GD25Q64B_DEVICE_INDEX définissent l'index des deux périphériques de la table de périphérique. Vous pouvez obtenir la table de périphérique via sfud_get_device_table() , puis accéder au périphérique spécifié avec cette valeur d'index.
Activer / désactiver la définition de macro SFUD_USING_QSPI
Lorsqu'il est activé, SFUD prendra également en charge Flash Connected à l'aide du bus QSPI.
Le fichier de port est situé dans /sfud/port/sfud_port.c . sfud_err sfud_spi_port_init(sfud_flash *flash) dans le fichier est une méthode de port fournie par la bibliothèque. Il complète la configuration des pilotes SPI Read and Write (requis), RETRY TIMES (requis), RETRY Interface (Facultatif) et SPI Locks (Facultatif). Pour un contenu de portage plus détaillé, vous pouvez vous référer aux fichiers de portage de chaque plate-forme dans la démo.
Ici, vous devez modifier /sfud/inc/sfdu_flash_def.h . Voir la définition de macro SFUD_FLASH_CHIP_TABLE pour tous les flashs pris en charge. Les paramètres flash qui doivent être préparés à l'avance sont: | Nom | ID du fabricant | Type ID | ID de capacité | Capacité | Mode d'écriture | Effacer la granularité (l'unité minimale d'effacement) | Effacer la granularité Commande correspondante | . Ici, nous prenons GD25Q64B avec Gigadevice comme exemple.
Ce flash est un modèle produit précoce d'innovation Gioyi, il ne prend donc pas en charge la norme SFDP. Tout d'abord, vous devez télécharger sa fiche technique et trouver les trois ID renvoyés par la commande 0x9f. Ici, vous avez besoin des deux derniers octets ID, à savoir type id et capacity id . GD25Q64B correspond à ces deux ID: 0x40 et 0x17 respectivement. Les autres paramètres flash requis ci-dessus peuvent être trouvés dans la fiche technique. Ici, nous nous concentrerons sur le mode d'écriture . Ce paramètre est fourni par la bibliothèque elle-même. Il existe 4 types de modes d'écriture. Pour plus de détails, veuillez consulter le type d'énumération sfud_write_mode en haut du fichier. Le même flash peut prendre en charge plusieurs modes d'écriture en même temps, selon la situation. Pour GD25Q64B , le mode d'écriture pris en charge doit être SFUD_WM_PAGE_256B , c'est-à-dire d'écrire 1 à 256 octets par page. Combiné avec les paramètres de flash GD25Q64B ci-dessus doit être le suivant:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Ajoutez-le à la fin de la définition de macro SFUD_FLASH_CHIP_TABLE pour compléter la prise en charge de la bibliothèque pour GD25Q64B .
Actuellement, il a pris en charge les démos sous les plateformes suivantes
| chemin | Description de la plate-forme |
|---|---|
| / démo / stm32f10x_non_os | Plate-forme stm32f10x en métal nu |
| / Demo / stm32f2xx_rtt | STM32F2XX + RT-Thread Operating System Plateforme |
| / Demo / STM32L475_NON_OS_QSPI | STM32L475 + QSPI Mode Bare Metal Plateforme |
| / Demo / esp32_ext_spi_flash | ESP32C3 + SPI Flash externe ESP-IDF |
Utilisez le protocole open source du MIT. Veuillez lire le contenu du fichier de licence dans le projet pour plus de détails.