MyBB Pro

P30-ART


تبلیغات


ارسال موضوع ارسال پاسخ
آموزش کتابخانه FatFs
مهمان گرامی، خوش آمدید!
نام کاربری
گذرواژه‌
[عضویت در انجمن]


جستجوی انجمن‌ها

(جستجوی پیشرفته)

جستجو در گوگل

Google



در اين سايت


درنا بلاگ

سرویس بلاگدهی درنا بلاگ
http://dornablog.com

تبلیغات

آمار انجمن
» اعضا: 3638
» آخرین عضو: alyssarf18
» موضوع‌های انجمن: 159
» ارسال‌های انجمن: 910

آمار کامل

ارسال: #1
۱۳۹۳/۱۲/۲۹, ۱۲:۴۳ عصر
آموزش کتابخانه FatFs

اخرين ورژن اين لايبرري FatFs R0.09 هست که ميتونيد از سايت اين رفيق خوش ذوق ژاپنی مون دانلود کنيد
http://elm-chan.org/fsw/ff/00index_e.html
که داراي کلا 32 تابع اصلي ميباشد توي سايتش اگر دقت کنيد توابع رو کاملا توضيح داده ولي اينجا توضيحات فارسي رو که من خودم ترجمه کردم يا با تکنيک ناز کوشش و خطا ياد گرفتم قرار خواهم داد
چند تا نکته بگم و اون اينکه در توابع بعضي جاها صحبت دراو هست شايد سوالي که به وجود بياد اينه که مگه ما توي مموري درايو داريم اما در جواب بايد بگم که اين توابع کلي بوده و ميتونيد ازشون حتي در ارتباط با ريد يا رايت يه هارد ديسک IDE يا کارت هاي حافظه CF استفاده کنيد که در اين صورت اين قابليت خيلي به درد ميخوره و يا اينکه شما چند مموري داشته باشيد و ....
نقل قول این ارسال در یک پاسخ بازگشت به بالا
تبلیغات
ارسال: #2
۱۳۹۳/۱۲/۲۹, ۱۲:۵۴ عصر
RE: آموزش کتابخانه FatFs

اولين تابع

کد php:
FRESULT f_mount (
  
BYTE  Drive,              /* Logical drive number */
  
FATFS*  FileSystemObject  /* Pointer to the work area */
); 

(تعريف اشاره گر درايو - شماره درايو)f_mount

هست
حالا اين تابع چيه و به چه درد ميخوره؟
براي تعريف و يا پاک کردن پايه اطلاعات يا همان ميز کار يا درايو در ماژول فت هست قبل از خوندن اطلاعات از يه درايو بايد اون درايو رو در فت تعريف کرد.
اگر درايو ديگري انتخاب بشه اون قبليه پاک شده و اين جديده جايگزين خواهد شد مثل اينکه شما بري از ماي کامپيوتر يکي از درايو هارو انتخاب کنيدو توش رو باز کنيد

کجا بايد ازش استفاده کرد؟
کلا قبل از هرنوع خوندن نوشتن و ..... بايد اين دستور استفاده بشه

ورودي و خروجي هاش؟
دوتا ورودي داره
1- اشاره گر درايو FileSystemObject يه اشاره گر به متغيري که بايد قبل از اين تابه از نوع استراکچر FATFS تعريف شده باشه
2- شماره درايو مورد نظر که يک عددي از 0 تا 9 ميتونه باشه
و يه خروجي خطا داره که دو حالت داره
1- FR_OK يعني بدون مشکل انجام گرفت
2- FR_INVALID_DRIVE يعني درايو مورد نظر موجود نبود

نکته: منظور از استراکچر اينه که يه تعداد متغير در يک متغير مثلا وقتي متغيري از نوع FATFS تعريف ميکنيد در واقع ايم متغير ها ار تعريف کرديد لذا دقت کنيد چون به رم بالايي نياز خواهيد داشت

