codevisionavrFAT3

راه اندازی FAT و کار با حافظه های MMC و SDC با AVR – قسمت 3

به نام خدا

راه اندازی FAT با AVR قسمت3 : بررسی توابع FAT – بخش اول

در ادامه بحث راه اندازی FAT با AVR پس از تنظیمات نرم افزار CodeVision این قابلیت برای برنامه ما ایجاد می شود که بتوانیم از توابع FAT در برنامه خود استفاده کنیم. برای استفاده از این توابع لازم می باشد که ابتدا هدر فایل های لازم را به پروژه اضافه کنیم. برای این منظور ابتدا هر فایل زیر را به پروژه اضافه می کنیم:

<include    <ff.h#

بعد از اضافه کردن هدر فایل فوق دسترسی به توابع FAT ممکن می گردد.

اولین تابع مورد نیاز:

FRESULT f_mount(unsigned char vol, FATFS *fs);

این تابع مقداری از حجم حافظه SRAM را برای کار با فایل هایی به فرمت FAT برای ما آماده سازی می کند. نکته مهم این تابع این است که این تابع ربطی به وجود و عدم وجود کارت حافظه ندارد و فقط فضای کاری را آماده سازی می کند.

این تابع دارای دو ورودی و مقدار برگشتی می باشد که در زیر آن ها را معرفی می کنیم.

پارمترهای ورودی:

  • Vol : از جنس unsigned char می باشد و شماره درایوی است که فضا را برای آن می خواهیم آماده سازی کنیم. این مقدار می تواند بین 0 تا 9 باشد. به عبارتی با استفاده از توابع FAT که در اختیار داریم حداکثر 10 درایو را می توانیم پشتیبانی کنیم. بدیهی است که تمام چیپ این قابلیت را دارا نمی باشند و با توجه به حجم SRAM هر چیپ تعداد محدودی درایو را می تواند پشتیبانی کند.
  • fs* : از جنس FATFS که این پارامتر استراکچر می باشد و به صورت پوینتری می باشد و اطلاعاتی از قبیل سکتور ها ،کلاستر ها ، ID ، شماره شروع سکتورها و … را در این استراکچر ذخیره می کند.

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

  • این تابع دارای مقدار برگشتی نیز می باشد که مقدار برگشتی ما نیز از جنس FRESULT که از نوع enum تعریف شده است می باشد. این تابع یکی از دو مقدار زیر را بر می گرداند:
    1. FR_OK : در صورت موفقیت آمیز بودن عملیات این مقدار را برمی گرداند.
    2. FR_INVALID_DRIVE: در صورتی که شماره درایو نامعتبر باشد این مقدار را برمی گرداند.

نکته این تابع:

  • در صورتی که از مولتی درایو استفاده نمی کنید فقط باید شماره 0 را برای درایو وارد کنید.

مفاهیم مورد نیاز در این تابع و ادامه بحث:

  • سوال استراکچر چیست؟
    • استراکچر به بیان ساده دسته ای از متغییر ها هستند در یک type قرار گرفته اند. اگر بخواهیم در قالب یک مثال برای بحث FAT توضیح دهیم باید به استراکچر FATFS اشاره کنیم. نحو تعریف و عضو های آن را در زیر می بینید:

typedef struct _FATFS_

      {

      unsigned char     fs_type;    /* FAT sub type */

      unsigned char     drive;      /* Physical drive number */

      unsigned char     csize;      /* Number of sectors per cluster */

      unsigned char     n_fats;     /* Number of FAT copies */

      unsigned char     wflag;      /* win[] dirty flag (1:must be written back) */

      unsigned short    id;         /* File system mount ID */

      unsigned short    n_rootdir;  /* Number of root directory entries (0 on FAT32) */

      unsigned char     fsi_flag;   /* fsinfo dirty flag (1:must be written back) */

      unsigned long     last_clust; /* Last allocated cluster */

      unsigned long     free_clust; /* Number of free clusters */

      unsigned long     fsi_sector; /* fsinfo sector */

      unsigned long     cdir;       /* Current directory (0:root)*/

      unsigned long     sects_fat;  /* Sectors per fat */

      unsigned long     max_clust;  /* Maximum cluster# + 1. Number of clusters is max_clust – 2 */

      unsigned long     fatbase;    /* FAT start sector */

      unsigned long     dirbase;    /* Root directory start sector (Cluster# on FAT32) */

      unsigned long     database;   /* Data start sector */

      unsigned long     winsect;    /* Current sector appearing in the win[] */

      unsigned char     win[512];   /* Disk access window for Directory/FAT */

      } FATFS;

  • Enum چیست؟
    • يک نوع داده ای تعريف شده توسط برنامه نويس را که به آن نوع داده شمارش می گويند، ايجاد می کند. و مقدایر داخل آن از مقدار اولیه یکی یکی اضافه می شود، همچنین اگر مقدار اولیه ندهیم آن را صفر لحاظ می کند. در زیر نحوه تعریف FRESULT که به صورت enum می باشد را می بینید:

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 doesn’t 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) f_mkfs() aborted due to a parameter error */

      FR_TIMEOUT,         /* (15) Could not access the volume within the defined period */

      FR_INVALID_PARAMETER=19 /* (19) Given parameter is invalid */

      } FRESULT;

در قسمت بعد با نحوه آماده سازی فایل برای خواندن ، نوشتن و یا ایجاد فایل آشنا می شویم.

 

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *