SFUD هي مكتبة سائق Universal SPI Flash SPI مفتوحة المصدر. نظرًا لوجود العديد من أنواع الفلاش التسلسلي في السوق ، فإن مواصفات وأوامر كل فلاش مختلفة. تم تصميم SFUD لحل الاختلافات الحالية في هذه الهبات ، مما يسمح لمنتجاتنا بدعم وميض العلامات التجارية والمواصفات المختلفة ، وتحسين قابلية إعادة استخدام البرامج التي تتضمن وظائف وميض ، وفي الوقت نفسه ، يمكنها أيضًا تجنب المخاطر التي يتم تقديمها إلى المنتج عن طريق التخلص من الخزن أو إيقافها.
/sfud/inc/sfud_flash_def.h ). إذا لم يكن مدعومًا ، فيمكنك إضافة معلومات المعلمة الخاصة بهذا الفلاش في ملف التكوين (انظر Flash الذي لا يتم دعمه حاليًا في المكتبة 2.5 للحصول على التفاصيل). بعد الحصول على مواصفات الفلاش ، يمكن تحقيق جميع العمليات على الفلاش. يوضح الجدول التالي جميع الهبات التي تم اختبارها في الوقت الفعلي على النظام التجريبي. تم تحديد فلاش لا يدعم معيار SFDP في جدول معلومات معلمة Flash. يجب تحسين وصيانة المزيد من الفلاش الذي لا يدعم معيار SFDP في المستقبل (GitHub | Oschina | الترميز) .
إذا كنت تعتقد أن هذا المشروع المفتوح المصدر رائع ، فيمكنك النقر فوق Star في الزاوية اليمنى العليا من الصفحة الرئيسية للمشروع والتوصية به لمزيد من الأصدقاء المحتاجين.
| نموذج | الشركة المصنعة | سعة | السرعة القصوى | معيار SFDP | وضع QSPI | ملاحظة |
|---|---|---|---|---|---|---|
| W25Q40BV | وينبوند | 4 ميجابايت | 50 ميجا هرتز | غير مدعوم | خط مزدوج | تم إيقاف الإنتاج |
| W25Q80DV | وينبوند | 8 ميجابايت | 104 ميجا هرتز | يدعم | خط مزدوج | |
| W25Q16BV | وينبوند | 16 ميجابايت | 104 ميجا هرتز | غير مدعوم | خط مزدوج | بواسطة Slippersstree |
| W25Q16CV | وينبوند | 16 ميجابايت | 104 ميجا هرتز | يدعم | لم يتم اختباره | |
| W25Q16DV | وينبوند | 16 ميجابايت | 104 ميجا هرتز | يدعم | لم يتم اختباره | بواسطة Slippersstree |
| W25Q32BV | وينبوند | 32 ميجابايت | 104 ميجا هرتز | يدعم | خط مزدوج | |
| W25Q64CV | وينبوند | 64 ميجابايت | 80MHz | يدعم | أربعة خط | |
| W25Q128BV | وينبوند | 128 ميجابايت | 104 ميجا هرتز | يدعم | أربعة خط | |
| W25Q256FV | وينبوند | 256 ميجابايت | 104 ميجا هرتز | يدعم | أربعة خط | |
| MX25L3206E | Macronix | 32 ميجابايت | 86MHz | يدعم | خط مزدوج | |
| MX25L3233F | Macronix | 32 ميجابايت | 133 ميجا هرتز | يدعم | لم يتم اختباره | بواسطة Jiapengli |
| KH25L4006E | Macronix | 4 ميجابايت | 86MHz | يدعم | لم يتم اختباره | بواسطة Jiapengli |
| KH25L3206E | Macronix | 32 ميجابايت | 86MHz | يدعم | خط مزدوج | |
| SST25VF016B | رقاقة | 16 ميجابايت | 50 ميجا هرتز | غير مدعوم | غير مدعوم | تم الحصول على SST بواسطة Microchip |
| M25P40 | ميكرون | 4 ميجابايت | 75 ميجا هرتز | غير مدعوم | لم يتم اختباره | بواسطة Redoccheng |
| M25P80 | ميكرون | 8 ميجابايت | 75 ميجا هرتز | غير مدعوم | لم يتم اختباره | بواسطة Redoccheng |
| M25P32 | ميكرون | 32 ميجابايت | 75 ميجا هرتز | غير مدعوم | غير مدعوم | |
| EN25Q32B | eon | 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 | esmt | 4 ميجابايت | 100 ميجا هرتز | غير مدعوم | غير مدعوم | |
| PCT25VF016B | معاهدة التعاون بشأن البراءات | 16 ميجابايت | 80MHz | غير مدعوم | غير مدعوم | سيتم تحديد ترخيص SST على أنه SST25VF016B |
| AT45DB161E | أديستو | 16 ميجابايت | 85 ميجا هرتز | غير مدعوم | غير مدعوم | Adesto يكتسب خط إنتاج فلاش Atmel Serial |
| NM25Q128EV | NOR_MEM | 128 ميجابايت | لم يتم اختباره | غير مدعوم | لم يتم اختباره | قد يقرأ SFDP المعلومات وتحديدها على أنها أكثر من 32 جيجابايت. |
| P25D40H | بويا | 4 ميجابايت | لم يتم اختباره | يدعم | لم يتم اختباره | بقلم شان |
| P25Q80H | بويا | 8 ميجابايت | لم يتم اختباره | يدعم | لم يتم اختباره | بقلم شان |
ملاحظة: في وضع QSPI ، تعني الأسلاك المزدوجة دعم القراءة السريعة ذات الأسلاك المزدوجة ، وربعة سلك تعني دعم القراءة السريعة ذات الأربعة أسلاك.
بشكل عام ، يدعم Flash ، التي تدعم القراءة السريعة المكونة من أربعة أسطر ، القراءة السريعة ذات الخطين.
دعنا أولاً نشرح بنية تستخدم بشكل أساسي في هذه المكتبة sfud_flash . يقع تعريفه في /sfud/inc/sfud_def.h . سوف يتوافق كل فلاش SPI مع هيكل ، ويشار إلى مؤشر الهيكل مجتمعة باسم كائن جهاز الفلاش. بعد النجاح في التهيئة ، سيتم تخزين معلمات فلاش SPI الشائعة في بنية sfud_flash->chip . إذا كان SPI Flash يدعم SFDP أيضًا ، فيمكنك أيضًا رؤية معلومات معلمة أكثر شمولاً من خلال sfud_flash->sfdp . ستستخدم العديد من الوظائف التالية كائن جهاز Flash كمعلمة إدخال أول لتنفيذ العمليات على فلاش SPI المحدد.
سيتم استدعاء sfud_device_init لتهيئة جميع الأجهزة في جدول جهاز الفلاش. إذا كان هناك فلاش واحد فقط ، فيمكنك استخدام sfud_device_init للتهيئة المفردة فقط.
ملاحظة : لم يتم تحميص فلاش SPI المهيئة بشكل افتراضي. إذا كنت بحاجة إلى تمكين الكتابة ، فيرجى استخدام وظيفة SFUD_WRITE_STATUS لتعديل حالة فلاش SPI.
sfud_err sfud_init ( void ) sfud_err sfud_device_init ( sfud_flash * flash )| المعلمة | يصف |
|---|---|
| فلاش | جهاز فلاش يتم تهيئته |
عندما يقوم SFUD بتشغيل وضع QSPI ، يدعم برنامج تشغيل الفلاش في SFUD الاتصالات باستخدام ناقل QSPI. بالمقارنة مع وضع SPI التقليدي ، يمكن أن يؤدي استخدام QSPI إلى تسريع قراءة بيانات الفلاش. ومع ذلك ، عندما تحتاج البيانات إلى كتابة البيانات ، تكون سرعة كتابة البيانات في فلاش نفسها أبطأ من سرعة نقل SPI ، وبالتالي فإن سرعة كتابة البيانات في وضع QSPI لم يتم تحسينها بشكل كبير.
لذلك ، يقتصر دعم SFUD لوضع QSPI على أوامر القراءة السريعة. تتيح لك هذه الوظيفة تكوين عرض خط البيانات الأقصى المدعوم الفعلي لناقل QSPI المستخدم بواسطة Flash ، مثل: خط واحد (أي افتراضي ، هو وضع SPI التقليدي) ، خط 2 ، وخط 4.
بعد الإعداد ، ستجمع SFUD عرض خط بيانات ناقل QSPI المحدد حاليًا لمطابقة الأمر الأكثر ملاءمة وأسرع قراءة سريعة في جدول معلومات تمديد فلاش QSPI. بعد ذلك ، عندما يقوم المستخدم باستدعاء 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 في ملف تكوين SFUD ، وهو مسؤول عن تخزين جميع كائنات جهاز الفلاش لاستخدامها ، لذلك يدعم SFUD أجهزة فلاش متعددة ليتم قيادتها في وقت واحد. يتم تعريف تكوين جدول الجهاز في الماكرو SFUD_FLASH_DEVICE_TABLE في /sfud/inc/sfud_cfg.h . لطرق التكوين التفصيلية ، راجع 2.3 طريقة التكوين فلاش). تقوم هذه الطريقة بإرجاع كائن جهاز Flash عن طريق فهرسة جهاز الفلاش في جدول الجهاز ، ويعيد NULL إلى ما وراء نطاق جدول الجهاز.
sfud_flash * sfud_get_device ( size_t index )| المعلمة | يصف |
|---|---|
| فِهرِس | قيمة الفهرس لجهاز الفلاش الموجود في جدول جهاز الفلاش |
sfud_err sfud_read ( const sfud_flash * flash , uint32_t addr , size_t size , uint8_t * data )| المعلمة | يصف |
|---|---|
| فلاش | كائن جهاز فلاش |
| addr | عنوان البدء |
| مقاس | حجم البيانات الإجمالية قراءة من عنوان البدء |
| بيانات | قراءة البيانات |
ملاحظة: سيتم محاذاة عملية المحو وفقًا لمحو الحبيبات في شريحة الفلاش (انظر ورقة بيانات الفلاش للحصول على التفاصيل ، بشكل عام حجم الكتلة. بعد اكتمال التهيئة ، يمكنك عرضها من خلال
sfud_flash->chip.erase_gran). يرجى توخي الحذر لضمان محاذاة عنوان البدء وحجم البيانات المحو وفقًا لمحو الحبيبات في شريحة الفلاش. خلاف ذلك ، بعد إجراء عملية مسح ، سيتم فقدان بيانات أخرى.
sfud_err sfud_erase ( const sfud_flash * flash , uint32_t addr , size_t size )| المعلمة | يصف |
|---|---|
| فلاش | كائن جهاز فلاش |
| addr | عنوان البدء |
| مقاس | الحجم الإجمالي لمحو البيانات من عنوان البداية |
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 )| المعلمة | يصف |
|---|---|
| فلاش | كائن جهاز فلاش |
| addr | عنوان البدء |
| مقاس | إجمالي حجم البيانات المكتوبة من عنوان البدء |
| بيانات | البيانات المراد كتابة |
ملاحظة: سيتم محاذاة عملية المحو وفقًا لمحو الحبيبات في شريحة الفلاش (انظر ورقة بيانات الفلاش للحصول على التفاصيل ، بشكل عام حجم الكتلة. بعد اكتمال التهيئة ، يمكنك عرضها من خلال
sfud_flash->chip.erase_gran). يرجى توخي الحذر لضمان محاذاة عنوان البدء وحجم البيانات المحو وفقًا لمحو الحبيبات في شريحة الفلاش. خلاف ذلك ، بعد إجراء عملية مسح ، سيتم فقدان بيانات أخرى.
sfud_err sfud_erase_write ( const sfud_flash * flash , uint32_t addr , size_t size , const uint8_t * data )| المعلمة | يصف |
|---|---|
| فلاش | كائن جهاز فلاش |
| addr | عنوان البدء |
| مقاس | إجمالي حجم البيانات المكتوبة من عنوان البدء |
| بيانات | البيانات المراد كتابة |
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 تعريف الماكرو
قم بتشغيل/OFF SFUD_USING_SFDP تعريف الماكرو
ملاحظة: بعد الإغلاق ، سيتم الاستعلام عن جدول معلومات الفلاش فقط الذي توفره المكتبة في
/sfud/inc/sfud_flash_def.h. على الرغم من أن هذا سيقلل من القدرة على تكييف البرنامج ، إلا أنه سيقلل من كمية التعليمات البرمجية.
قم بتشغيل/إيقاف تشغيل تعريف الماكرو SFUD_USING_FAST_READ . قد لا تلبي العديد من أوضاع قراءة الفلاش تردد SPI الأعلى (للحصول على التفاصيل ، يرجى الرجوع إلى خصائص تبادل ورقة البيانات لكل فلاش) ، ويجب تمكين وضع القراءة السريعة.
ملاحظة: نظرًا لأن وضع القراءة السريعة يقوم بإدراج بايت فارغ افتراضي عند القراءة ، فقد يكون أبطأ من وضع القراءة عندما يكون معدل SPI أبطأ.
قم بتشغيل/OFF SFUD_USING_FLASH_INFO_TABLE تعريف الماكرو
ملاحظة: بعد الإغلاق ، ستقود هذه المكتبة فلاش فقط التي تدعم مواصفات SFDP ، والتي ستقلل أيضًا من كمية الرمز بشكل مناسب. بالإضافة إلى ذلك ، يحدد التعريفان الكليان من 2.3.2 و 2.3.3 واحدة على الأقل واحدة منها ، ويمكن أيضًا اختيارهما في كلا الاتجاهين.
من أجل زيادة تقليل كمية الكود ، قد لا يتم تحديد SFUD_USING_SFDP و SFUD_USING_FLASH_INFO_TABLE .
في هذا الوقت ، فقط حدد معلمات الفلاش عند تحديد جهاز الفلاش ، ثم اتصل بـ 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. تعديل تعريف الماكرو لـ 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() ، ثم الوصول إلى الجهاز المحدد مع قيمة الفهرس هذه.
قم بتشغيل/OFF SFUD_USING_QSPI تعريف الماكرو
عند تمكينه ، ستدعم SFUD أيضًا Flash متصلًا باستخدام ناقل QSPI.
يقع ملف المنفذ في /sfud/port/sfud_port.c . طريقة sfud_err sfud_spi_port_init(sfud_flash *flash) في الملف هي طريقة منفذ توفرها المكتبة. إنه يكمل تكوين برامج القراءة والكتابة (المطلوبة) ، وأوقات إعادة المحاولة (المطلوبة) ، وواجهة إعادة المحاولة (اختياري) وأقفال SPI (اختياري). لمزيد من محتوى النقل التفصيلي ، يمكنك الرجوع إلى ملفات نقل كل منصة في العرض التوضيحي.
هنا تحتاج إلى تعديل /sfud/inc/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 المعدنية العارية |
| /DEMO/STM32F2XX_RTT | STM32F2XX + RT-THREAD نظام التشغيل |
| /DEMO/STM32L475_NON_OS_QSPI | STM32L475 + QSPI Mode Platform المعدنية العارية |
| /demo/esp32_ext_spi_flash | ESP32C3 + SPI Flash Flash Framework |
استخدم بروتوكول معهد ماساتشوستس للتكنولوجيا مفتوح المصدر. يرجى قراءة محتويات ملف الترخيص في المشروع للحصول على التفاصيل.