کد php:
typedef struct {
    
BYTE    fs_type;      /* FAT sub-type (0:Not mounted) */
    
BYTE    drv;          /* Physical drive number */
    
BYTE    csize;        /* Sectors per cluster (1,2,4...128) */
    
BYTE    n_fats;       /* Number of FAT copies (1,2) */
    
BYTE    wflag;        /* win[] dirty flag */
    
BYTE    fsi_flag;     /* fsinfo dirty flag */
    
WORD    id;           /* File system mount ID */
    
WORD    n_rootdir;    /* Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
    
WORD    ssize;        /* Sector size (512,1024,2048,4096) */
#endif
#if _FS_REENTRANT
    
_SYNC_t sobj;         /* Identifier of sync object */
#endif
#if !_FS_READONLY
    
DWORD   last_clust;   /* Last allocated cluster */
    
DWORD   free_clust;   /* Number of free clusters */
    
DWORD   fsi_sector;   /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
    
DWORD   cdir;         /* Current directory cluster (0:root) */
#endif
    
DWORD   n_fatent;     /* Number of FAT entries (= number of clusters + 2) */
    
DWORD   fsize;        /* Sectors per FAT */
    
DWORD   fatbase;      /* FAT area start sector */
    
DWORD   dirbase;      /* Root directory area start sector (FAT32: cluster#) */
    
DWORD   database;     /* Data area start sector */
    
DWORD   winsect;      /* Current sector appearing in the win[] */
    
BYTE    win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */
FATFS
براي اطلاع بيشتر در مورد استراکچرها به کتابهاي اموزش C مراجعه کنيد
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #3
۱۳۹۳/۱۲/۲۹, ۱۲:۵۵ عصر
RE: آموزش کتابخانه FatFs

تابع دوم (f_open)

این تابع یک فایل رو باز میکنه یا اینکه یه فایل درست میکنه

کد php:
FRESULT  f_open 
  
FILFileObject,       اشاره گر به ساختار فایل مورد نظر                                                                                 
  
const TCHARFileNameاسم فایل مورد نظر برای باز کردن و یا درست کردن فایل                                              
  BYTE ModeFlags         نوع دسترسی به فایل و روش باز کردن فایل را توسط مقدار دهی  زیر مشخص میکند                    



اگر FA_READ باشه اطلاعات فایل رو فقط میتونیم بخونیم . اگه با FA_WRITE ترکیب بشه خواندن و نوشتن میشه انجام داد
اگر FA_WRITE باشه اطلاعات رو در در فایل فقط میتونیم بنویسیم . اگه با FA_READ ترکیب بشه خواندن و نوشتن میشه انجام داد
اگر FA_OPEN_EXISTING باشه فایل رو باز میکنه. اگه فایل موجود نباشه کار دیگه ای نمیتونه انجام بده
اگر FA_OPEN_ALWAYS باشه و اگر فایل موجود باشه اونرو باز میکنه وگرنه یک فایل جدید با همون اسم درست میکنه
اگر FA_CREATE_NEW باشه یک فایل جدید درست میکنه اگه فایل موجود باشه تابع با FR_EXIST برگشت میخوره.
اگر FA_CREATE_ALWAYS باشه یک فایل جدید درست میکنه و اگر فایل موجود باشه اطلاعات فایل قبلی رو حذف میکنه و دوباره مینویسه


شرح:
فایل آبجکت زمانی تشکیل میشه که تابع موفق باشه .
باید فایلی رو که باز کردیم رو ببندیم با دستور (f_close) و اگه اینکار رو انجام ندیم فایلی رو که اصلاح کردیم اطلاعاتش از بین میره.
و قبل از استفاده از این دستور بایستی شماره درایو رو با دستور (f_mount) ثبت کنیم

مقادیر برگشتی


کد php:
FR_OKFR_DISK_ERRFR_INT_ERRFR_NOT_READYFR_NO_FILEFR_NO_PATHFR_INVALID_NAMEFR_DENIEDFR_EXIST
FR_WRITE_PROTECTEDFR_INVALID_DRIVEFR_NOT_ENABLEDFR_NO_FILESYSTEMFR_TIMEOUTFR_LOCKED
FR_NOT_ENOUGH_COREFR_TOO_MANY_OPEN_FILES 

دستور

کد php:
f_mount(0NULL);            //Unregister work area 

این دستور یعنی از درایو 0 خارج شو یا ببندش
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #4
۱۳۹۳/۱۲/۲۹, ۱۲:۵۹ عصر
RE: آموزش کتابخانه FatFs

تابع دوم

کد php:
FRESULT f_open (
  
FILFileObject,       /* Pointer to the blank file object structure */
  
const TCHARFileName/* Pointer to the file neme */
  
BYTE ModeFlags         /* Mode flags */
); 

(نوع دسترسي , نام فايل , اشاره گر فايل)f_open
هست
حالا اين تابع چيه به چه درد ميخوره؟
براي ايجاد يا باز کردن فايل به کار ميره

کجا بايد ازش استفاده کرد؟
قبل از خوندن يا نوشتن فايل بايد اون فايل حتما باز باشه يا ايجاد شده باشه و يا ايجاد شده و باز بشه

ورودي و خروجي هاش؟
سه تا ورودي داره
1- اشاره گر فايل FileObject يه اشاره گر به متغيري که بايد قبل از اين تابع از نوع استراکچر FIL تعريف شده باشه
2- اشاره گر اسم فايل FileName يه اشاره گر به متغيري که بايد قبل از اين تابع از نوع TCHAR تعريف و مقدا دهي شده باشه البته ميشه مستقيما
هم نام فايل رو در فلش تعريفش کرد يا مثل مثال پايين بصورت مستقيم وارد تابع کرد
3- نوع دسترسي ModeFlags يه متغير از نوع بايت هست که ميتونه 6 حالت مختلف داشته باشه
- FA_READ = 0x01 دسترسي براي فقط خواندن فايل
- FA_WRITE = 0x02 دسترسي براي فقط نوشتن فايل
- FA_OPEN_EXISTING = 0x00 دسترسي فقط براي باز کردن فايل
- FA_OPEN_ALWAYS = 0x10 فايل را در صورتي که وجود ندارد ايجاد ميکند در غير اين صورت از ادرس صفر فايل بازش ميکند
- FA_CREATE_NEW = 0x04 فقط فايل رو ايجاد ميکند در غير اين صورت FR_EXIST باز گردانده خواهد شد
- FA_CREATE_ALWAYS = 0x08 فقط فايل رو ايجاد ميکند در صورت وجود فايل اطلاعات فايل پاک خواهد شد

و يک خروجي خطا داره که 17 حالت داره
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_NO_FILE, FR_NO_PATH, FR_INVALID_NAME, FR_DENIED, FR_EXIST, FR_WRITE_PROTECTED, FR_INVALID_DRIVE, FR_NOT_ENABLED, FR_NO_FILESYSTEM, FR_TIMEOUT, FR_LOCKED, FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES
در مورد اين خطا ها بايد بگم کلا 20 نوع مختلف داره و در توابع مشترک هستند و هر تابه يه تعداد خواصي شو برميگردونه
پس بعد از اين براي خروجي توابع ميتونيد با چک کردن مقدارش بفهميد که تابع چه کاري کرده

- FR_OK = 0x00 عملکرد موفق ي(مشکلي نبوده و تابع به درستي اجرا شده)
- FR_DISK_ERR = 0x01 خطا در توابع ديسک (مشکلي در ارتباط با ديسک به وجود امده است) ديسک وجود ندارد
- FR_INT_ERR = 0x02 خطا در ساختار فت يا سرريز شدن مقادير متغير هاي FATFS يا FIL يا ديگر متغير هاي مرتبط
- FR_NOT_READY = 0x03 خطا در ديسک با لول پايين يا انيشيال نشدن درست ديسک با تابع disk_initialize منظور از لول پايين يعني ديسک وجود دارد ولي ارتباط درست نيست
- FR_NO_FILE = 0x04 فايل وجود ندارد
- FR_NO_PATH = 0x05 مسير داده شده درست نيست
- FR_INVALID_NAME = 0x06 رشته داده به عنوان نام مسير نامعتبر است
- FR_DENIED = 0x07 دسترسي به مورد با توجه به يکي از موارد زير محدود شده است
+ براي فايلي با ويژگي فقط خواندني حالت نوشتن يا باز را بنويسيد
+ حذف فايل يا دايرکتوري با ويژگي فقط خواندني
+ حذف دايرکتوري غير خالي يا دايرکتوري جاري
+ خواندن فايلي که بدون پرچم FA_READ باز شده باشه
+ نوشتن يا تغيير فايلي که بدون پرچم FA_WRITE باز شده باشه
+ ايجاد فايل يا دايرکتوري در درايو پر شده
+ حجم دايرکتوري ايجاد شده بيشتر از حجم خالي درايو باشد
- FR_EXIST = 0x08 اين يعني همنامي يا هر شي که داراي همين نام است و يا در حال حاضر موجود است
- FR_INVALID_OBJECT = 0x09 با توجه به ساختار فايل يا دايرکتوري شي نامعتبر است
- FR_WRITE_PROTECTED = 0x0A حفاظت شده در برابر هرگونه نوشتن
- FR_INVALID_DRIVE = 0x0B شماره درايو انتخاب شده نا معتبر است
- FR_NOT_ENABLED = 0x0C درايو مورد نظر توسط تابع f_mount تعريف نشده است
- FR_NO_FILESYSTEM = 0x0D درايو پارتيشن بندي نشده يا فرمت نا معتبر است
- FR_MKFS_ABORTED = 0x0E اندازه کلاستر براي اين ديسک نامعتبر است و زماني به وجود مي ايد که شماره کلاستر نزديک 0xFF7 يا 0xFFF7 باشد
- FR_TIMEOUT = 0x0F زمان پاسخ گويي به پايان رسيد ولي جوابي نيامد
- FR_LOCKED = 0x10 دسترسي به فايل توسط کنترل به اشتراک گذاري فايل رد شده است
- FR_NOT_ENOUGH_CORE = 0x11 به يکي دلايل زير حافظه به اندازه کافي براي عمليات وجود ندارد
+ بافري براي LFN تعريف نشده است
+ با توجه به اندازه جدول نياز به اندازه کافي است
- FR_TOO_MANY_OPEN_FILES = 0x12 تعداد فايل هاي باز شده به حداکثر رسيده و فايل بيشتر نمي توان باز کرد
- FR_INVALID_PARAMETER = 0x13 پارامتر داده شده نامعتبر است
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #5
۱۳۹۳/۱۲/۲۹, ۰۱:۰۰ عصر
RE: آموزش کتابخانه FatFs

تابع سوم f_close

کد php:
FRESULT f_close (
  
FILFileObject     /* Pointer to the file object structure */
); 

(اشاره گر فايل)f_close
هست
حالا اين تابع چيه و به چه درد ميخوره؟
براي بستن فايل هايي که قبلا باز کرديم به کار ميره

کجا بايد ازش استفاده کرد؟
اگر بعد از استفاده از فايل ديگه نيازي باهاش نباشه بايد فايل رو ببنديد
درصورت نبستن فايل مخصوصا زمان نوشتن احتمال از بيد رفتن اطلاعات فايل وجود دارد

ورودي و خروجي هاش؟
يک ورودي داره
اشاره گر فايل FileObject يه اشاره گر به متغيري که بايد قبل از اين تابع از نوع استراکچر FIL تعريف شده باشه

و يک خروجي خطا داره که 6 حالت داره
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT
توضيح خطا ها هم مثل توابع قبلي هست
براي چک کردن خطا بهتره خطا هايي که براي ما مهمه رو چک کنيم !!!
نقل قول این ارسال در یک پاسخ بازگشت به بالا
تبلیغات
ارسال: #6
۱۳۹۳/۱۲/۲۹, ۰۱:۰۳ عصر
RE: آموزش کتابخانه FatFs

اگر يادتون باشه توي پستهاي قبلي در مورد فايل ffconf.h صحبت کرده بودم اين فايل در واقع بخش کنترل تنظيمات اين توابع هست

اين جا ميتونيد امکانات اين توابع رو فعال يا غير فعال کنيد که بعضي جاهاي مهمشو توضيح ميدم

کد php:
#define    _FS_TINY        0    // 0:Normal or 1:Tiny 

براي کم کردن ميزان بافر استفاده ميشه و براي ميکروهايي که رم پاييني داند به درد ميخوره مثل همين mega32 يا 16 ما

کد php:
#define _FS_READONLY    0    // 0:Read/Write or 1:Read only 

با يک کردنش ميتونيد حالت فقط خواندني به درايوتون بدين موجب کاهش رم و حجم فلش ميشه (ديگه هرگونه نوشتن غير فعال خواهد شد)

کد php:
#define _FS_MINIMIZE    0    // 0 to 3 

بعضي از توابع رو که نياز نداريم حذف ميکنه موجب پايين اومدن حجم فلش ميشه چهار حالت داره
0 : تابع کامل
1 : توابع f_stat، f_getfree، f_unlink، f_mkdir، f_chmod، f_truncate و f_rename حذف ميشه
2 : علاوه بر توابع يک f_opendir و f_readdir هم حذف مي شه
3 : علاوه بر توابع يک و دو f_lseek هم حذف مي شه

کد php:
#define    _USE_STRFUNC    0    // 0:Disable or 1-2:Enable 

براي فعال کردن توابع رشته اي به کار ميره

کد php:
#define    _USE_MKFS        0    // 0:Disable or 1:Enable 

براي فعال کردن تابع f_mkfs هست در صورتي که FS_READONLY_ صفر باشه

کد php:
#define    _USE_FORWARD    0    // 0:Disable or 1:Enable 

براي فعال کردن تابع f_forward هست در صورتي که FS_TINY_ يک باشه

کد php:
#define    _USE_FASTSEEK    0    // 0:Disable or 1:Enable 

براي بالا بردن سرعت SEEK به کا ميره

==========================================================

کد php:
#define _CODE_PAGE    437 

انتخاب کد پيج فونت براي فايل هست که براي 10 12 تا زبان مختلف نوشته شده
در صورت انتخاب نادرست امکان خراب شدن فايل هاي اديت يا ايجاد شده وجود دارد

کد php:
#define    _USE_LFN    0        // 0 to 3 

حالت هاي مختلف LFN رو تنظيم ميکنه اين LFN همان مخفف Large File Name هست که براي استفاده از نام کامل فايل به درد ميخوره که 4 حالت داره
0 : غير فعال کردن ويژگي LFN و MAX_LFN_ و LFN_UNICODE_ موثر نخواهد بود در اين حالت نام فايل از سيستم 6.3 استفاده ميکنه 6 کاراکتر نام و يک دات(.) و 3 پسوند فايل
1 : فعال کردن LFN با بافر استاتيک بر روي BSS
2 : فعال کردن LFN با بافر پويا يا دايناميک بر روي STACK
3 : فعال کردن LFN با بافر پويا يا دايناميک بر روي HEAP

کد php:
#define    _MAX_LFN    255        // Maximum LFN length to handle (12 to 255) 

ماکزيمم کاراکتر LFN رو تنظيم ميکنه که ميتونه از 12 کاراکتر تا 255 کارکتر باشه

کد php:
#define    _LFN_UNICODE    0    // 0:ANSI/OEM or 1:Unicode 

ابن هم که توني کد رو فعال ميکنه البته اگر LFN فعال باشه

کد php:
#define _FS_RPATH        0    // 0 to 2 

0: غير فعال کردن ويژگي هاي مسير و حذف توابع مربوط بهش
1 : مسير هاي نسبي را فعال ميکند و توابع () f_chdrive و ()f_chdir در دسترس هستند
2 : علاوه بر توابع 1 () f_getcwd هم در دسترس خواهد بود

کد php:
#define _VOLUMES    1 

تعريف تعداد درايو

کد php:
#define    _MAX_SS        512        // 512, 1024, 2048 or 4096 

انتخاب ميزان سايز سکتور
براي مموري و هارد ديسک از 512 استفاده بشه
براي فلاپي درايو و ديسکهاي نوري که داراي سکتورهاي بزرگتي هستند مقدار هاي بالا تر

کد php:
#define    _MULTI_PARTITION    0    // 0:Single partition, 1/2:Enable multiple partition 

0 براي فقط يک پارتيشن و 1 براي مولتي پارتيشن

کد php:
#define    _USE_ERASE    0    // 0:Disable or 1:Enable 

براي فعال کردن بخش از ويژگي هاي پاک کردن به درد ميخوره
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #7
۱۳۹۳/۱۲/۲۹, ۰۱:۰۵ عصر
RE: آموزش کتابخانه FatFs

تابع چهارم f_read

کد php:
FRESULT f_read (
  
FILFileObject,    /* Pointer to the file object structure */
  
voidBuffer,       /* Pointer to the buffer to store read data */
  
UINT ByteToRead,    /* Number of bytes to read */
  
UINTByteRead      /* Pointer to the variable to return number of bytes read */
); 

(اشاره گر تعداد بايت خوانده شده,تعداد بايتي که قراره خونده بشه,اشاره گر بافر,اشاره گر فايل)f_read
هست
حالا اين تابع چيه و به چه درد ميخوره؟
براي خوندن ديتاي فايل هايي که قبلا باز کرديم به کار ميره

کجا بايد ازش استفاده کرد؟
اگر بخوايم ديتاي فايل رو بخونيم بايد از اين تابع استفاده کنيم و حتما قبلش بايد فايل رو بدون خطا باز کرده باشيم

ورودي و خروجي هاش؟
چهار تا ورودي داره
1 : اشاره گر فايل FileObject يه اشاره گر به متغيري که بايد قبل از اين تابع از نوع استراکچر FIL تعريف شده باشه
2 : اشاره گر فافر Buffer يه يه اشاره گر به متغير يا تابعي که بايد قبل از اين تابع تعريف شده باشه
3 : تعداد بايتي که قراره از فايل خونده بشه و در بافر قرار بگيره ByteToRead که بايد يه متغير از نوع UINT يا عدد ثابت باشه
4 : اشاره گر به متغيري که قراره تعداد بايت خونده شده در اون قرار بگيره ByteRead و بايد قبل از تابع از نوع UINT تعريف شده باشه

و يک خروجي خطا داره که 6 حالت داره
کد php:
FR_OKFR_DISK_ERRFR_INT_ERRFR_NOT_READYFR_INVALID_OBJECTFR_TIMEOUT 
توضيح خطا ها هم مثل توابع قبلي هست

ByteRead رو بايد بعد از اين تابع چک کنيم که برابر مقدار ByteToRead باشه تا انتهاي فايل رو تشخيص بديم اگر مقدار ByteRead کوچکتر از ByteToRead باشه يعني ديتاي فايل به پايان رسيده است

مثال
کد php:
void main (void)
        {
        
FATFS fs;              // Work area (file system object) for the volume
        
FIL fs;              // file objects 
        
BYTE buff[16];         // File read buffer
        
UINT br;               // File read count
        
FRESULT res;           // Petit FatFs function common result code


        // Mount the volume
        
f_mount(0, &fs);
        if (
res) die(res);

        
//در درايو 0  srcfile.dat   باز کزدن فايل 
        
res f_open(&fs"0:srcfile.dat"FA_OPEN_EXISTING FA_READ);
        if (
res) die(res); 
        
// حلقه خواندن فايل و انجام کاري که قراره روي فايل انجام بديم 
        
do{
            
                
// خوندن 16 بايت از فايل 
            
res f_read(&fsbuff16, &br);    
                
// کارهايي که قراره روي ديتاي خونده شده فايل انجام بديم
                
.
                .
                .
                . 
        
// چک کردن مقدار خطا که بزرگتر از صفر نباشه و مقدار ديتاي خونده شده تا کمتر از 16 نباشه
        
}while (res || br != 16);  
        
        
// بستن فايل
        
f_close(&fs);
        
// بستن درايو
        
f_mount(0NULL);
        } 
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #8
۱۳۹۳/۱۲/۲۹, ۰۱:۰۷ عصر
RE: آموزش کتابخانه FatFs

توي اين توابع اين دوست خوب چينيمون اومده و توي فايل integer.h متغير ها رو براي راحتي کار و تايپ سريع نامگزاري مجدد کرده

کد php:
/* These types must be 16-bit, 32-bit or larger integer */
typedef int        INT;
typedef unsigned int    UINT;

/* These types must be 8-bit integer */
typedef char        CHAR;
typedef unsigned char    UCHAR;
typedef unsigned char    BYTE;

/* These types must be 16-bit integer */
typedef short        SHORT;
typedef unsigned short    USHORT;
typedef unsigned short    WORD;
typedef unsigned short    WCHAR;

/* These types must be 32-bit integer */
typedef long        LONG;
typedef unsigned long    ULONG;
typedef unsigned long    DWORD

اما در مورد استراگچرهاي مورد نياز اين توابع بايد بگم 5 تا استراکچر هست که در فايل ff.h تعريف شده و يکي يکي يه توضيح مختصر ميدم
ولي چون متغير ها خوب نامگزاري شده و يه توضيح مختصر جلوي هرکدوم داره و معلومه براي چيه , پس من ديگه توضيح بيشتر نميدم ولي اگر لازم بود بپرسيد
استراکچر اول FATFS هست که اطلا عات فت درونش قرار ميگيره
براي دسترسي به هر کدام از متغير ها و مقادير داخلي اونها بايد بعد از نام استراکچر که تعريف کرديد با قرار دادن نقطه (.)و نام متغير داخلي استراکچر رو قرار بديد که ميتونه يکي از متغير هاي زير باشه

کد php:
/* File system object structure (FATFS) */

typedef struct {
    
BYTE    fs_type;        /* FAT sub-type (0:Not mounted) */
    
BYTE    drv;            /* Physical drive number */
    
BYTE    csize;            /* Sectors per cluster (1,2,4...128) */
    
BYTE    n_fats;            /* Number of FAT copies (1,2) */
    
BYTE    wflag;            /* win[] dirty flag (1:must be written back) */
    
BYTE    fsi_flag;        /* fsinfo dirty flag (1:must be written back) */
    
WORD    id;                /* File system mount ID */
    
WORD    n_rootdir;        /* Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
    
WORD    ssize;            /* Bytes per sector (512, 1024, 2048 or 4096) */
#endif
#if _FS_REENTRANT
    
_SYNC_t    sobj;            /* Identifier of sync object */
#endif
#if !_FS_READONLY
    
DWORD    last_clust;        /* Last allocated cluster */
    
DWORD    free_clust;        /* Number of free clusters */
    
DWORD    fsi_sector;        /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
    
DWORD    cdir;            /* Current directory start cluster (0:root) */
#endif
    
DWORD    n_fatent;        /* Number of FAT entries (= number of clusters + 2) */
    
DWORD    fsize;            /* Sectors per FAT */
    
DWORD    fatbase;        /* FAT start sector */
    
DWORD    dirbase;        /* Root directory start sector (FAT32:Cluster#) */
    
DWORD    database;        /* Data start sector */
    
DWORD    winsect;        /* Current sector appearing in the win[] */
    
BYTE    win[_MAX_SS];        /* Disk access window for Directory, FAT (and Data on tiny cfg) */
FATFS
استراکچر بعدي FIL هست که اطلا عات فايل درونش قرار ميگيره و ساختارش اين شکليه

کد php:
/* File object structure (FIL) */

typedef struct {
    
FATFS*    fs;            /* Pointer to the owner file system object */
    
WORD    id;            /* Owner file system mount ID */
    
BYTE    flag;            /* File status flags */
    
BYTE    pad1;
    
DWORD    fptr;            /* File read/write pointer (0 on file open) */
    
DWORD    fsize;            /* File size */
    
DWORD    sclust;            /* File start cluster (0 when fsize==0) */
    
DWORD    clust;            /* Current cluster */
    
DWORD    dsect;            /* Current data sector */
#if !_FS_READONLY
    
DWORD    dir_sect;        /* Sector containing the directory entry */
    
BYTE*    dir_ptr;        /* Ponter to the directory entry in the window */
#endif
#if _USE_FASTSEEK
    
DWORD*    cltbl;            /* Pointer to the cluster link map table (null on file open) */
#endif
#if _FS_SHARE
    
UINT    lockid;            /* File lock ID (index of file semaphore table) */
#endif
#if !_FS_TINY
    
BYTE    buf[_MAX_SS];        /* File data read/write buffer */
#endif
FIL

استراکچر بعدي DIR هست که اطلاعات پوشه درونش هست و ساختارش اين شکليه

کد php:
/* Directory object structure (DIR) */

typedef struct {
    
FATFS*    fs;            /* Pointer to the owner file system object */
    
WORD    id;            /* Owner file system mount ID */
    
WORD    index;            /* Current read/write index number */
    
DWORD    sclust;            /* Table start cluster (0:Root dir) */
    
DWORD    clust;            /* Current cluster */
    
DWORD    sect;            /* Current sector */
    
BYTE*    dir;            /* Pointer to the current SFN entry in the win[] */
    
BYTE*    fn;            /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
#if _USE_LFN
    
WCHAR*    lfn;            /* Pointer to the LFN working buffer */
    
WORD    lfn_idx;        /* Last matched LFN index number (0xFFFF:No LFN) */
#endif
DIR

استراکچر بعدي FILINFO هست که خصوصيات فايل درونش هست وساختارش اينطوريه

کد php:
/* File status structure (FILINFO) */

typedef struct {
    
DWORD    fsize;            /* File size */
    
WORD    fdate;            /* Last modified date */
    
WORD    ftime;            /* Last modified time */
    
BYTE    fattrib;        /* Attribute */
    
TCHAR    fname[13];        /* Short file name (8.3 format) */
#if _USE_LFN
    
TCHAR*    lfname;            /* Pointer to the LFN buffer */
    
UINT     lfsize;            /* Size of LFN buffer in TCHAR */
#endif
FILINFO

و بعدي که استراکچر نيست ولي ساختار شمارشي يا انيوم هست هم FRESULT نام داره که خطا هاي برگشتي توابع درونشه و به اين صورته

کد php:
/* File function return code (FRESULT) */

typedef enum {
    
FR_OK 0,            /* (0) Succeeded */
    
FR_DISK_ERR,            /* (1) A hard error occured in the low level disk I/O layer */
    
FR_INT_ERR,            /* (2) Assertion failed */
    
FR_NOT_READY,            /* (3) The physical drive cannot work */
    
FR_NO_FILE,            /* (4) Could not find the file */
    
FR_NO_PATH,            /* (5) Could not find the path */
    
FR_INVALID_NAME,        /* (6) The path name format is invalid */
    
FR_DENIED,            /* (7) Acces denied due to prohibited access or directory full */
    
FR_EXIST,            /* (8) Acces denied due to prohibited access */
    
FR_INVALID_OBJECT,        /* (9) The file/directory object is invalid */
    
FR_WRITE_PROTECTED,        /* (10) The physical drive is write protected */
    
FR_INVALID_DRIVE,        /* (11) The logical drive number is invalid */
    
FR_NOT_ENABLED,            /* (12) The volume has no work area */
    
FR_NO_FILESYSTEM,        /* (13) There is no valid FAT volume */
    
FR_MKFS_ABORTED,        /* (14) The f_mkfs() aborted due to any parameter error */
    
FR_TIMEOUT,            /* (15) Could not get a grant to access the volume within defined period */
    
FR_LOCKED,            /* (16) The operation is rejected according to the file shareing policy */
    
FR_NOT_ENOUGH_CORE,        /* (17) LFN working buffer could not be allocated */
    
FR_TOO_MANY_OPEN_FILES,        /* (18) Number of open files > _FS_SHARE */
    
FR_INVALID_PARAMETER        /* (19) Given parameter is invalid */
FRESULT
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال: #9
۱۳۹۳/۱۲/۲۹, ۰۱:۰۹ عصر
RE: آموزش کتابخانه FatFs

تابع پنجم f_write

کد php:
FRESULT f_write (
  
FILFileObject,     /* Pointer to the file object structure */
  
const voidBuffer,  /* Pointer to the data to be written */
  
UINT ByteToWrite,    /* Number of bytes to write */
  
UINTByteWritten    /* Pointer to the variable to return number of bytes written */
); 

(اشاره گر تعداد بايت نوشته شده,تعداد بايتي که قراره نوشته بشه,اشاره گر بافر,اشاره گر فايل)f_write
هست
حالا اين تابع چيه و به چه درد ميخوره؟
براي نوشتن ديتاي فايل هايي که قبلا باز کرديم به کار ميره

کجا بايد ازش استفاده کرد؟
اگر بخوايم ديتاي فايل رو بنويسيم بايد از اين تابع استفاده کنيم و حتما قبلش بايد فايل رو بدون خطا باز کرده باشيم

ورودي و خروجي هاش؟
چهار تا ورودي داره
1 : اشاره گر فايل FileObject يه اشاره گر به متغيري که بايد قبل از اين تابع از نوع استراکچر FIL تعريف شده باشه
2 : اشاره گر فافر Buffer يه يه اشاره گر به متغير يا تابعي که بايد قبل از اين تابع تعريف شده باشه
3 : تعداد بايتي که قراره از فايل نوشته بشه و در بافر قرار بگيره ByteToRead که بايد يه متغير از نوع UINT يا عدد ثابت باشه
4 : اشاره گر به متغيري که قراره تعداد بايت نوشته شده در اون قرار بگيره ByteRead و بايد قبل از تابع از نوع UINT تعريف شده باشه

و يک خروجي خطا داره که 6 حالت داره
کد php:
FR_OKFR_DISK_ERRFR_INT_ERRFR_NOT_READYFR_INVALID_OBJECTFR_TIMEOUT 
توضيح خطا ها هم مثل توابع قبلي هست

براي استفاده از اين تابع FS_READONLY_ بايد صفر باشد

ByteWritten رو بايد بعد از اين تابع چک کنيم که برابر مقدار ByteToWrite باشه تا انتهاي فايل رو تشخيص بديم اگر مقدار ByteWritten کوچکتر از ByteToWrite باشه يعني ديتاي فايل به پايان رسيده است
نقل قول این ارسال در یک پاسخ بازگشت به بالا
تبلیغات
ارسال: #10
۱۳۹۳/۱۲/۲۹, ۰۱:۱۰ عصر
RE: آموزش کتابخانه FatFs

اين هم مثال براي خوندن از يه فايل توي درايو 0 و نوشتنش توي فايل ديگه توي درايو 1 يا همان کپي فايل از درايو 0 به درايو 1

کد php:
void main (void)
        {
        
FATFS fs[2];         // Work area (file system object) for logical drives 
        
FIL fsrcfdst;      // file objects 
        
BYTE buffer[4096];   // file copy buffer
        
FRESULT res;         // FatFs function common result code 
        
UINT brbw;         // File read/write count 


        // Register work area for each volume (Always succeeds regardless of disk status) 
        
f_mount(0, &fs[0]);
        
f_mount(1, &fs[1]);

        
// Open source file on the drive 1 
        
res f_open(&fsrc"1:srcfile.dat"FA_OPEN_EXISTING FA_READ);
        if (
res) die(res);

        
// Create destination file on the drive 0 
        
res f_open(&fdst"0:dstfile.dat"FA_CREATE_ALWAYS FA_WRITE);
        if (
res) die(res);

        
// Copy source to destination 
        
for (;;) 
                {
                
res f_read(&fsrcbuffersizeof(buffer), &br);    // Read a chunk of src file 
                
if (res || br == 0) break; // error or eof 
                
res f_write(&fdstbufferbr, &bw);               // Write it to the dst file 
                
if (res || bw br) break; // error or disk full 
                
}

        
// Close open files 
        
f_close(&fsrc);
        
f_close(&fdst);

        
// Unregister work area prior to discard it 
        
f_mount(0NULL);
        
f_mount(1NULL);
        } 
نقل قول این ارسال در یک پاسخ بازگشت به بالا
ارسال موضوع ارسال پاسخ


موضوع‌های مرتبط با این موضوع...
موضوع: نویسنده پاسخ بازدید: آخرین ارسال
  آموزش جامع اتصال avr به پورت usb در بسکام Morteza_rk 0 6,147 ۱۳۹۱/۶/۲۲ ۰۸:۴۵ عصر
آخرین ارسال: Morteza_rk
  آموزش ساخت کتابخانه در Winavr behnam 4 10,922 ۱۳۹۱/۴/۳۰ ۰۸:۱۷ عصر
آخرین ارسال: behnam
  مجموعه کتابخانه های میکروکنترلر AVR زبان C behnam 0 5,475 ۱۳۹۱/۳/۱۹ ۰۳:۰۰ عصر
آخرین ارسال: behnam

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان