SFUD adalah perpustakaan driver universal SPI Flash Sumber Sumber Open Source. Karena ada banyak jenis flash serial di pasaran, spesifikasi dan perintah masing -masing flash berbeda. SFUD dirancang untuk memecahkan perbedaan saat ini dalam kilatan ini, memungkinkan produk kami untuk mendukung kilat merek dan spesifikasi yang berbeda, meningkatkan penggunaan kembali dan skalabilitas perangkat lunak yang melibatkan fungsi flash, dan pada saat yang sama, ia juga dapat menghindari risiko yang dibawa ke produk dengan stok atau penghentian flash.
/sfud/inc/sfud_flash_def.h ). Jika tidak didukung, Anda dapat menambahkan informasi parameter flash ini di file konfigurasi (lihat flash yang saat ini tidak didukung di pustaka penambahan 2.5 untuk detail). Setelah mendapatkan spesifikasi flash, semua operasi pada flash dapat dicapai. Tabel berikut menunjukkan semua kilatan yang telah diuji secara real-time pada platform demo. Flash yang tidak mendukung standar SFDP telah didefinisikan dalam tabel informasi parameter Flash. Lebih banyak flash yang tidak mendukung standar SFDP perlu ditingkatkan dan dipelihara di masa depan (GitHub | Oschina | coding) .
Jika Anda berpikir proyek open source ini hebat, Anda dapat mengklik Star di sudut kanan atas beranda proyek dan merekomendasikannya kepada lebih banyak teman yang membutuhkan.
| model | Pabrikan | kapasitas | Kecepatan maksimum | Standar SFDP | Mode QSPI | Komentar |
|---|---|---|---|---|---|---|
| W25Q40BV | Winbond | 4MB | 50MHz | Tidak didukung | Garis ganda | Produksi telah dihentikan |
| W25Q80DV | Winbond | 8MB | 104MHz | mendukung | Garis ganda | |
| W25Q16BV | Winbond | 16MB | 104MHz | Tidak didukung | Garis ganda | oleh slipperstree |
| W25Q16CV | Winbond | 16MB | 104MHz | mendukung | Tidak diuji | |
| W25Q16DV | Winbond | 16MB | 104MHz | mendukung | Tidak diuji | oleh slipperstree |
| W25Q32BV | Winbond | 32MB | 104MHz | mendukung | Garis ganda | |
| W25Q64CV | Winbond | 64MB | 80MHz | mendukung | Empat baris | |
| W25Q128BV | Winbond | 128MB | 104MHz | mendukung | Empat baris | |
| W25Q256FV | Winbond | 256MB | 104MHz | mendukung | Empat baris | |
| MX25L3206E | Macronix | 32MB | 86MHz | mendukung | Garis ganda | |
| MX25L3233F | Macronix | 32MB | 133MHz | mendukung | Tidak diuji | oleh Jiapengli |
| KH25L4006E | Macronix | 4MB | 86MHz | mendukung | Tidak diuji | oleh Jiapengli |
| KH25L3206E | Macronix | 32MB | 86MHz | mendukung | Garis ganda | |
| SST25VF016B | Microchip | 16MB | 50MHz | Tidak didukung | Tidak didukung | SST telah diakuisisi oleh Microchip |
| M25p40 | Mikron | 4MB | 75MHz | Tidak didukung | Tidak diuji | oleh Redoccheng |
| M25p80 | Mikron | 8MB | 75MHz | Tidak didukung | Tidak diuji | oleh Redoccheng |
| M25p32 | Mikron | 32MB | 75MHz | Tidak didukung | Tidak didukung | |
| EN25Q32B | KEABADIAN | 32MB | 104MHz | Tidak didukung | Tidak diuji | |
| GD25Q16B | Gigadevice | 16MB | 120MHz | Tidak didukung | Tidak diuji | oleh Tanekliang |
| GD25Q32C | Gigadevice | 32MB | 120MHz | Tidak didukung | Tidak diuji | oleh Gaupen1186 |
| GD25Q64B | Gigadevice | 64MB | 120MHz | Tidak didukung | Garis ganda | |
| S25FL216K | Cypress | 16MB | 65MHz | Tidak didukung | Garis ganda | |
| S25FL032P | Cypress | 32MB | 104MHz | Tidak didukung | Tidak diuji | oleh YC_911 |
| S25FL164K | Cypress | 64MB | 108MHz | mendukung | Tidak diuji | |
| A25L080 | Amic | 8MB | 100MHz | Tidak didukung | Garis ganda | |
| A25LQ64 | Amic | 64MB | 104MHz | mendukung | mendukung | |
| F25L004 | Esmt | 4MB | 100MHz | Tidak didukung | Tidak didukung | |
| PCT25VF016B | Pct | 16MB | 80MHz | Tidak didukung | Tidak didukung | Lisensi SST akan diidentifikasi sebagai SST25VF016B |
| AT45DB161E | Adesto | 16MB | 85MHz | Tidak didukung | Tidak didukung | Adesto Mengakuisisi Lini Produk Flash Serial Atmel |
| NM25Q128EV | NOR_MEM | 128MB | Tidak diuji | Tidak didukung | Tidak diuji | SFDP dapat membaca informasi dan mengidentifikasinya lebih dari 32GB. |
| P25D40H | Puya | 4MB | Tidak diuji | mendukung | Tidak diuji | oleh Shan |
| P25Q80H | Puya | 8MB | Tidak diuji | mendukung | Tidak diuji | oleh Shan |
Catatan: Dalam mode QSPI, kawat ganda berarti mendukung pembacaan cepat kawat ganda, dan empat-kawat berarti mendukung pembacaan cepat empat kawat.
Secara umum, Flash, yang mendukung pembacaan cepat empat baris, juga mendukung pembacaan cepat dua baris.
Pertama -tama mari kita jelaskan struktur yang terutama digunakan di perpustakaan ini sfud_flash . Definisi ini terletak di /sfud/inc/sfud_def.h . Setiap flash SPI akan sesuai dengan struktur, dan pointer struktur secara kolektif disebut sebagai objek perangkat flash. Setelah inisialisasi berhasil, parameter flash SPI umum akan disimpan dalam struktur sfud_flash->chip . Jika SPI Flash juga mendukung SFDP, Anda juga dapat melihat informasi parameter yang lebih komprehensif melalui sfud_flash->sfdp . Banyak fungsi berikut akan menggunakan objek perangkat flash sebagai parameter entri pertama untuk mengimplementasikan operasi pada flash SPI yang ditentukan.
sfud_device_init akan dipanggil untuk menginisialisasi semua perangkat di tabel perangkat flash. Jika hanya ada satu flash, Anda dapat menggunakan sfud_device_init hanya untuk inisialisasi tunggal.
Catatan : Flash SPI yang diinisialisasi telah dilindungi tanpa penulisan secara default. Jika Anda perlu mengaktifkan proteksi tulis, silakan gunakan fungsi sfud_write_status untuk memodifikasi status flash SPI.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| parameter | menggambarkan |
|---|---|
| kilatan | Perangkat flash untuk diinisialisasi |
Ketika SFUD menyalakan mode QSPI, driver flash di SFUD mendukung komunikasi menggunakan bus QSPI. Dibandingkan dengan mode SPI tradisional, menggunakan QSPI dapat mempercepat pembacaan data flash. Namun, ketika data perlu ditulis, kecepatan penulisan data flash itu sendiri lebih lambat dari kecepatan transmisi SPI, sehingga kecepatan penulisan data dalam mode QSPI tidak ditingkatkan secara signifikan.
Oleh karena itu, dukungan SFUD untuk mode QSPI terbatas pada perintah baca cepat. Fungsi ini memungkinkan Anda untuk mengonfigurasi lebar garis data maksimum yang didukung aktual dari bus QSPI yang digunakan oleh flash, seperti: 1 baris (default, yaitu, mode SPI tradisional), 2 baris, dan 4 baris.
Setelah pengaturan, SFUD akan menggabungkan lebar saluran data bus QSPI yang saat ini disesuaikan agar sesuai dengan perintah baca cepat yang paling cocok dan tercepat di tabel informasi ekstensi Flash QSPI. Setelah itu, ketika pengguna memanggil sfud_read (), ia akan menggunakan fungsi transmisi mode QSPI untuk mengirim perintah.
sfud_err sfud_qspi_fast_read_enable ( sfud_flash * flash , uint8_t data_line_width )| parameter | menggambarkan |
|---|---|
| kilatan | Perangkat flash |
| data_line_width | Lebar garis data maksimum yang didukung oleh bus QSPI, seperti: 1, 2, 4 |
Tabel perangkat flash didefinisikan dalam file konfigurasi SFUD, yang bertanggung jawab untuk menyimpan semua objek perangkat flash yang akan digunakan, sehingga SFUD mendukung beberapa perangkat flash untuk digerakkan secara bersamaan. Konfigurasi tabel perangkat didefinisikan dalam makro SFUD_FLASH_DEVICE_TABLE di /sfud/inc/sfud_cfg.h . Untuk metode konfigurasi terperinci, lihat 2.3 Metode Konfigurasi Flash). Metode ini mengembalikan objek perangkat flash dengan mengindeks perangkat flash di tabel perangkat, dan mengembalikan NULL di luar rentang tabel perangkat.
sfud_flash * sfud_get_device ( size_t index )| parameter | menggambarkan |
|---|---|
| indeks | Nilai indeks perangkat flash yang terletak di tabel perangkat flash |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| addr | Alamat awal |
| ukuran | Ukuran total data yang dibaca dari alamat start |
| data | Baca data |
Catatan: Operasi penghapusan akan diselaraskan sesuai dengan granularitas penghapusan chip flash (lihat lembar data flash untuk detail, umumnya ukuran blok. Setelah inisialisasi selesai, Anda dapat melihatnya melalui
sfud_flash->chip.erase_gran). Harap berhati -hati untuk memastikan bahwa alamat awal dan ukuran data hapus diselaraskan sesuai dengan granularitas penghapusan chip flash. Kalau tidak, setelah melakukan operasi penghapusan, data lain akan hilang.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| addr | Alamat awal |
| ukuran | Ukuran total penghapusan data dari alamat start |
sfud_err sfud_chip_erase ( const sfud_flash * flash )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
sfud_err sfud_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| addr | Alamat awal |
| ukuran | Ukuran total data yang ditulis dari alamat start |
| data | Data yang akan ditulis |
Catatan: Operasi penghapusan akan diselaraskan sesuai dengan granularitas penghapusan chip flash (lihat lembar data flash untuk detail, umumnya ukuran blok. Setelah inisialisasi selesai, Anda dapat melihatnya melalui
sfud_flash->chip.erase_gran). Harap berhati -hati untuk memastikan bahwa alamat awal dan ukuran data hapus diselaraskan sesuai dengan granularitas penghapusan chip flash. Kalau tidak, setelah melakukan operasi penghapusan, data lain akan hilang.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| addr | Alamat awal |
| ukuran | Ukuran total data yang ditulis dari alamat start |
| data | Data yang akan ditulis |
sfud_err sfud_read_status ( const sfud_flash * flash , uint8_t * status )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| status | Nilai register status saat ini |
sfud_err sfud_write_status ( const sfud_flash * flash , bool is_volatile , uint8_t status )| parameter | menggambarkan |
|---|---|
| kilatan | Objek perangkat flash |
| is_volatile | Apakah mudah dilewatkan? Benar: Mudah dilewatkan, dan akan hilang setelah pemadaman listrik |
| status | Nilai register status saat ini |
Semua konfigurasi terletak di /sfud/inc/sfud_cfg.h . Silakan merujuk ke Konfigurasi Pendahuluan di bawah ini untuk memilih konfigurasi yang sesuai dengan proyek Anda.
Nyalakan/Mati/Mati Definisi Makro SFUD_DEBUG_MODE
Nyalakan/Mati/Mati SFUD_USING_SFDP Definisi makro
Catatan: Setelah ditutup, hanya tabel informasi flash yang disediakan oleh perpustakaan di
/sfud/inc/sfud_flash_def.hyang akan ditanya. Meskipun ini akan mengurangi kemampuan beradaptasi dari perangkat lunak, itu akan mengurangi jumlah kode.
Nyalakan/keluarkan definisi makro SFUD_USING_FAST_READ . Banyak mode baca flash mungkin tidak memenuhi frekuensi SPI yang lebih tinggi (untuk detail, silakan merujuk ke karakteristik pertukaran lembar data dari setiap flash), dan mode baca cepat perlu diaktifkan.
Catatan: Karena mode baca cepat menyisipkan byte nol default saat membaca, mungkin lebih lambat dari mode baca ketika laju SPI lebih lambat.
Nyalakan/OFF SFUD_USING_FLASH_INFO_TABLE DEFINISI MACRO
Catatan: Setelah ditutup, perpustakaan ini hanya akan mendorong flash yang mendukung spesifikasi SFDP, yang juga akan secara tepat mengurangi jumlah kode. Selain itu, dua definisi makro 2.3.2 dan 2.3.3 mendefinisikan setidaknya satu dari mereka, dan mereka juga dapat dipilih dalam kedua cara.
Untuk lebih mengurangi jumlah kode, SFUD_USING_SFDP dan SFUD_USING_FLASH_INFO_TABLE juga tidak dapat didefinisikan .
Pada saat ini, cukup tentukan parameter flash saat mendefinisikan perangkat flash, lalu hubungi sfud_device_init untuk menginisialisasi perangkat. Lihat kode berikut:
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 );
...... Jika ada beberapa flash dalam produk, Anda dapat menambahkan tabel perangkat flash. Ubah definisi makro SFUD_FLASH_DEVICE_TABLE , contohnya adalah sebagai berikut:
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"},
} Di atas mendefinisikan dua perangkat flash (salah satu dari sebagian besar produk sudah cukup). Nama -nama kedua perangkat tersebut adalah "W25Q64CV" dan "GD25Q64B" , sesuai dengan dua nama perangkat SPI "SPI1" dan "SPI3" masing -masing (akan digunakan saat memigrasi antarmuka SPI, yang terletak di /sfud/port/sfud_port.c ). Dua pencacahan SFUD_W25Q16CV_DEVICE_INDEX dan SFUD_GD25Q64B_DEVICE_INDEX Tentukan indeks kedua perangkat dalam tabel perangkat. Anda dapat memperoleh tabel perangkat melalui metode sfud_get_device_table() , dan kemudian mengakses perangkat yang ditentukan dengan nilai indeks ini.
Nyalakan/Mati/Mati Definisi Makro SFUD_USING_QSPI
Saat diaktifkan, SFUD juga akan mendukung Flash yang terhubung menggunakan bus QSPI.
File port terletak di /sfud/port/sfud_port.c . sfud_err sfud_spi_port_init(sfud_flash *flash) metode dalam file adalah metode port yang disediakan oleh perpustakaan. Ini melengkapi konfigurasi driver baca dan tulis SPI (diperlukan), coba lagi (diperlukan), coba lagi antarmuka (opsional) dan kunci SPI (opsional). Untuk konten porting yang lebih rinci, Anda dapat merujuk ke file porting dari setiap platform dalam demo.
Di sini Anda perlu memodifikasi /sfud/inc/sfdu_flash_def.h . Lihat definisi makro SFUD_FLASH_CHIP_TABLE untuk semua kilatan yang didukung. Parameter flash yang perlu disiapkan terlebih dahulu adalah: | Nama | ID Pabrikan | Ketik id | ID kapasitas | Kapasitas | Mode Tulis | Hapus Granularity (unit minimum penghapusan) | Hapus Granularity Commanding Command | . Di sini kami mengambil flash GD25Q64B dengan Gigadevice sebagai contoh.
Flash ini adalah model inovasi Gioyi yang diproduksi awal, sehingga tidak mendukung standar SFDP. Pertama, Anda perlu mengunduh lembar datanya dan menemukan tiga ID yang dikembalikan oleh perintah 0x9f. Di sini Anda memerlukan ID dua byte terakhir, yaitu type id dan capacity id . GD25Q64B sesuai dengan dua ID ini: masing -masing 0x40 dan 0x17 . Parameter flash lain yang diperlukan di atas dapat ditemukan di lembar data. Di sini kita akan fokus pada mode penulisan . Parameter ini disediakan oleh perpustakaan itu sendiri. Ada 4 jenis mode penulisan. Untuk detailnya, silakan merujuk ke jenis enumerasi sfud_write_mode di bagian atas file. Flash yang sama dapat mendukung beberapa mode penulisan secara bersamaan, tergantung pada situasinya. Untuk GD25Q64B , mode penulisan yang didukung harus SFUD_WM_PAGE_256B , yaitu, tulis 1-256 byte per halaman. Dikombinasikan dengan parameter flash GD25Q64B di atas harus sebagai berikut:
{"GD25Q64B", SFUD_MF_ID_GIGADEVICE, 0x40, 0x17, 8*1024*1024, SFUD_WM_PAGE_256B, 4096, 0x20},
Tambahkan ke akhir definisi makro SFUD_FLASH_CHIP_TABLE untuk menyelesaikan dukungan perpustakaan untuk GD25Q64B .
Saat ini, telah mendukung demo di bawah platform berikut
| jalur | Deskripsi platform |
|---|---|
| /demo/stm32f10x_non_os | Platform logam telanjang stm32f10x |
| /demo/stm32f2xx_rtt | Platform Sistem Operasi STM32F2XX + RT-Thread |
| /Demo/STM32L475_NON_OS_QSPI | STM32L475 + Mode Qspi Bare Metal Platform |
| /demo/ESP32_EXT_SPI_FLASH | ESP32C3 + SPI Eksternal Flash ESP-IDF Framework |
Gunakan protokol open source MIT. Harap baca isi file lisensi dalam proyek untuk detailnya.