SFUD es una biblioteca de controlador SPI Flash SPI Flash de código abierto. Dado que hay muchos tipos de flash en serie en el mercado, las especificaciones y comandos de cada flash son diferentes. SFUD está diseñado para resolver las diferencias actuales en estos flashes, lo que permite que nuestros productos respalden el destello de diferentes marcas y especificaciones, mejoren la reutilización y la escalabilidad del software que involucra funciones Flash, y al mismo tiempo, también puede evitar los riesgos traídos al producto mediante la presentación o la interrupción de Flash.
/sfud/inc/sfud_flash_def.h ). Si no es compatible, puede agregar la información de parámetros de este flash en el archivo de configuración (consulte Flash que actualmente no es compatible en la biblioteca de adición 2.5 para más detalles). Después de obtener las especificaciones de Flash, se pueden lograr todas las operaciones en Flash. La siguiente tabla muestra todos los destellos que se han probado en tiempo real en la plataforma de demostración. Flash que no admite el estándar SFDP se ha definido en la tabla de información del parámetro Flash. Más flash que no admite el estándar SFDP debe mejorarse y mantenerse en el futuro (GitHub | Oschina | Codificación) .
Si cree que este proyecto de código abierto es excelente, puede hacer clic en Star en la esquina superior derecha de la página de inicio del proyecto y recomendarlo a más amigos necesitados.
| modelo | Fabricante | capacidad | Velocidad máxima | Estándar SFDP | Modo QSPI | Observación |
|---|---|---|---|---|---|---|
| W25Q40BV | Winbond | 4MB | 50MHz | No compatible | Línea doble | La producción ha sido descontinuada |
| W25Q80DV | Winbond | 8MB | 104MHz | apoyo | Línea doble | |
| W25q16bv | Winbond | 16 MB | 104MHz | No compatible | Línea doble | por Slipperstree |
| W25Q16CV | Winbond | 16 MB | 104MHz | apoyo | No probado | |
| W25q16dv | Winbond | 16 MB | 104MHz | apoyo | No probado | por Slipperstree |
| W25Q32BV | Winbond | 32 MB | 104MHz | apoyo | Línea doble | |
| W25q64cv | Winbond | 64 MB | 80MHz | apoyo | De cuatro líneas | |
| W25Q128BV | Winbond | 128 MB | 104MHz | apoyo | De cuatro líneas | |
| W25Q256FV | Winbond | 256 MB | 104MHz | apoyo | De cuatro líneas | |
| MX25L3206E | Macronix | 32 MB | 86MHz | apoyo | Línea doble | |
| MX25L3233F | Macronix | 32 MB | 133MHz | apoyo | No probado | por jiapengli |
| KH25L4006E | Macronix | 4MB | 86MHz | apoyo | No probado | por jiapengli |
| KH25L3206E | Macronix | 32 MB | 86MHz | apoyo | Línea doble | |
| SST25VF016B | Pastilla | 16 MB | 50MHz | No compatible | No compatible | SST ha sido adquirido por Microchip |
| M25P40 | Micrón | 4MB | 75MHz | No compatible | No probado | por redoccheng |
| M25P80 | Micrón | 8MB | 75MHz | No compatible | No probado | por redoccheng |
| M25P32 | Micrón | 32 MB | 75MHz | No compatible | No compatible | |
| EN25Q32B | EÓN | 32 MB | 104MHz | No compatible | No probado | |
| GD25Q16B | Gigadevice | 16 MB | 120MHz | No compatible | No probado | por Tanekliang |
| GD25Q32C | Gigadevice | 32 MB | 120MHz | No compatible | No probado | por Gaupen1186 |
| GD25Q64B | Gigadevice | 64 MB | 120MHz | No compatible | Línea doble | |
| S25FL216K | Ciprés | 16 MB | 65MHz | No compatible | Línea doble | |
| S25FL032P | Ciprés | 32 MB | 104MHz | No compatible | No probado | por yc_911 |
| S25FL164K | Ciprés | 64 MB | 108MHz | apoyo | No probado | |
| A25L080 | Amico | 8MB | 100MHz | No compatible | Línea doble | |
| A25LQ64 | Amico | 64 MB | 104MHz | apoyo | apoyo | |
| F25L004 | ESMT | 4MB | 100MHz | No compatible | No compatible | |
| PCT25VF016B | PCT | 16 MB | 80MHz | No compatible | No compatible | La licencia SST se identificará como SST25VF016B |
| AT45DB161E | Adesto | 16 MB | 85MHz | No compatible | No compatible | ADESTO adquiere la línea de productos Flash en serie Atmel |
| NM25Q128EV | Nor_mem | 128 MB | No probado | No compatible | No probado | SFDP puede leer la información e identificarla como más de 32 GB. |
| P25D40H | Puya | 4MB | No probado | apoyo | No probado | por Shan |
| P25Q80H | Puya | 8MB | No probado | apoyo | No probado | por Shan |
Nota: En el modo QSPI, el alambre doble significa que admite una lectura rápida de doble cable y cuatro hilos significa que soporta una lectura rápida de cuatro hilos.
En términos generales, Flash, que admite una lectura rápida de cuatro líneas, también admite una lectura rápida de dos líneas.
Primero explicemos una estructura utilizada principalmente en esta biblioteca sfud_flash . Su definición se encuentra en /sfud/inc/sfud_def.h . Cada flash SPI corresponderá a una estructura, y el puntero de la estructura se conoce colectivamente como el objeto del dispositivo flash. Después de que la inicialización sea exitosa, los parámetros de flash SPI comunes se almacenarán en sfud_flash->chip . Si SPI Flash también es compatible con SFDP, también puede ver información de parámetros más integral a través de sfud_flash->sfdp . Muchas de las siguientes funciones utilizarán el objeto del dispositivo Flash como el primer parámetro de entrada para implementar operaciones en el SPI Flash especificado.
sfud_device_init se llamará para inicializar todos los dispositivos en la tabla del dispositivo Flash. Si solo hay un flash, puede usar sfud_device_init solo para una inicialización única.
Nota : El flash SPI inicializado no ha sido protegido por defecto. Si necesita habilitar Write-Protect, use la función SFUD_WRITE_STATUS para modificar el estado SPI Flash.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| parámetro | describir |
|---|---|
| destello | Dispositivo flash para inicializar |
Cuando SFUD enciende el modo QSPI, el controlador Flash en SFUD admite la comunicación utilizando el bus QSPI. En comparación con el modo SPI tradicional, el uso de QSPI puede acelerar la lectura de datos flash. Sin embargo, cuando se necesitan datos, la velocidad de escritura de datos de Flash en sí es más lenta que la velocidad de transmisión SPI, por lo que la velocidad de escritura de datos en el modo QSPI no mejora significativamente.
Por lo tanto, el soporte de SFUD para el modo QSPI se limita a los comandos de lectura rápida. Esta función le permite configurar el ancho de línea de datos máximos de datos compatible con el bus QSPI utilizado por flash, como: 1 línea (predeterminado, es decir, modo SPI tradicional), 2 línea y 4 líneas.
Después de la configuración, SFUD combinará el ancho de la línea de datos del bus QSPI actualmente establecido para que coincida con el comando de lectura rápida más adecuada y rápida en la tabla de información de extensión Flash QSPI. Después de eso, cuando el usuario llama sfud_read (), usará la función de transmisión de modo QSPI para enviar el comando.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| parámetro | describir |
|---|---|
| destello | Dispositivos flash |
| data_line_width | El ancho de línea de datos máximo admitido por el bus QSPI, como: 1, 2, 4 |
La tabla del dispositivo Flash se define en el archivo de configuración SFUD, que es responsable de almacenar todos los objetos del dispositivo Flash que se utilizarán, por lo que SFUD admite múltiples dispositivos Flash para conducir simultáneamente. La configuración de la tabla del dispositivo se define en SFUD_FLASH_DEVICE_TABLE Macro in /sfud/inc/sfud_cfg.h . Para obtener métodos de configuración detallados, consulte el método de configuración 2.3 flash). Este método devuelve el objeto del dispositivo Flash indexando el dispositivo flash en la tabla del dispositivo y devuelve NULL más allá del rango de la tabla del dispositivo.
sfud_flash * sfud_get_device ( size_t index )| parámetro | describir |
|---|---|
| índice | El valor de índice del dispositivo flash ubicado en la tabla del dispositivo flash |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| addr | Dirección inicial |
| tamaño | El tamaño total de los datos leídos desde la dirección de inicio |
| datos | Leer datos |
Nota: La operación de borrado se alineará de acuerdo con la granularidad de borrado del chip flash (consulte la hoja de datos flash para más detalles, generalmente el tamaño del bloque. Después de completar la inicialización, puede verlo a través de
sfud_flash->chip.erase_gran). Tenga cuidado de asegurarse de que la dirección inicial y el tamaño de los datos de borrar estén alineados de acuerdo con la granularidad de borrado del chip flash. De lo contrario, después de realizar la operación de borrado, se perderán otros datos.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| addr | Dirección inicial |
| tamaño | El tamaño total de los datos de borrado de la dirección de inicio |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| addr | Dirección inicial |
| tamaño | Tamaño total de datos escritos desde la dirección de inicio |
| datos | Datos a escribir |
Nota: La operación de borrado se alineará de acuerdo con la granularidad de borrado del chip flash (consulte la hoja de datos flash para más detalles, generalmente el tamaño del bloque. Después de completar la inicialización, puede verlo a través de
sfud_flash->chip.erase_gran). Tenga cuidado de asegurarse de que la dirección inicial y el tamaño de los datos de borrar estén alineados de acuerdo con la granularidad de borrado del chip flash. De lo contrario, después de realizar la operación de borrado, se perderán otros datos.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| addr | Dirección inicial |
| tamaño | Tamaño total de datos escritos desde la dirección de inicio |
| datos | Datos a escribir |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| estado | Valor de registro de estado actual |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| parámetro | describir |
|---|---|
| destello | Objeto de dispositivo flash |
| Is_volatile | ¿Es fácil perderse? Verdadero: Fácil de perder y se perderá después del apagón |
| estado | Valor de registro de estado actual |
Todas las configuraciones se encuentran en /sfud/inc/sfud_cfg.h . Consulte la introducción de configuración a continuación para seleccionar la configuración que se adapte a su proyecto.
Activar/desactivar SFUD_DEBUG_MODE Definición macro
Activar/desactivar SFUD_USING_SFDP Macro Definición
Nota: Después de cerrar, solo se consultará la tabla de información flash proporcionada por la biblioteca en
/sfud/inc/sfud_flash_def.h. Aunque esto reducirá la adaptabilidad del software, reducirá la cantidad de código.
Activar/desactivar SFUD_USING_FAST_READ . Es posible que muchos modos de lectura flash no cumplan con la frecuencia SPI más alta (para más detalles, consulte las características de intercambio de la hoja de datos de cada flash), y el modo de lectura rápida debe haberse habilitado.
Nota: Debido a que el modo de lectura rápido inserta un byte nulo predeterminado al leer, puede ser más lento que el modo de lectura cuando la velocidad SPI es más lenta.
Activar/desactivar SFUD_USING_FLASH_INFO_TABLE Definición macro
Nota: Después de cerrar, esta biblioteca solo conducirá flash que admite las especificaciones SFDP, lo que también reducirá adecuadamente la cantidad de código. Además, las dos definiciones macro de 2.3.2 y 2.3.3 definen al menos una de ellas, y también pueden seleccionarse en ambos sentidos.
Para reducir aún más la cantidad de código, SFUD_USING_SFDP y SFUD_USING_FLASH_INFO_TABLE tampoco pueden definirse .
En este momento, simplemente especifique los parámetros Flash al definir el dispositivo Flash y luego llame a sfud_device_init para inicializar el dispositivo. Consulte el siguiente código:
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 );
...... Si hay múltiples flashes en el producto, puede agregar la tabla de dispositivos Flash. Modificar la definición macro de SFUD_FLASH_DEVICE_TABLE , el ejemplo es el siguiente:
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"},
} Lo anterior define dos dispositivos flash (uno de los productos es suficiente). Los nombres de los dos dispositivos son "W25Q64CV" y "GD25Q64B" , correspondientes a los dos nombres de dispositivos SPI "SPI1" y "SPI3" respectivamente (se usará al migrar la interfaz SPI, ubicada en /sfud/port/sfud_port.c ). Las dos enumeraciones de SFUD_W25Q16CV_DEVICE_INDEX y SFUD_GD25Q64B_DEVICE_INDEX define el índice de los dos dispositivos en la tabla del dispositivo. Puede obtener la tabla del dispositivo a través sfud_get_device_table() y luego acceder al dispositivo especificado con este valor de índice.
Activar/desactivar SFUD_USING_QSPI Definición de macro
Cuando está habilitado, SFUD también admitirá flash conectado usando el bus QSPI.
El archivo de puerto se encuentra en /sfud/port/sfud_port.c . sfud_err sfud_spi_port_init(sfud_flash *flash) en el archivo es un método de puerto proporcionado por la biblioteca. Completa la configuración de los controladores de lectura y escritura SPI (requeridos), tiempos de reintento (requerido), interfaz de reintento (opcional) y bloqueos SPI (opcionales). Para obtener contenido de portada más detallado, puede consultar los archivos de portada de cada plataforma en la demostración.
Aquí necesita modificar /sfud/inc/sfdu_flash_def.h . Vea la definición de macro SFUD_FLASH_CHIP_TABLE para todos los flashes compatibles. Los parámetros flash que deben estar preparados de antemano son: | Nombre | ID de fabricante | Tipo ID | ID de capacidad | Capacidad | Modo de escritura | Borrar granularidad (la unidad mínima de borrado) | Borrar la granularidad del comando correspondiente | . Aquí tomamos GD25Q64B con GigadeVice como ejemplo.
Este flash es un modelo producido temprano de innovación Gioyi, por lo que no admite el estándar SFDP. Primero, debe descargar su hoja de datos y encontrar las tres ID devueltas por el comando 0x9f. Aquí necesita las últimas dos ID de bytes, a saber, type id e capacity id . GD25Q64B corresponde a estas dos ID: 0x40 y 0x17 respectivamente. Los otros parámetros flash requeridos anteriormente se pueden encontrar en la hoja de datos. Aquí nos centraremos en el modo de escritura . Este parámetro es proporcionado por la biblioteca misma. Hay 4 tipos de modos de escritura. Para obtener más detalles, consulte el tipo de enumeración sfud_write_mode en la parte superior del archivo. El mismo flash puede admitir múltiples modos de escritura al mismo tiempo, dependiendo de la situación. Para GD25Q64B , el modo de escritura compatible debe ser SFUD_WM_PAGE_256B , es decir, escribir 1-256 bytes por página. Combinado con los parámetros de flash GD25Q64B anteriores debe ser los siguientes:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Agrégalo al final de la definición de macro SFUD_FLASH_CHIP_TABLE para completar el soporte de la biblioteca para GD25Q64B .
Actualmente, ha admitido demostraciones en las siguientes plataformas
| camino | Descripción de la plataforma |
|---|---|
| /demo/stm32f10x_non_os | Plataforma de metal desnudo STM32F10X |
| /demo/stm32f2xx_rtt | STM32F2XX + RT-PROBAJO DEL SISTEMA OPERATIVO |
| /demo/stm32l475_non_os_qspi | STM32L475 + MODO QSPI Bare Metal Platform |
| /demo/esp32_ext_spi_flash | Marco ESP32C3 + SPI Flash ESP-IDF ESP-IDF |
Use el protocolo de código abierto del MIT. Lea el contenido del archivo de licencia en el proyecto para obtener más detalles.