AVR, توصیه شده, کتابخانه برنامه نویسی

همه چیز درباره راه اندازی MMC/SD قسمت اول

معرفی:

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

در این مقاله سعی داریم که به معرفی حافظه هایی با حجم بالا بپردازیم. حافظه هایی که برای ذخیره سازی انبوه داده به کار می روند. تا قبل از معرفی حافظه های کوچک قابل حمل داده ها درون دیسک ها ذخیره می شدند که به دلیل ساختار مکانیکی دیسک ها امکان استفاده آنها در ادوات الکترونیکی کوچک و قابل حمل نبود. این مهم باعث ایجاد محدودیت های جدی در توسعه دستگاه های دیجیتالی قابل حمل می شد تا این که در سال 1997 شرکت SanDisk با همکاری شرکت Siemens AG حافظه MMC (MultiMediaCard) را معرفی کردند.

ابعاد کوچک در کنار تعداد پایه های کم ، به سرعت باعث محبوبیت این نوع حافظه شد. اولین نسخه های MMC از یک بیت(سریال) برای برقراری ارتباط استفاده می کرد تا این که نیاز به سرعت بیشتر جهت دسترسی به داده ها شرکت ها رو مجبور به تولید دیسک های پر سرعت و رابط 4 بیتی ارتباطی کرد به صورتی که سرعت انتقال داده از 20 مگابیت بر ثانیه (نمونه اولیه) به سرعت 832 مگابیت بر ثانیه(MMCplus) رسید.

با این حال با توجه به نیاز روز افزون دنیای دیجیتال به سرعت بالاتر شرکت های تولید کننده را مجبور به طراحی نسل جدیدی کرد که علاوه بر سرعت بیشتر ، قابلیت ها بیشتری نیز داشته باشد. در همین راستا شرکت SanDisk با همکاری Panasonic و Toshiba دست به طرحی حافظه ای شدند که علاوه بر سازگاری با حافظه MMC دارای قابلیت های جدیدی باشد و نیازهای به وجود آمده را پاسخگو باشد. نتیجه این همکاری معرفی دیسک SD شد.

دیسک های SD علاوه بر سازگاری با نسل قبلی دارای سرعت بیشتر و ابعاد کوچکتری هم بودند. این دیسک ها از سال 2000 تا هم اکنون در حال استفاده هستند و به نظر می رسد که تا آینده های دور نیز مورد استفاده قرار گیرند. دیسک های تولید شده SD قابلیت انتقال اطلاعات را با سرعتی بالغ بر 5 گیگابیت بر ثانیه را دارا می باشند.

پیکربندی پایه ها:

قبل از هر چیزی جهت اتصال یک حافظه به مدار مورد نظر ، نیاز است که ترتیب پایه ها و عملکرد آنها را بدانیم . با توجه به تنوع حافظه های موجود ، ترتیب و تعداد پایه های آنها متفاوت است. که در تصور های زیر تفکیک نوع حافظه شما قادر به مشاهده ترتیب و نام پایه مورد نظر هستید.

SD/MMC

Mini SD

Micro SD

 

همانطور که تصاویر فوق مشاهده می کنید ، کارت حافظه MMC دارای هفت پایه و کارت حافظه SD داری 9 پایه است. پروتکل مشترک بین تمام کارت های حافظه چه از نوع SD و یا MMC ، پروتکل SPI است ، پروتکل SPI غالبا در تمام انواع میکروکنترلر ها به صورت سخت افزاری موجود است و در صورت عدم وجود به راحتی قابل پیاده است. اگر قصد طراحی مداری را داشته باشیم که علاوه بر پشتیانی دو نوع حافظه SD/MCC در هر میکرویی قابل پیاده سازی باشد بهتر است از پروتکل SPI جهت برقراری ارتباط با کارت حافظه استفاده کنیم. البته لازم به ذکر است که اگر میکروکنترلر شما به صورت سخت افزای از رابط SDIO پشتیبانی می کنید ، قطعا سرعت رابط SOIO بالاتر است.

ولتاژ کاری کارت حافظه بسته به نوع آن متفاوت است. بسته به نوع کارت حافظه ولتاژ کاری میتواند بین 2.7 تا 3.6 متغییر باشد. مقدار دقیق ولتاژ کاری هر کارت حافظه را می توان از رجیستر OCR خواند. اما به صورت معمول ولتاژ 3.0 یا 3.3 جهت راه اندازی اولیه استفاده می شود. دقت کنید که کارت های حافظه با ولتاژ 5 ولت سازگاری ندارند و نباید این ولتاژ چه به عنوان تغزیه و چه به عنوان IO به آن اعمال شود.

مود SPI:

کارت های حافظه علاوه بر مود پیشفرض خود که بسته به نوع کارت می تواند مود MMC یا مود SDIO باشد ، از مود SPI نیز پشتیبانی می کند. در واقع SPI یک پروتکل ارتباطی همزان است که برای انتقال اطلاعات نیاز یه 4 رشته سیم دارد. با توجه به این مساله که در SPI سیگنال های دوطرفه (ورودی خروجی هم زمان مثل I2C) وجود ندارد ، پیاده سازی آن هم به لحاظ سخت افزاری و هم نرم افزاری ساده است. اگر میکروکنترلر شما به صورت سخت افزاری این پروتکل را پشتیبانی نمی کند ، اصلا جای نگرانی نیست زیرا که با در اختیار داشتن 4 پایه آزاد در سخت افزار خود ، به راحتی می تواند این پروتکل را به صورت نرم افزاری پیاده سازی کنید.

