اطلاعیه

Collapse
No announcement yet.

[آموزش] نحوه استفاده از کتابخانه pff.h

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    [آموزش] نحوه استفاده از کتابخانه pff.h

    با سلام
    به چند نفر از دوستان قول داده بدم که یک مقاله کامل در رابطه با کار با کتابخانه های راه اندازی MMC SD شامل pff.h و ff.h ارائه کنم ولی متاسفانه به دلیل کمبود وقت و مشکلات پیش رو فعلا اموزش رو در راستای یک تاپیک پیش می برم و امیدوارم بعد از گذشت این مدت مقاله رو اماده شده تحویل بدم.
    باید اضافه کنم که به شخصه در حد چند سمپل ساده با این کتابخانه کار کردم و هر کدوم از اساتید اگر جایی ایرادی دیدین لطفا گوشزد بفرماییدن تا اطلاعات ناقص بنده کسی رو گمراه نکنه.

    منابعی که بنده استفاده کردم به شرح زیر است:
    1-مقاله آقای محمد مهدی صفی
    2-آموزش های استاد رامین جعفرپور
    3-نوشته های آقای هادی اسدی
    از همینجا از این بزرگواران کمال تشکر و قدردانی رو دارم.

    بریم سراغ آموزش.
    همونطور که در بالا بیان شد هدف از این تاپیک آموزش استفاده از توابع کتابخانه pff.h می باشد.
    تفاوت این کتابخانه با ff.h در اشغال کردن حافظه های flash و Sram می باشد که حافظه Sram در استفاده از این کتابخانه بیشتر مد نظر خواهد بود.
    کتابخانه مذکور توسط یک استاد ژاپنی تهیه و به صورت آزاد بر روی اینترنت قرار داده شده. http://elm-chan.org/fsw/ff/00index_e.html
    فرمت های قابل پشتیبانی کتابخانه شامل fat12/fat16/fat32 می باشد و با توجه به ساپورت fat32 امکان ساپورت کارت های با مقدار فضای بیشتر از 4 گیگ هم امکان پذیر خواهد بود.
    قبل از ادامه بحث بهتره کتابخانه ذکر شده رو با مخلفات از لینک زیر دانلود کنید.
    soran111.persiangig.com/document/SD_Driver.rar

    در این قسمت قبل از هر چیز توضیحاتی مختصر در مورد هدرهای ارائه شده در لینک بالا رو براتون قرار میدم.

    هدر integer :
    با استفاده از این هدر نام های جدیدی به انواع داده ای نسبت داده شده یعنی شما بعد از این هر جا UINT رو دیدین اگه به هدر مراجعه کنید می فهمید که منظورش unsigned int هستش.
    هدر diskio :
    در این هدر توابع پایه ای کار با کتابخانه fat گنجانده شده است.
    هدر mmc :
    کتابخانه pff.h از spi سخت افزاری استفاده می کند و لذا شما موقع طراحی سخت افزار باید مواظب این قسمت باشید. هدر mmc شامل تنظیمات spi و پین های مورد استفاده و همچنین توابع پایه ای کار با mmc. خب قبلا که این توابع در diskio بود و شاید بگین چرا تکرار شده و باید بگم تکرار نشده و اگه به هدر diskio نگاه کنید در اون قسمت توابع فقط تعریف شدن و عملکردشون مشخص نیست.
    هدر pff :
    اصلی ترین هدر مورد استفاده ما همین هستش و تمامی توابع کار با fat در این هدر گنجانده شده است و یک نکته حائز اهمیت دیگه این که در pff.h یک سری تنظیمات برای فعال و غیر فعال کردن برخی توابع هم وجود داره که در جای خود توضیح خواهم داد.
    در بخش بعد میریم سراغ سخت افزار و یک شماتیک کلی که طبق اون آموزش رو پیش ببریم.

    امیدوارم تا این قسمت مشکلی نبوده باشه.
    موفق باشید
    چرا ناراحتی پاتریک!
    + امروز ی بچه دیدم سرچهارراه گل میفروخت
    - از دیدنش ناراحت شدی؟
    + نه
    پس چی ناراحتت کرده
    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
    ------------------------------------------------------------------------------------------------------
    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
    ------------------------------------------------------------------------------------------------------
    محصولات

    #2
    پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

    با تشکر از شما که این آموزش را شروع کردید :
    در وهله اول یک مشکلی در diskio داریم ، در این فایلهای شما بین diskio.h, diskio.c یک error می دهد که مثلا disk_readp و diskwritepدو جور مختلف تعریف شده است .
    میشه خودتون تست کنید ؟
    در diskio.h داریم :
    کد:
    DRESULT disk_readp (BYTE*, DWORD, WORD, WORD);
    DRESULT disk_writep (const BYTE*, DWORD);
    در حالیکه در diskio.c داریم :
    کد:
    DRESULT disk_readp (
    	void* dest,			/* Pointer to the destination object */
    	DWORD sector,		/* Sector number (LBA) */
    	WORD sofs,			/* Offset in the sector */
    	WORD count			/* Byte count (bit15:destination) */
    )
    {
    	DRESULT res;
    
    	// Put your code here
    
    	return res;
    }
     
    /*-----------------------------------------------------------------------*/
    /* Write Partial Sector                         */
    /*-----------------------------------------------------------------------*/
    DRESULT disk_writep (
    	BYTE* buff,		/* Pointer to the data to be written, NULL:Initiate/Finalize write operation */
    	DWORD sc		/* Sector number (LBA) or Number of bytes to send */
    )
    {
    	DRESULT res;
    
    
    	if (!buff) {
    		if (sc) {
    
    			// Initiate write process
    
    		} else {
    
    			// Finalize write process
    
    		}
    	} else {
    
    		// Send data to the disk
    
    	}
    
    	return res;
    }

    دیدگاه


      #3
      پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

      در وهله اول یک مشکلی در diskio داریم ، در این فایلهای شما بین diskio.h, diskio.c یک error می دهد که مثلا disk_readp و diskwritepدو جور مختلف تعریف شده است .
      این به این معنا نیست که دو جور نوشته شده
      مثلاً در تابع اصلی disk_writep پارامتر اول void هست (جنس خاصی تعریف نشده) و در هدر فایل این پارامتر را از جنس BYTE* معرفی کرده

      احتمالاً مشکل شما مربوط به جای دیگه ای هست
      امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

      دیدگاه


        #4
        پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

        نوشته اصلی توسط Abbas Sarami
        این به این معنا نیست که دو جور نوشته شده
        مثلاً در تابع اصلی disk_writep پارامتر اول void هست (جنس خاصی تعریف نشده) و در هدر فایل این پارامتر را از جنس BYTE* معرفی کرده

        احتمالاً مشکل شما مربوط به جای دیگه ای هست
        من که متنش رو گذاشتم اصلا تعداد پارامترها هم فرق می کنه چه برسه به نوع اونها!!

        دیدگاه


          #5
          پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

          در هدر فایل
          کد:
          DRESULT disk_readp (BYTE*, DWORD, WORD, WORD);
          در فایل سورس
          کد:
          DRESULT disk_readp (void* dest,	DWORD sector,WORD sofs,	WORD count)
          در هدر فایل
          کد:
          DRESULT disk_writep (const BYTE*, DWORD);
          در فایل سورس
          کد:
          DRESULT disk_writep (BYTE* buff,DWORD sc)
          تفاوت تعداد پارامترشون کجاست ؟
          امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

          دیدگاه


            #6
            پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

            حق با شماست بذار من یکبار دیگه چک کنم ببینم مشکل از کجاست که کمپابلر به من ارور می ده

            دیدگاه


              #7
              پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

              تابع disk_writep هم داخل MMC تعربف شده هم diskio !
              این رو دیگه مطمنم !!!!

              دیدگاه


                #8
                پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                با اجازه دوستان چند خطی هم من بنویسم:
                ابتدا بهتره انواع خروجی توابع را بشناسیم، در فایل diskio.h کد زیر را میبینید:
                کد:
                typedef enum {
                	RES_OK = 0,		/* 0: Function succeeded */
                	RES_ERROR,		/* 1: Disk error */
                	RES_NOTRDY,		/* 2: Not ready */
                	RES_PARERR		/* 3: Invalid parameter */
                } DRESULT;
                خوب این یک enum هست که به ازاء هر عدد یک نام انتخاب کرده (فهرست اعداد از 0 شروع میشه)
                مثلاً اگه یک تابع را فراخوان کردید و تابع به شما 0 برگرداند یعنی همه چیز OK هست (RES_OK یعنی همون Result Ok)
                این هم یکی دیگه که توی فایل pff.h هست (مربوط به نتیجه توابع کار با فایل)
                کد:
                typedef enum {
                	FR_OK = 0,		/* 0 */
                	FR_DISK_ERR,		/* 1 */
                	FR_NOT_READY,		/* 2 */
                	FR_NO_FILE,		/* 3 */
                	FR_NO_PATH,		/* 4 */
                	FR_NOT_OPENED,		/* 5 */
                	FR_NOT_ENABLED,		/* 6 */
                	FR_NO_FILESYSTEM	/* 7 */
                } FRESULT;
                مثال:
                کد:
                DRESULT _result;
                do
                {
                _result= disk_initialize();
                delay_ms(500);
                }
                while(_result != RES_OK);
                موفق باشید
                امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                دیدگاه


                  #9
                  پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                  نوشته اصلی توسط داریوش عباسی
                  تابع disk_writep هم داخل MMC تعربف شده هم diskio !
                  این رو دیگه مطمنم !!!!
                  داخل توابع را هم ببینید
                  توابع فایل diskio.c خام هستند مثل :
                  کد:
                  DRESULT disk_writep (
                  	BYTE* buff,		/* Pointer to the data to be written, NULL:Initiate/Finalize write operation */
                  	DWORD sc		/* Sector number (LBA) or Number of bytes to send */
                  )
                  {
                  	DRESULT res;
                  
                  
                  	if (!buff) {
                  		if (sc) {
                  
                  			// Initiate write process
                  
                  		} else {
                  
                  			// Finalize write process
                  
                  		}
                  	} else {
                  
                  		// Send data to the disk
                  
                  	}
                  
                  	return res;
                  }
                  پس نتیجه میگیریم که شما فقط فایل mmc.c را به پروژه اضافه کن نه diskio.c
                  [glow=red,2,300]نکته مهم همینه شما با فایل diskio.c کاری ندارید توابع اصلی درون MMC.C هست[/glow]

                  موفق باشید
                  امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                  دیدگاه


                    #10
                    سخت افزار و شماتیک مورد نیاز

                    از دوست خوبم Abbas Sarami بخاطر کمکشون تشکر می کنم.

                    اقای عباسی اگه عجله نکنید همین امشب یه نمونه سورس کد برای تست قرار میدم. مطمئن باشین مشکلتون حل میشه.


                    حالا قبل از هر کار دیگه ای ما به یه سخت افزار نیاز داریم.
                    به شخصه از برد اموزشی AVR پیشرفته سایت استفاده می کنم و شماتیکش در زیر قرار داده شده.

                    http://vip.eca.ir/sharing/uploads/13705578261.rar

                    اگه دقت کنید برای کار با mmc جامپر تغذیه باید در حالت 3.3 ولت باشه و کسانی هم که روی بردبرد تست می کنن بهتره کل تغذیه رو 3.3 بزارید و نمایشگر کاراکتری رو هم با 5 ولت تغذیه کنید. نمایشگر هم 3.3 ولت رو به عنوان سطحی برای دیتا و ... می شناسه پس نگران این بخش نباشین.
                    توصیه می کنم به هیچ عنوان از تقسیم مقاومتی استفاده نکنید و کارت حافظه در نزدیک ترین قسمت به میکروکنترلر باشه.
                    البته اگه قطعاتی روی برد داشته باشین که با 5 ولت کار می کنن بهتره از تراشه های تبدیل سطح مثل CD4050 استفاده کنید که راه اصولیشم همینه.
                    کارت حافظه ای که من استفاده می کنم عکسش رو به همراه سوکت مخصوص بردبرد در زیر می بینید.



                    من حافظه بالای 4 گیگ رو به شخصه تست نکردم لذا اطلاعاتی که قرار میدم در حد 4 گیگ هست و قبلا هم که گفتم بشتر از 4 گیگ رو هم ساپورت می کنه به دلیل پشتیبانی کتابخانه از fat32 هستش.
                    کارت حافظه با فرمت fat32 فرمت شده و اموزش ها بر این اساس پیش خواهد رفت.

                    بخش بعد میریم سراغ برنامه نویسی و سورس کدها.
                    چرا ناراحتی پاتریک!
                    + امروز ی بچه دیدم سرچهارراه گل میفروخت
                    - از دیدنش ناراحت شدی؟
                    + نه
                    پس چی ناراحتت کرده
                    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                    ------------------------------------------------------------------------------------------------------
                    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                    ------------------------------------------------------------------------------------------------------
                    محصولات

                    دیدگاه


                      #11
                      شروع برنامه نویسی و راه اندازی MMC_SD


                      خب ابتدا بعد از باز کردن کدویژن و ساخت یک پروژه فقط نمایشگر کاراکتری رو در حالت دیفالت(یعنی اتصال به پورت A) و تعداد سطر 16 فعال کنید.
                      بعد از تولید کدها تمامی خطوط اضافی رو پاک کنید و کتابخانه های mmc.c و pff.c را نیز به برنامه اضافه کنید.
                      قبل از هر کاری یک بار برنامه رو کامپایل کنید که خطایی نداشته باشه و به warning هایی که میده زیاد حساسیت نشون ندین.
                      حالا pff.h رو باز کنید و همونطور که می بینید در اول خطوط برنامه چند دیفاین برای فعال و غیر فعال کردن قسمت های مختلف کتابخانه را مشاهده می کنید. اخرین قسمت مربوط به شناسایی fat32 را یک کنید یعنی خط زیر:


                      #define _FS_FAT32 1


                      بقیه قسمت ها در جای مناسب فعال یا غیر فعال میشن و در حال حاضر به بقیه کاری نداشته باشین.

                      بریم سراغ اولین تابع:
                      اینشیالیز کردن کارت حافظه :
                      شکل کلی تابع :


                      DSTATUS disk_initialize (void);


                      کاربردش که مشخصه و به این صورت کار می کنه که وقتی فراخوانیش می کنید در جواب اگر صفر رو برگشت داد یعنی با موفقیت کارت حافظه شناسایی شده و در غیر این صورت عملیات ناموفق بوده.
                      من زیاد نمی خوام بحث پیچیده بشه پس اگه وارد بحث های خیلی ریز نمیشم فعلا ناراحت نشین.
                      هر چند در هرجا لازم باشه توضیحات کامل و مناسب خواهم داد.
                      تابع دوم
                      باز کردن درایو کارت حافظه:
                      شکل کلی تابع:


                      FRESULT pf_mount (FATFS*);


                      نکته ای که در مورد این تابع هست و باید بدونید اینکه در ff.h یک شماره هم برای تابع به عنوان شماره درایو ارسال میشه ولی چون pff.h فقط برای یک درایو هست در نتیجه به صورت پیش فرض اون ارگومان خذف شده.
                      کارکرد تابع:
                      باز کردن یک درایو در fat برای ثبت یا خوندن اطلاعات و کلا قبل از هر کاری باید این تابع فراخوانی بشه.
                      البته تابع فقط یک بار در اول برنامه فراخوانی میشه و تمام.
                      ورودی و خروجی های تابع :
                      ورودی تابع یک اشاره گر fs= FileSystemObject به متغیری که از قبل باید به عنوان ساختمان تعریف شده باشد می باشد.
                      یعنی باید از قبل متغیری را به این شکل تعریف کنید :
                      FATFS Fs;
                      خروجی های تابع نیز به صورت زیر خواهند بود :
                      • FR_OK
                      • FR_NOT_READY
                      • FR_DISK_ERR
                      • FR_NO_FILESYSTEM
                      خب قبل از ادامه بهتر شروع کنیم به نوشتن یک سورس اولیه با این دو تابع پایه و تست هایی روی اونها انجام بدیم.
                      مثال اول: اینشیالیز کردن کارت حافظه و باز کردن و بستن درایو.

                      دانلود سمپل اول
                      چرا ناراحتی پاتریک!
                      + امروز ی بچه دیدم سرچهارراه گل میفروخت
                      - از دیدنش ناراحت شدی؟
                      + نه
                      پس چی ناراحتت کرده
                      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                      ------------------------------------------------------------------------------------------------------
                      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                      ------------------------------------------------------------------------------------------------------
                      محصولات

                      دیدگاه


                        #12
                        پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                        سلام
                        مرسی از شروع آموزش
                        منم به نوبه خودم یه کمک کوچکی میکنم ( در حدی که بلدم )
                        فعلا اینو درارم شاید به درد بچه ها بخوره


                        شماتیک هم در آوردم ولی اجازه میدم دوستان که آموزشو شروع کردن اگر دوس داشتم قرار بدن
                        درایور شبکه و nRF24L01
                        کاتالوگ محصولات
                        کنترلر CNC شش محوره براي پرينتر 3D و Pick n Place
                        شبيه ساز تک تيرانداز و سيبل ديجيتال با پردازش تصوير
                        فروش اسيلوسکوپ GWinstek GOS-630FC

                        دیدگاه


                          #13
                          پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                          خوب تاحالا پیکر بندی MMC/SD و FAT را یاد گرفتیم(توابع زیر)
                          کد:
                          DSTATUS disk_initialize (void);
                          FRESULT pf_mount (FATFS*);
                          برای کار با توابع FAT در ابتدا می رویم سراغ pf_open:
                          فرم این تابع به این شکل هست(در فایل pff.h):
                          کد:
                          FRESULT pf_open (const char*);				/* Open a file */
                          در اینجا همون طور که مشخصه تابع یک پارامتر میگیره و خروجی FRESULT داره
                          ورودی تابع نام فایل هست مثلاً "test.txt"
                          خروجی تابع همون طور که در enum هایی که توضیح دادم مشخصه اگه FR_OK برگردونه یعنی فایل باز شده :nice:
                          مثال:
                          کد:
                          FRESULT _result;
                          _result = pf_open("test.txt");
                          if(_result == FR_OK)
                          {
                          //other codes , File is open
                          }
                          else
                          {
                          //error
                          }

                          موفق باشید
                          امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                          دیدگاه


                            #14
                            پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                            تشکر از شما بابت این آموزش
                            من دیروز فرصت نکردم آموزش رو دنبال کنم

                            تابع disk_initialize رو از داخل diskio فراخوانی می کنید ؟
                            آخه داخل اون خالیه که ؟ شاید هم من طبق معمول دارم عجله می کنم و دقت نمی کنم :
                            کد:
                            DSTATUS disk_initialize (void)
                            {
                            	DSTATUS stat;
                            
                            	// Put your code here
                            
                            	return stat;
                            }

                            دیدگاه


                              #15
                              پاسخ : [آموزش] نحوه استفاده از کتابخانه pff.h

                              تابع disk_initialize رو از داخل diskio فراخوانی می کنید ؟
                              اقای عباسی عزیز پست های قبلی را نخواندید ؟؟؟؟
                              لطفاً پاسخ شماره 8 را ببینید
                              [glow=red,2,300]نکته مهم همینه شما با فایل diskio.c کاری ندارید توابع اصلی درون MMC.C هست[/glow]
                              امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                              دیدگاه

                              لطفا صبر کنید...
                              X