Sfud - это серийная библиотека Driver Driver Driver Spi с открытым исходным кодом. Поскольку на рынке есть много типов последовательной вспышки, спецификации и команды каждой вспышки различны. SFUD предназначен для решения текущих различий в этих вспышках, позволяя нашим продуктам поддерживать вспышку различных брендов и спецификаций, улучшить способность повторного использования и масштабируемость программного обеспечения, включающего функции вспышки, и в то же время он также может избежать рисков, приведенных в продукт путем вывода или отключения флэш.
/sfud/inc/sfud_flash_def.h ). Если он не поддерживается, вы можете добавить информацию о параметрах этой вспышки в файл конфигурации (см. Flash, которая в настоящее время не поддерживается в библиотеке 2.5 для получения подробной информации). После получения спецификаций вспышки могут быть достигнуты все операции на Flash. В следующей таблице показаны все вспышки, которые были протестированы в режиме реального времени на демонстрационной платформе. Flash, которая не поддерживает стандарт SFDP, была определена в таблице информации о параметрах Flash. Больше вспышки, которая не поддерживает стандарт SFDP, необходимо улучшить и поддерживать в будущем (Github | Oschina | Кодирование) .
Если вы думаете, что этот проект с открытым исходным кодом великолепен, вы можете щелкнуть Star в правом верхнем углу домашней страницы проекта и порекомендовать его больше друзей.
| модель | Производитель | емкость | Максимальная скорость | Стандарт SFDP | QSPI режим | Примечание |
|---|---|---|---|---|---|---|
| W25Q40BV | Уинбонд | 4 МБ | 50 МГц | Не поддерживается | Двойная линия | Производство было прекращено |
| W25Q80DV | Уинбонд | 8 МБ | 104 МГц | поддерживать | Двойная линия | |
| W25Q16BV | Уинбонд | 16 МБ | 104 МГц | Не поддерживается | Двойная линия | от Slipperstree |
| W25Q16CV | Уинбонд | 16 МБ | 104 МГц | поддерживать | Не тестируется | |
| W25Q16DV | Уинбонд | 16 МБ | 104 МГц | поддерживать | Не тестируется | от Slipperstree |
| W25Q32BV | Уинбонд | 32 МБ | 104 МГц | поддерживать | Двойная линия | |
| W25Q64CV | Уинбонд | 64 МБ | 80 МГц | поддерживать | Четырех-строка | |
| W25Q128BV | Уинбонд | 128 МБ | 104 МГц | поддерживать | Четырех-строка | |
| W25Q256FV | Уинбонд | 256 МБ | 104 МГц | поддерживать | Четырех-строка | |
| MX25L3206E | Macronix | 32 МБ | 86 МГц | поддерживать | Двойная линия | |
| MX25L3233F | Macronix | 32 МБ | 133 МГц | поддерживать | Не тестируется | Jiapengli |
| KH25L4006E | Macronix | 4 МБ | 86 МГц | поддерживать | Не тестируется | Jiapengli |
| KH25L3206E | Macronix | 32 МБ | 86 МГц | поддерживать | Двойная линия | |
| SST25VF016B | Микрочип | 16 МБ | 50 МГц | Не поддерживается | Не поддерживается | SST был приобретен Microchip |
| M25P40 | Микрон | 4 МБ | 75 МГц | Не поддерживается | Не тестируется | Редокчен |
| M25P80 | Микрон | 8 МБ | 75 МГц | Не поддерживается | Не тестируется | Редокчен |
| M25P32 | Микрон | 32 МБ | 75 МГц | Не поддерживается | Не поддерживается | |
| EN25Q32B | Эон | 32 МБ | 104 МГц | Не поддерживается | Не тестируется | |
| GD25Q16B | Гигадевице | 16 МБ | 120 МГц | Не поддерживается | Не тестируется | Танеклиан |
| GD25Q32C | Гигадевице | 32 МБ | 120 МГц | Не поддерживается | Не тестируется | Gaupen1186 |
| GD25Q64B | Гигадевице | 64 МБ | 120 МГц | Не поддерживается | Двойная линия | |
| S25FL216K | Кипарис | 16 МБ | 65 МГц | Не поддерживается | Двойная линия | |
| S25FL032P | Кипарис | 32 МБ | 104 МГц | Не поддерживается | Не тестируется | по YC_911 |
| S25FL164K | Кипарис | 64 МБ | 108 МГц | поддерживать | Не тестируется | |
| A25L080 | Амик | 8 МБ | 100 МГц | Не поддерживается | Двойная линия | |
| A25LQ64 | Амик | 64 МБ | 104 МГц | поддерживать | поддерживать | |
| F25L004 | Эсмт | 4 МБ | 100 МГц | Не поддерживается | Не поддерживается | |
| PCT25VF016B | Отча | 16 МБ | 80 МГц | Не поддерживается | Не поддерживается | Лицензия SST будет идентифицирована как SST25VF016B |
| AT45DB161E | Adesto | 16 МБ | 85 МГц | Не поддерживается | Не поддерживается | Adesto приобретает линейку продуктов Atmel Serial Flash |
| NM25Q128EV | Nor_mem | 128 МБ | Не тестируется | Не поддерживается | Не тестируется | SFDP может прочитать информацию и идентифицировать ее как более 32 ГБ. |
| P25D40H | Пуя | 4 МБ | Не тестируется | поддерживать | Не тестируется | Шан |
| P25Q80H | Пуя | 8 МБ | Не тестируется | поддерживать | Не тестируется | Шан |
ПРИМЕЧАНИЕ. В режиме QSPI двойное проводное значение означает быстрое чтение двойного провода, а четырехпроводной поддержки Faste Faster Reading.
Вообще говоря, Flash, которая поддерживает быстрое чтение с четырьмя строками, также поддерживает быстрое чтение с двумя строками.
Давайте сначала объясним структуру, в основном используемая в этой библиотеке sfud_flash . Его определение расположено в /sfud/inc/sfud_def.h . Каждая вспышка SPI будет соответствовать структуре, а указатель структуры в совокупности называется объектом Flash Device. После того, как инициализация будет успешной, общие параметры вспышки SPI будут храниться в структуре sfud_flash->chip . Если SPI Flash также поддерживает SFDP, вы также можете увидеть более полную информацию о параметрах через sfud_flash->sfdp . Многие из следующих функций будут использовать объект Flash Device в качестве первого параметра записи для реализации операций на указанной Flash SPI.
sfud_device_init будет вызвана для инициализации всех устройств в таблице Flash Device. Если есть только одна вспышка, вы можете использовать sfud_device_init только для одной инициализации.
Примечание . Инициализированная вспышка SPI была неписана по умолчанию. Если вам нужно включить защиту от записи, используйте функцию SFUD_WRITE_STATUS для изменения состояния вспышки SPI.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| параметр | описывать |
|---|---|
| вспышка | Flash Device для инициализации |
Когда SFUD включает режим QSPI, драйвер Flash в SFUD поддерживает связь с использованием шины QSPI. По сравнению с традиционным режимом SPI, использование QSPI может ускорить считывание данных Flash. Однако, когда необходимо записать данные, скорость написания данных самой вспышки медленнее, чем скорость передачи SPI, поэтому скорость написания данных в режиме QSPI значительно не улучшается.
Следовательно, поддержка SFUD режима QSPI ограничена командами быстрого чтения. Эта функция позволяет настроить фактическую максимальную ширину линии передачи данных в автобусе QSPI, используемой Flash, например: 1 Line (по умолчанию, то есть традиционный режим SPI), 2 строки и 4 строки.
После настройки SFUD объединит в данный момент установленную ширину линии данных шины QSPI, чтобы соответствовать наиболее подходящей и быстрой команде быстрого чтения в таблице информации о расширении Flash Flash. После этого, когда пользователь вызывает sfud_read (), он будет использовать функцию передачи режима QSPI для отправки команды.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| параметр | описывать |
|---|---|
| вспышка | Вспышки |
| data_line_width | Максимальная ширина линии данных, поддерживаемая шиной QSPI, например: 1, 2, 4 |
Таблица Flash Device определена в файле конфигурации SFUD, который отвечает за хранение всех объектов Flash Device, поэтому SFUD поддерживает несколько флеш -устройств для одновременного управления. Конфигурация таблицы устройств определена в макросе SFUD_FLASH_DEVICE_TABLE в /sfud/inc/sfud_cfg.h . Для получения подробных методов конфигурации см. 2,3 Метод конфигурации Flash). Этот метод возвращает объект Flash Device, индексируя флэш -устройство в таблице устройств и возвращает NULL за пределами диапазона таблиц устройств.
sfud_flash * sfud_get_device ( size_t index )| параметр | описывать |
|---|---|
| индекс | Значение индекса флэш -устройства, расположенного в таблице Flash Device |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| Адр | Начальный адрес |
| размер | Общий размер данных считывается с начального адреса |
| данные | Прочитать данные |
ПРИМЕЧАНИЕ. Операция стирания будет выровена в соответствии с гранулярностью стирания флэш-чипа (подробности см. В разделе «Обычно размер блока». После завершения инициализации вы можете просмотреть его через
sfud_flash->chip.erase_gran). Пожалуйста, будьте осторожны, чтобы убедиться, что стартовый адрес и размер данных стирается в соответствии с гранулярностью стирания флэш -чипа. В противном случае, после выполнения операции стирания, другие данные будут потеряны.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| Адр | Начальный адрес |
| размер | Общий размер стирания данных с начального адреса |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| Адр | Начальный адрес |
| размер | Общий размер данных, написанных с начального адреса |
| данные | Данные будут написаны |
ПРИМЕЧАНИЕ. Операция стирания будет выровена в соответствии с гранулярностью стирания флэш-чипа (подробности см. В разделе «Обычно размер блока». После завершения инициализации вы можете просмотреть его через
sfud_flash->chip.erase_gran). Пожалуйста, будьте осторожны, чтобы убедиться, что стартовый адрес и размер данных стирается в соответствии с гранулярностью стирания флэш -чипа. В противном случае, после выполнения операции стирания, другие данные будут потеряны.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| Адр | Начальный адрес |
| размер | Общий размер данных, написанных с начального адреса |
| данные | Данные будут написаны |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| статус | Значение реестра текущего состояния |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| параметр | описывать |
|---|---|
| вспышка | Объект флэш -устройства |
| is_volatile | Легко ли пропустить? Правда: легко пропустить, и будет потеряно после отключения электроэнергии |
| статус | Значение реестра текущего состояния |
Все конфигурации расположены в /sfud/inc/sfud_cfg.h . Пожалуйста, обратитесь к введению конфигурации ниже, чтобы выбрать конфигурацию, которая соответствует вашему проекту.
Включите/выключение SFUD_DEBUG_MODE
Включите/выключение SFUD_USING_SFDP Определение макроса
ПРИМЕЧАНИЕ. После закрытия будет запрошена только таблица информации о флэш -информацию, предоставленную библиотекой в
/sfud/inc/sfud_flash_def.h. Хотя это снизит адаптацию программного обеспечения, это уменьшит объем кода.
Включите/выключите определение макроса SFUD_USING_FAST_READ . Многие режимы чтения Flash могут не соответствовать более высокой частоте SPI (для получения подробной информации, пожалуйста, обратитесь к характеристикам обмена листа данных каждой вспышки), и режим быстрого чтения должен быть включен.
Примечание. Поскольку режим быстрого чтения вводит нулевый байт по умолчанию при чтении, он может быть медленнее, чем режим чтения, когда скорость SPI более медленнее.
Включите/OFF SFUD_USING_FLASH_INFO_TABLE
ПРИМЕЧАНИЕ. После закрытия эта библиотека будет управлять только вспышкой, которая поддерживает спецификации SFDP, что также будет надлежащим образом сократить количество кода. Кроме того, два макро -определения 2.3.2 и 2.3.3 определяют хотя бы один из них, и они также могут быть выбраны обоими способами.
Чтобы дополнительно уменьшить количество кода, SFUD_USING_SFDP и SFUD_USING_FLASH_INFO_TABLE также не могут быть не определены .
В настоящее время просто укажите параметры Flash при определении устройства Flash, а затем вызовите sfud_device_init для инициализации устройства. См. Следующий код:
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 );
...... Если в продукте есть несколько вспышек, вы можете добавить таблицу Flash Device. Измените макрос определение SFUD_FLASH_DEVICE_TABLE , пример заключается в следующем:
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"},
} Вышеуказанное определяет два вспышки (одного из большинства продуктов достаточно). Названия двух устройств: "W25Q64CV" и "GD25Q64B" , соответствующие двум именам устройств SPI "SPI1" и "SPI3" соответственно (он будет использоваться при миграции интерфейса SPI, расположенного в /sfud/port/sfud_port.c ). Два перечисления SFUD_W25Q16CV_DEVICE_INDEX и SFUD_GD25Q64B_DEVICE_INDEX определяют индекс двух устройств в таблице устройства. Вы можете получить таблицу устройства через метод sfud_get_device_table() , а затем получить доступ к указанному устройству с помощью этого значения индекса.
Включите/выключено определение макроса SFUD_USING_QSPI
При включении SFUD также будет поддерживать Flash подключенную с помощью шины QSPI.
Файл порта расположен в /sfud/port/sfud_port.c . Метод sfud_err sfud_spi_port_init(sfud_flash *flash) в файле - это метод порта, предоставляемый библиотекой. Он завершает конфигурацию драйверов чтения и записи SPI (требуется), времена повторной вершины (требуется), интерфейс повторного повторного риска (необязательно) и блокировки SPI (необязательно). Для получения более подробного содержимого порта вы можете обратиться к портативным файлам каждой платформы в демонстрации.
Здесь вам нужно изменить /sfud/inc/sfdu_flash_def.h sfdu_flash_def.h. См. Определение макроса SFUD_FLASH_CHIP_TABLE для всех поддерживаемых вспышек. Параметры вспышки, которые необходимо заранее подготовлены: | Имя | Идентификатор производителя | Тип идентификатор | Идентификатор емкости | Емкость | Режим записи | Стереть гранулярность (минимальная единица стирания) | Стереть гранулярность соответствующей команды | Полем Здесь мы принимаем вспышку GD25Q64B с Gigadevice в качестве примера.
Эта вспышка является ранней моделью инноваций Gioyi, поэтому она не поддерживает стандарт SFDP. Во -первых, вам нужно загрузить его лист данных и найти три идентификатора, возвращаемых командой 0x9F. Здесь вам нужны последние два байта, а именно type id и capacity id . GD25Q64B соответствует этим двум идентификаторам: 0x40 и 0x17 соответственно. Другие параметры вспышки, необходимые выше, можно найти в листе данных. Здесь мы сосредоточимся на режиме написания . Этот параметр предоставляется самой библиотекой. Есть 4 типа режимов записи. Для получения подробной информации, пожалуйста, обратитесь к типу перечисления sfud_write_mode в верхней части файла. Одна же вспышка может поддерживать несколько режимов записи одновременно, в зависимости от ситуации. Для GD25Q64B поддерживаемый режим записи должен быть SFUD_WM_PAGE_256B , то есть записать 1-256 байтов на страницу. В сочетании с вышеуказанными параметрами вспышки GD25Q64B должны быть следующими:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Добавьте его в конце определения макроса SFUD_FLASH_CHIP_TABLE , чтобы завершить поддержку библиотеки GD25Q64B .
В настоящее время он поддерживает демонстрации на следующих платформах
| путь | Описание платформы |
|---|---|
| /demo/stm32f10x_non_os | STM32F10x Bare Metal платформа |
| /demo/stm32f2xx_rtt | Платформа операционной системы STM32F2XX + RT-Thread |
| /demo/stm32l475_non_os_qspi | STM32L475 + режим QSPI Bare Metal Platform |
| /demo/esp32_ext_spi_flash | ESP32C3 + SPI Внешняя вспышка ESP-IDF Framework |
Используйте протокол MIT с открытым исходным кодом. Пожалуйста, прочитайте содержимое файла лицензии в проекте для получения подробной информации.