پروتکل SPI دارای 4 حالت کاری مختلف است که به SPI Mode معروف هستند. جهت برقراری ارتباط با کارت های حافظه ، فرقی نمی کند که کدام نوع کارت را استفاده می کنیدو باید رابط SPI خود را در حالت 0 یا Mode 0 پیکر بندی کنید.

حداقل سخت افزار مورد استفاده جهت اتصال میکروکنترلر به کارت حافظه را در شکل زیر مشاهده می کنید. فقط دقت داشته باشید که اگر ولتاژی کاری میکروی شما 5 ولت است باید از تبدیل سطح ولتاژ استفاده کنید. مقاومت Rpu هم ضروری است، بعضی از کارت های حافظه مقاومت پول آپ داخلی ندارند و نبود مقاومت Rpu باعث ایجاد خطا در کارکرد دستگاه شما خواهد شد.

ارسال دستور و دریافت پاسخ

در پروتکل SPI جهت خط های حامل دیتا ثابت است و داده به صورت سریال و بایت به بایت منتقل می شوند. همانطور که در عکس زیر مشاهده می کنید قالب دستورات ارسالی از میکروکنترلر به کارت حافظه ثابت است و شامل 6 بایت است. بایت اول مشخص کننده نوع دستور ، چهار بایت بعدی شامل پارامتر های مورد استفاده دستور مورد نظر است و بایت آخر هم CRC است که جهت اعتبار سنجی به کار برده می شوند. در حالت عادی کارت حافظه با یک کردن پایه DO نشان می دهد که آماده دریافت دستور است. بعد از دریافت دستور و انجام پردازش مربوط به آن کارت حافظه آماده ارسال جواب است (جواب ها در قالب های مشخصی ارسال می شوند.). با توجه به پروتکل SPI که ارتباط همیشه از سمت مستر مدیریت می شود ، میکروکنترلر باید به صورت پیوسته با ارسال 0xFF چک کند که آیا جوابی وجود دارد یا خیر.

کارت حافظه به اندازه Ncr فرصت دارد تا جواب مورد نظر را آماده کند ، مقدار Ncr بسته به نوع کارت متفاوت است ، برای کارت های SD این مقدار بین 0 تا 8 بایت متغییر است و در MMC بین 1 تا 8 بایت. در صورت آماده بودن جواب کارت کافظه با صفر کردن خط DO در یک سیکل کلاک و ارسال Flag مربوطه آمادگی خود را جهت ارسال جواب اعلام می کند.

خط CS قبل از ارسال هر دستور باید از حالت 1 به حالط 0 تغییر وضعیت بدهد و در حالت 0 باقی بماند تا کارت حافظه جواب دستور مورد نظر را ارسال نمایید. بایت CRC در مود SPI به صورت اختیاری است و از سمت کارت حافظه به آن اهمیتی داده نمی شود.

لیست دستورات SPI

با توجه به این که دو بیت پر ارزش Command Index (ارسال دستور) ثابت است ، فقط 6 بیت برای انتخاب دستور باقی می ماند که تشکیل 64 حالت یا دستور مجزا رو می دهد. با توجه به عکس فوق شماره Index هر دستور مقابل آن ذکر شده مثلا CMD25 دستور شماره 25 است که 4 بایت آدرس به عنوان پارامتر دریافت می کند و پاسخ را در قالب R1 ارسال می کند. برای مشاهده توضیحات بیشتر و دستورات کامل تر به برگه مشخات فنی کارت حافظه مربوطه مراجعه کنید.

پاسخ های دریافتی:

پاسخ های ارسالی از کارت حافظه در قالب های R1,R2,R3,R7 می باشد که پاسخ اکثر دستورات به صورت یک بایت و در قالب R1 ارسال می شود.  با ارزش ترین بیت R1 همیشه صفر است و ترتیب باقی بیت ها در عکس زیر قابل مشاهده است . در قالب R1 دریافت عدد 0 به معنی موفقیت آمیز بودن اجرای دستور است.

قالب های R3 و R7 که فقط برای دستورات CMD58 و CMD8 ارسال می شوند ، حاوی یک بایت R1 و 32 بیت دیتای مروبطه است.

 

نوشته های مشابه

4 دیدگاه در “همه چیز درباره راه اندازی MMC/SD قسمت اول

  1. Cozmo گفت:

    سلام
    من چطوری میتونم تاریخ رو به عنوان اسم فایل استفاده کنم؟
    ینی هر روز یه فایل به اسم تاریخ همون روز تولید شه

    1. زئوس Zeus زئوس Zeus گفت:

      سلام
      باید دقت داشته باشید که توی fat32 به صورت پیش فرض طول فایل ها نهایتا می تونند 8 کارکتر باشند (مگر با فعال کردن LFN) با این فرض شما با استفاده از تابع sprintf اسم فایل دلخواهتون که میتونه شامل هر متغییری باشه رو می سازید و استفاده می کنید
      به عنوان نمونه ، کد زیر رو ببینید
      char filename[13] = {0}
      sprintf(filename,"%02i%02i%02i.txt",year,mon,day);

  2. رضا گفت:

    ممنونم راهنمای جامعی بود

دیدگاهتان را بنویسید

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