SFUD ist eine Open Source Serial SPI Flash Universal Treiberbibliothek. Da es auf dem Markt viele Arten von seriellen Blitz gibt, sind die Spezifikationen und Befehle jedes Blitzes unterschiedlich. SFUD wurde entwickelt, um die aktuellen Unterschiede in diesen Blitzen zu lösen und unsere Produkte zu ermöglichen, die Flash verschiedener Marken und Spezifikationen zu unterstützen, die Wiederverwendbarkeit und Skalierbarkeit von Software mit Flash-Funktionen zu verbessern. Gleichzeitig kann es auch die Risiken vermeiden, die das Produkt außerhalb des Stockwerks oder die Absetzung von Flashs für das Produkt mit sich bringen.
/sfud/inc/sfud_flash_def.h ) nicht unterstützt. Wenn es nicht unterstützt wird, können Sie die Parameterinformationen dieser Flash in der Konfigurationsdatei hinzufügen (siehe Flash, der derzeit in der 2.5 -Additionsbibliothek für Details nicht unterstützt wird). Nachdem die Spezifikationen von Flash erhalten wurden, können alle Vorgänge auf Flash erreicht werden. Die folgende Tabelle zeigt alle Blitze, die in Echtzeit auf der Demo-Plattform getestet wurden. Flash, das den SFDP -Standard nicht unterstützt, wurde in der Informationstabelle von Flash -Parametern definiert. Mehr Flash, der den SFDP -Standard nicht unterstützt, muss in Zukunft verbessert und aufrechterhalten werden (Github | Oschina | Codierung) .
Wenn Sie der Meinung sind, dass dieses Open -Source -Projekt großartig ist, können Sie in der oberen rechten Ecke der Projekt -Homepage auf Stern klicken und es mehr Freunden in Not empfehlen.
| Modell | Hersteller | Kapazität | Höchstgeschwindigkeit | SFDP -Standard | QSPI -Modus | Bemerkung |
|---|---|---|---|---|---|---|
| W25Q40BV | Winbond | 4mb | 50 MHz | Nicht unterstützt | Doppelzeile | Die Produktion wurde eingestellt |
| W25Q80DV | Winbond | 8mb | 104 MHz | Unterstützung | Doppelzeile | |
| W25Q16BV | Winbond | 16 MB | 104 MHz | Nicht unterstützt | Doppelzeile | von Slipperstree |
| W25Q16CV | Winbond | 16 MB | 104 MHz | Unterstützung | Nicht getestet | |
| W25Q16DV | Winbond | 16 MB | 104 MHz | Unterstützung | Nicht getestet | von Slipperstree |
| W25Q32BV | Winbond | 32MB | 104 MHz | Unterstützung | Doppelzeile | |
| W25Q64CV | Winbond | 64 MB | 80MHz | Unterstützung | Vierzeilen | |
| W25Q128BV | Winbond | 128 MB | 104 MHz | Unterstützung | Vierzeilen | |
| W25Q256FV | Winbond | 256 MB | 104 MHz | Unterstützung | Vierzeilen | |
| MX25L3206E | MACRONIX | 32MB | 86 MHz | Unterstützung | Doppelzeile | |
| MX25L3233F | MACRONIX | 32MB | 133 MHz | Unterstützung | Nicht getestet | von Jiapengli |
| KH25L4006E | MACRONIX | 4mb | 86 MHz | Unterstützung | Nicht getestet | von Jiapengli |
| KH25L3206E | MACRONIX | 32MB | 86 MHz | Unterstützung | Doppelzeile | |
| SST25VF016B | Mikrochip | 16 MB | 50 MHz | Nicht unterstützt | Nicht unterstützt | SST wurde von Microchip übernommen |
| M25P40 | Mikron | 4mb | 75 MHz | Nicht unterstützt | Nicht getestet | von Redoccheng |
| M25P80 | Mikron | 8mb | 75 MHz | Nicht unterstützt | Nicht getestet | von Redoccheng |
| M25P32 | Mikron | 32MB | 75 MHz | Nicht unterstützt | Nicht unterstützt | |
| EN25Q32B | ÄON | 32MB | 104 MHz | Nicht unterstützt | Nicht getestet | |
| GD25Q16B | Gigadevice | 16 MB | 120 MHz | Nicht unterstützt | Nicht getestet | von Tankliang |
| GD25Q32C | Gigadevice | 32MB | 120 MHz | Nicht unterstützt | Nicht getestet | von Gupen1186 |
| GD25Q64B | Gigadevice | 64 MB | 120 MHz | Nicht unterstützt | Doppelzeile | |
| S25FL216K | Zypresse | 16 MB | 65 MHz | Nicht unterstützt | Doppelzeile | |
| S25FL032p | Zypresse | 32MB | 104 MHz | Nicht unterstützt | Nicht getestet | von yc_911 |
| S25FL164K | Zypresse | 64 MB | 108 MHz | Unterstützung | Nicht getestet | |
| A25L080 | Amic | 8mb | 100 MHz | Nicht unterstützt | Doppelzeile | |
| A25LQ64 | Amic | 64 MB | 104 MHz | Unterstützung | Unterstützung | |
| F25L004 | Esmt | 4mb | 100 MHz | Nicht unterstützt | Nicht unterstützt | |
| PCT25VF016B | PCT | 16 MB | 80MHz | Nicht unterstützt | Nicht unterstützt | Die SST -Lizenz wird als SST25VF016B identifiziert |
| AT45DB161E | Adesto | 16 MB | 85 MHz | Nicht unterstützt | Nicht unterstützt | Adesto erwirbt Atmel Serial Flash -Produktlinie |
| NM25Q128EV | NOR_MEM | 128 MB | Nicht getestet | Nicht unterstützt | Nicht getestet | SFDP kann die Informationen lesen und sie als mehr als 32 GB identifizieren. |
| P25D40H | Puya | 4mb | Nicht getestet | Unterstützung | Nicht getestet | von Shan |
| P25Q80H | Puya | 8mb | Nicht getestet | Unterstützung | Nicht getestet | von Shan |
HINWEIS: Im QSPI-Modus bedeutet Doppeldraht die Unterstützung des Doppeldrahtes, und vier Draht bedeutet die Unterstützung von vier Draht.
Im Allgemeinen unterstützt Flash, das die vierzeilige schnelle Lektüre unterstützt, ebenfalls zwei Zeilen-Schnelllesungen.
Erklären wir zunächst eine Struktur, die hauptsächlich in dieser Bibliothek sfud_flash verwendet wird. Seine Definition befindet sich in /sfud/inc/sfud_def.h . Jeder SPI -Blitz entspricht einer Struktur, und der Strukturzeiger wird gemeinsam als Flash -Geräteobjekt bezeichnet. Nachdem die Initialisierung erfolgreich ist, werden gemeinsame SPI-Flash-Parameter in sfud_flash->chip -Struktur gespeichert. Wenn SPI Flash auch SFDP unterstützt, können Sie auch umfassendere Parameterinformationen über sfud_flash->sfdp sehen. Viele der folgenden Funktionen verwenden das Flash -Geräteobjekt als erster Eintragsparameter zum Implementieren von Vorgängen auf dem angegebenen SPI -Flash.
sfud_device_init wird aufgerufen, um alle Geräte in der Tabelle Flash -Gerät zu initialisieren. Wenn es nur einen Blitz gibt, können Sie nur sfud_device_init verwenden, um einzelne Initialisierung zu erhalten.
Hinweis : Der initialisierte SPI-Blitz wurde standardmäßig ungezwungen geschützt . Wenn Sie einen Schreibschutz aktivieren müssen, verwenden Sie bitte die Funktion SFUD_Write_Status, um den SPI-Flash-Status zu ändern.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Gerät, die initialisiert werden sollen |
Wenn SFUD den QSPI -Modus aktiviert, unterstützt der Flash -Treiber in SFUD die Kommunikation mit dem QSPI -Bus. Im Vergleich zum herkömmlichen SPI -Modus kann die Verwendung von QSPI das Lesen von Flash -Daten beschleunigen. Wenn jedoch Daten geschrieben werden müssen, ist die Datenschreibgeschwindigkeit von Flash selbst langsamer als die SPI -Übertragungsgeschwindigkeit, sodass die Datenschreibgeschwindigkeit im QSPI -Modus nicht wesentlich verbessert werden.
Daher ist die Unterstützung von SFUD für den QSPI -Modus auf schnell gelesene Befehle beschränkt. Mit dieser Funktion können Sie die tatsächliche unterstützte maximale Datenlinienbreite des von Flash verwendeten QSPI -Busses konfigurieren, z. B. 1 Zeile (Standard, dh traditioneller SPI -Modus), 2 Zeile und 4 Zeile.
Nach der Einstellung kombiniert SFUD die derzeit festgelegte QSPI -Busdatenlinienbreite für den am besten geeigneten und schnellsten Quick -Lead -Befehl in der Informationstabelle der QSPI -Flash -Erweiterung. Wenn der Benutzer sfud_read () anruft, verwendet er die Übertragungsfunktion der QSPI -Modus, um den Befehl zu senden.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräte |
| Data_line_width | Die maximale Datenlinienbreite, die vom QSPI -Bus unterstützt wird, wie z. B. 1, 2, 4 |
Die Flash -Gerätetabelle ist in der SFUD -Konfigurationsdatei definiert, die für das Speichern aller zu verwendenden Flash -Geräteobjekte verantwortlich ist. SFUD unterstützt daher mehrere Flash -Geräte, die gleichzeitig angetrieben werden sollen. Die Konfiguration der Gerätetabelle ist im Makro SFUD_FLASH_DEVICE_TABLE in /sfud/inc/sfud_cfg.h definiert. Für detaillierte Konfigurationsmethoden finden Sie in 2.3 Konfigurationsmethoden Flash). Diese Methode gibt das Flash -Geräteobjekt zurück, indem das Flash -Gerät in der Gerätetabelle indiziert und NULL über den Gerätetabellenbereich hinausgeht.
sfud_flash * sfud_get_device ( size_t index )| Parameter | beschreiben |
|---|---|
| Index | Der Indexwert des Flash -Geräts in der Tabelle Flash -Gerätetabelle |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| ADDR | Startadresse |
| Größe | Die Gesamtgröße der Datengröße von der Startadresse |
| Daten | Daten lesen |
HINWEIS: Der Löschvorgang wird gemäß der Löschgranularität des Flash-Chips ausgerichtet (Details finden Sie im Allgemeinen die Blockgröße. Nach Abschluss der Initialisierung können Sie sie über
sfud_flash->chip.erase_grananzeigen). Bitte stellen Sie sicher, dass die Größe und Löschdatengröße nach der Löschgranularität des Flash -Chips ausgerichtet sind. Andernfalls gehen nach der Durchführung des Löschvorgangs andere Daten verloren.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| ADDR | Startadresse |
| Größe | Die Gesamtgröße der Löschdaten von der Startadresse |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| ADDR | Startadresse |
| Größe | Gesamtgröße der Daten, die aus der Startadresse geschrieben wurden |
| Daten | Daten zu schreiben |
HINWEIS: Der Löschvorgang wird gemäß der Löschgranularität des Flash-Chips ausgerichtet (Details finden Sie im Allgemeinen die Blockgröße. Nach Abschluss der Initialisierung können Sie sie über
sfud_flash->chip.erase_grananzeigen). Bitte stellen Sie sicher, dass die Größe und Löschdatengröße nach der Löschgranularität des Flash -Chips ausgerichtet sind. Andernfalls gehen nach der Durchführung des Löschvorgangs andere Daten verloren.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| ADDR | Startadresse |
| Größe | Gesamtgröße der Daten, die aus der Startadresse geschrieben wurden |
| Daten | Daten zu schreiben |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| Status | Aktueller Statusregisterwert |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| Parameter | beschreiben |
|---|---|
| Blitz | Flash -Geräteobjekt |
| is_volatile | Ist es leicht zu übersehen? Richtig: leicht zu übersehen und wird nach dem Stromausfall verloren gehen |
| Status | Aktueller Statusregisterwert |
Alle Konfigurationen befinden sich in /sfud/inc/sfud_cfg.h . In der folgenden Konfigurationseinführung finden Sie die Konfiguration, die Ihrem Projekt entspricht.
Schalten Sie SFUD_DEBUG_MODE -Makrodefinition ein/aus
Schalten Sie SFUD_USING_SFDP -MACRO -Definition ein/aus
Hinweis: Nach dem Schließen wird nur die von der Bibliothek in
/sfud/inc/sfud_flash_def.hbereitgestellte Flash -Informationstabelle abgefragt. Dies verringert zwar die Anpassungsfähigkeit der Software, verringert die Codemenge.
Schalten Sie SFUD_USING_FAST_READ ein/aus. Viele Flash -Lesemodi erfüllen möglicherweise nicht die höhere SPI -Frequenz (Einzelheiten finden Sie in den Merkmalen des Datenblatts der Tauschkennzahlen jedes Blitzes), und der schnelle Lesemodus muss aktiviert werden.
HINWEIS: Da der Fast -Lese -Modus beim Lesen ein Standard -Null -Byte einfügt, kann es langsamer sein als der Lesemodus, wenn die SPI -Rate langsamer ist.
Schalten Sie SFUD_USING_FLASH_INFO_TABLE MACRO -Definition ein/aus
HINWEIS: Nach dem Schließen wird diese Bibliothek nur mit Flash gefahren, die die SFDP -Spezifikationen unterstützt, wodurch auch die Codemenge angemessen reduziert wird. Darüber hinaus definieren die beiden Makrodefinitionen von 2.3.2 und 2.3.3 mindestens eine davon und können auch auf beide Arten ausgewählt werden.
Um die Codemenge weiter zu reduzieren, können auch SFUD_USING_SFDP und SFUD_USING_FLASH_INFO_TABLE weder definiert sein.
Geben Sie zu diesem Zeitpunkt einfach die Flash -Parameter an, wenn Sie das Flash -Gerät definieren, und rufen Sie dann sfud_device_init auf, um das Gerät zu initialisieren. Siehe den folgenden Code:
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 );
...... Wenn das Produkt mehrere Blitze enthält, können Sie die Flash -Gerätetabelle hinzufügen. Ändern Sie die Makrodefinition von SFUD_FLASH_DEVICE_TABLE , das Beispiel lautet wie folgt:
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"},
} Das obige definiert zwei Flash -Geräte (eines der meisten Produkte ist ausreichend). Die Namen der beiden Geräte sind "W25Q64CV" und "GD25Q64B" , die den beiden SPI -Gerätenamen "SPI1" bzw. "SPI3" entsprechen (es wird bei der Migration der SPI -Schnittstelle in /sfud/port/sfud_port.c verwendet). Die beiden Aufzählungen von SFUD_W25Q16CV_DEVICE_INDEX und SFUD_GD25Q64B_DEVICE_INDEX definieren den Index der beiden Geräte in der Gerätetabelle. Sie können die Gerätetabelle über sfud_get_device_table() abrufen und dann mit diesem Indexwert auf das angegebene Gerät zugreifen.
Schalten Sie SFUD_USING_QSPI -MACRO -Definition ein/aus
Wenn SFUD aktiviert ist, unterstützt SFUD auch mit dem QSPI -Bus angeschlossenen Flash, der verbunden ist.
Die Portdatei befindet sich in /sfud/port/sfud_port.c . sfud_err sfud_spi_port_init(sfud_flash *flash) in der Datei ist eine von der Bibliothek bereitgestellte Portmethode. Es vervollständigt die Konfiguration von SPI -Lese- und Schreibtreibern (Erforderlich), Wiederholungszeiten (Erforderlich), Wiederholung der Schnittstelle (optional) und SPI -Sperren (optional). Für detailliertere Portierungsinhalte können Sie sich auf die Portierungsdateien jeder Plattform in der Demo verweisen.
Hier müssen Sie /sfud/inc/sfdu_flash_def.h ändern. Siehe die Definition SFUD_FLASH_CHIP_TABLE für alle unterstützten Blitze. Die Flash -Parameter, die im Voraus vorbereitet werden müssen, sind: | Name | Hersteller -ID | Typ ID | Kapazitäts -ID | Kapazität | Schreibmodus | Granularität löschen (die Mindesteinheit des Löschens) | Granularität entsprechende Befehl löschen | . Hier nehmen wir GD25Q64B -Blitz mit Gigadevice als Beispiel.
Dieser Blitz ist ein frühproduziertes Modell der Gioyi-Innovation und unterstützt daher den SFDP-Standard nicht. Zunächst müssen Sie sein Datenblatt herunterladen und die drei vom Befehl 0x9f zurückgegebenen IDs finden. Hier benötigen Sie die letzten beiden Byte -ID, nämlich type id und capacity id . GD25Q64B entspricht diesen beiden IDs: 0x40 bzw. 0x17 . Die anderen oben erforderlichen Flash -Parameter finden Sie im Datenblatt. Hier konzentrieren wir uns auf den Schreibmodus . Dieser Parameter wird von der Bibliothek selbst bereitgestellt. Es gibt 4 Arten von Schreibmodi. Weitere Informationen finden Sie im Zählertyp sfud_write_mode oben in der Datei. Der gleiche Blitz kann je nach Situation gleichzeitig mehrere Schreibmodi unterstützen. Für GD25Q64B sollte der unterstützte Schreibmodus SFUD_WM_PAGE_256B sein, dh 1-256 Bytes pro Seite. In Kombination mit den oben genannten GD25Q64B -Flash -Parametern sollte wie folgt sein:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Fügen Sie es zum Ende der Makrodefinition SFUD_FLASH_CHIP_TABLE hinzu, um die Unterstützung der Bibliothek für GD25Q64B zu vervollständigen.
Derzeit hat es Demos auf den folgenden Plattformen unterstützt
| Weg | Plattformbeschreibung |
|---|---|
| /Demo/stm32f10x_non_os | STM32F10X Bare Metal -Plattform |
| /Demo/stm32f2xx_rtt | STM32F2XX + RT-Thread-Betriebssystemplattform |
| /Demo/STM32L475_NON_OS_QSPI | STM32L475 + QSPI -Modus Bare Metal -Plattform |
| /Demo/ESP32_EXT_SPI_FLASH | ESP32C3 + SPI externe Blitz-ESP-IDF-Framework |
Verwenden Sie das MIT Open Source -Protokoll. Bitte lesen Sie den Inhalt der Lizenzdatei im Projekt für Details.