خانه / دانش و مهارت / الکترونیک / آموزش اتصال کارت SD به میکروکنترلر AVR

آموزش اتصال کارت SD به میکروکنترلر AVR

در این ساختنی به شما یاد می دهیم چطور کارت SD را به انواع میکروکنترلر AVR وصل کنید. اگر از میکروکنترلر AVR برای ساخت پروژه های الکترونیکی استفاده می کنید با اتصال کارت SD به میکروکنترلر می توانید کارایی آن را به حداکثر برسانید، اطلاعات را روی کارت ذخیره کنید و … .

برای آموزش اتصال کارت SD به میکروکنترلر از برد ATMEGA16 استفاده می کنیم. این میکروکنترلر با منبع تغذیه ۵ ولتی کار می کند و فرکانس کریستال آن ۸MHz است. کدها هم برای کارت SD دو گیگی (Transcend) نوشته شده اما با اکثر انواع کارت SD کار می کند. البته برای اتصال کارت SD به میکروکنترلر باید آن را با FAT32 فرمت کنید. هدف اصلی این پروژه، خواندن فایل از سیستم FAT32 کارت SD توسط میکروکنترلر است.

بعد از فرمت کارت SD می توانید از کدهایی که در اختیارتان قرار می دهیم برای ارتباط با کارت استفاده کنید. در ادامه بیشتر درباره طرز کار سیستم فایل FAT32 و نحوه دسترسی به فایل های این سیستم توضیح می دهیم.

قبل از اینکه سراغ آموزش اتصال کارت SD به میکروکنترلر برویم، بهتر است کمی درباره طرز کار کارت SD بدانید.

گام اول: آشنایی با کارت SD

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

کنترلر کارت SD به ارتباط بخش هسته حافظه با دستگاه های خارجی مثل میکروکنترلر کمک می کند. این بخش می تواند به مجموعه ای از فرمان های SD استاندارد پاسخ بدهد و دیتا را از هسته حافظه برای دستگاه خارجی بخواند یا رایت کند.

ظرفیت بخش هسته حافظه همان سایز یا حجم کارت SD است. به غیر از بخش هسته حافظه، رجیسترهای خاص دیگری هم با کنترلر کارت مرتبط هستند. این رجیسترها در استتوس کارت SD ذخیره می شوند. محتوای این رجیسترها read only هستند.

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

در این پروژه برای ارتباط و اتصال کارت SD به میکروکنترلر از گذرگاه SPI استفاده می کنید. برخی از فرمان ها در حالت ارتباط SPI کارایی ندارند و سرعت ارتباط هم نسبت به حالت SD کمتر خواهد بود. اما این نوع ارتباط بسیار ساده است چون بیشتر میکروکنترلرها ماژول سخت افزار SPI توکار دارند.

تا به اینجا یاد گرفتید که کارت SD یک تراشه کنترلر داخلی و یک بخش هسته حافظه دارد. کنترلر داخلی فرمان ها را رمزگشایی می کند و ارتباط سریالی را فراهم می کند و بخش هسته حافظه هم محل ذخیره سیستم فایل است. بخش بعدی، مفهوم سطوح کارکردی کارت SD را براساس این اطلاعات توضیح می دهد.

سطوح کارکردی کارت SD

اجزای داخلی کارت SD را می توان با کمک مفهوم سطوح کارکردی توضیح داد. کارت SD سه لایه یا سطح کارکردی دارد:

  • سطح ارتباط سریالی
  • سطح فرمان های SD
  • سطح سیستم فایل

سطح ارتباط سریالی و سطح فرمان های SD داخل کنترلر کارت و سطح سیستم فایل داخل هسته حافظه قرار دارد. از آنجایی که هدف نهایی این پروژه خواندن فایل از سیستم فایل FAT32 کارت SD است، باید به هر سه سطح دسترسی داشته باشیم.

سطح ارتباط سریالی

این سطح ارتباط سریالی کارت SD با میکروکنترلر را فراهم می کند. همانطور که قبلاً گفتیم در این پروژه از گذرگاه SPI برای ارتباط سریالی استفاده می شود. دیاگرام زیر نحوه ارتباط چند کارت SD با میکروکنترلر را نشان می دهد:

در این نوع ارتباط، میکروکنترلر Host و کارت SD Slave نامیده می شود. میکروکنترلر انتقال داده ها را انجام می دهد. ساعت هم توسط میکروکنترلر کنترل می شود. در ضمن میکروکنترلر می تواند با ثابت کردن پین های CS مربوطه، بین کارت های SD یکی را انتخاب کند.

برای ارسال داده از میکروکنترلر به کارت SD از کانال MOSI و برای ارسال داده از کارت SD به میکروکنترلر از کانال MISO استفاده می شود.

در ساختنی بخوانید :  آموزش وصل کردن آردوینو به SIM900 با ارتباط سریال [Arduino]

پین اوت کارت SD برای ارتباط SPI را در جدول زیر آمده است:

میکروکنترلر ATMEGA16 که در این پروژه استفاده می شود، با منبع ۵ ولتی کار می کند اما کارت SD حداکثر ولتاژ ۳٫۳ ولت را قبول می کند. سطوح منطقی ۵ ولت و ۳٫۳ ولت متفاوت هستند و این اتصال کارت SD به میکروکنترلر را با مشکل مواجه می کند. دستگاهی که سطح منطقی ۳٫۳ ولتی دارد، ممکن است logic 0 دستگاه ۵ ولتی را logic 1 بخواند. همین طور دستگاهی که سطح منطقی ۵ ولتی دارد، ممکن است هردو logic 0 و logic 1 دستگاه ۳٫۳ ولتی را logic 0 بخواند. این مشکل با استفاده از مبدل سطح دوطرفه بین پین های SPI میکروکنترلر و کارت SD حل می شود.

مدار اتصال کارت SD به میکروکنترلر، مبدل سطح هم دارد و لازم نیست از قطعه جداگانه برای حل این مشکل استفاده کنید.

پروگرامر استفاده شده در این مدار USBasp است که خودش هم یک دستگاه SPI است. این پروگرامر با کارت SD به گذرگاه SPI وصل می شود. LM1117 برای تامین ولتاژ ۳٫۳ ولتی کارت SD و ولتاژ پایین مبدل سطح استفاده می شود. مبدل سطح یک دستگاه چهار کاناله با یک ماسفت برای کنترل هر کانال است. این نوع مبدل سطح برای SPIو گذرگاه های I2C مناسب است.

سطح فرمان SD

کارت SD فقط مجموعه مشخصی از فرمان های SD را قبول می کند. میکروکنترل با استفاده از این فرمان ها می تواند رجیسترهای کارت SD را بخواند و هسته حافظه را بخواند/رایت کند. کارت SD شش رجیستر اصلی دارد (اعداد داخل پرانتز عرض رجیسترها هستند):

  • CID – 128: شماره اختصاصی کارت که برای شناسایی استفاده می شود (ضروری).
  • RCA -16: آدرس نسبی کارت که آدرس محلی کارت است و توسط کارت ایجاد و بوسیله هاست تایید می شود (ضروری).
  • DSR -16: رجیستر مرحله درایور که درایورهای خروجی درایور را پیکربندی می کند (اختیاری).
  • CSD -128: داده مخصوص کارت که شامل اطلاعاتی درباره وضعیت کارت است (ضروری).
  • SCR -64: رجیستر پیکربندی SD که شامل اطلاعاتی درباره ویژگی های به خصوص کارت است (ضروری).
  • OCR – 32: رجیستر وضعیت کارت (ضروری).

تمام فرمان های SD که از حالت SPI پشتیبانی می کنند، ۶ بایت طول دارند. ابتدا MSB ارسال می شود و فرمان اصلی بایت اول را اشغال می کند. این بایت فرمان با استدلال ۴ بیتی مخصوص خودش دنبال می شود. بایت آخر هم بایت CRC مربوط به فرمان و بایت استدلال است. ساختار یک بلوک فرمان کارت SD در حالت ISP در تصویر زیر نشان داده شده است:

در حالت ISP، بایت CRC فقط برای برخی از فرمان ها ضروری است. CRC استفاده شده یک CRC 7 بیتی با مولد چندجمله ای حاصل از فرمول x7 + x+ ۱ است. محاسبه CRC به روش زیر انجام می شود:

G(x) = x7 + x3 + ۱

M(x) = (start bit) ? x39 + (host bit) ? x38 +…+ (last bit before CRC) ? x

[(CRC [6…0] = Remainder [ (M(x) ? x7) / G(x

CRC هفت بیتی، هفت بیت آخرین بایت فرمان را تشکیل می دهد و بیت هشتم همیشه باید یک باشد. با استفاده از معادلات بالا و شرط بیت آخر، بایت CRC برای فرمان های صفرم و هشتم به صورت ۰x95 و ۰x87 محاسبه می شوند. در تمام فرمان های دیگر، بایت CRC نادیده گرفته می شود (در اکثر کارت های SD اینطور است).

فرمان های SD استاندارد، استدلال های آنها و نوع پاسخ آنها در جداول زیر آمده است.

پاسخ فرمان

در حالت SPI، کارت SD به تمام فرمان های ورودی با سه نوع پاسخ فرمان R1، R2 و R3 پاسخ می دهد. هر بیت بلوک پاسخ شامل جزییات خاصی درباره وضعیت کارت SD است.

پاسخ – R1

پاسخ – R2

پاسخ – R3

پاسخ R3 فقط برای پنجاه و هشتمین فرمان (READ_OCR) در دسترس است.

فرمان های رایت داده

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

  • WRITE_BLOCK : رایت داده روی یک بلوک تکی
  • WRITE_MULTIPLE_BLOCK : رایت داده روی بلوک های چندگانه

در کارت SD، یک بلوک همیشه به عنوان یک مکان حافظه ۵۱۲ بایتی متوالی در نظر گرفته می شود. فرض کنید می خواهید یک بلوک که از دوهزارمین مکان حافظه شروع می شود را با کمی داده و با استفاده از فرمان WRITE_BLOCK رایت کنید. بسته فرمان باید شبیه فرمان زیر باشد:

 

در ساختنی بخوانید :  آموزش ساخت سرعت سنج دوچرخه با برد آردوینو و میکروکنترلر Atmega 328p

به محض ارسال فرمان، میکروکنترلر باید پاسخ R1 را ردیافت کند. تمام بیت های پاسخ باید ۰ باشند. بعد از دریافت بایت پاسخ R1 با ارزش ۰، میکروکنترلر می تواند داده هایی که باید روی کارت رایت شوند را ارسال کند. طول داده باید ۵۱۲ بایت باشد حتی اگر داده واقعی بایت های کمتری داشته باشد.

داده ۵۱۲ بایتی باید بعد از یک بایت Data Token بیاید و با بایت CRC 16 بیتی تمام بشود. این ۵۱۵ بایت (۲+۵۱۲+۱) بسته فرمان را تشکیل می دهند. Data Token بایتی است که تمام بیت های آن بجز LSB روی یک تنظیم شده باشند. فرمان بسته داده در تصویر زیر نشان داده شده است:

 

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

تفاوت فرمان WRITE_MULTIPLE_BLOCK با فرمان WRITE_BLOCK در این است که فقط یکبار ارسال می شود و بسته های ۵۱۲ بایتی بعدی روی بلوک های حافظه متوالی رایت می شوند.

پاسخ داده های رایت شده

کارت SD برای هر بلوک داده رایت شده، یک بایت پاسخ به میکروکنترلر ارسال می کند. محتوای بایت پاسخ به صورت زیر است:

بیت های وضعیت به این صورت معنی می شوند:

  • ۰۱۰ : داده پذیرفته شده است.
  • ۱۰۱: داده بخاطر خطای CRC رد شده است.
  • ۱۱۰ : داده بخاطر خطای رایت رد شده است.
فرمان های خواندن داده

برای خواندن داده از روی هسته حافظه از فرمان های زیر استفاده می کنیم:

  • READ_SINGLE_BLOCK : خواندن داده از بلوک تکی
  • READ_MULTIPLE_BLOCK : خواندن داده از بلوک های چندگانه

در کارت SD، یک بلوک همیشه به عنوان یک مکان حافظه ۵۱۲ بایتی متوالی در نظر گرفته می شود. فرض کنید می خواهید یک بلوک که از دوهزارمین مکان حافظه شروع می شود را با استفاده از فرمان READ_SINGLE_BLOCK بخوانید. بسته فرمان باید شبیه فرمان زیر باشد:

به محض ارسال فرمان، میکروکنترلر باید پاسخ R1 را ردیافت کند. تمام بیت های پاسخ باید ۰ باشند. بعد از دریافت بایت پاسخ R1 با ارزش ۰، میکروکنترلر می تواند داده های کارت SD را بخواند. در پاسخ هر فرمان READ_SINGLE_BLOCK، داده ۵۱۲ بایتی توسط کارت SD ارسال می شود.

داده ۵۱۲ بایتی باید بعد از یک بایت Data Token بیاید و با بایت CRC 16 بیتی تمام بشود. این ۵۱۵ بایت (۲+۵۱۲+۱) بسته فرمان را تشکیل می دهند. Data Token بایتی است که تمام بیت های آن بجز LSB روی یک تنظیم شده باشند. فرمان بسته داده در تصویر زیر نشان داده شده است:

اگر در حین فرایند خواندن داده مشکلی رخ داد، میکروکنترلر یک خطای Data Token تک بایتی دریافت می کند. بیت های خطای Data Token نشان دهنده نوع خطای رخ داده هستند که دیاگرام آنها را در زیر می بینید:

برای خواندن بلوک داده بعدی باید دوباره فرمان READ_SINGLE_BLOCK را بفرستید.

تفاوت فرمان READ_MULTIPLE_BLOCK با فرمان READ_SINGLE_BLOCK در این است که فقط یکبار ارسال می شود و بسته های ۵۱۲ بایتی بعدی روی بلوک های حافظه متوالی رایت می شوند.

فرمان های راه اندازی کارت حافظه

برای اینکه کارت SD بتواند به این فرمان ها پاسخ بدهد، باید آن را در حالت SPI راه اندازی کنید. برای راه اندازه کارت SD، باید فرمان های مشخصی را ارسال کنید. کارت SD هنگام ریست روی حالت ارتباط SD قرار دارد. در نتیجه اولین فرمانی که به کارت SD ارسال می شود باید شامل بایت CRC مناسب باشد.

مراحل راه اندازی کارت SD در حالت ISP در دیاگرام بلوکی زیر آمده است:

بعد از راه اندازی کارت SD، می توانید استفاده از فرمان های Read و Write را شروع کنید. فرمن های سطح فرمان SD معمولاً برای ارتباط با سطح سیستم فایل استفاده می شوند.

سطح سیستم فایل

در این بخش ویژگی های سیستم فایل FAT32 و چگونگی خواندن داده ها از این سیستم را توضیح می دهیم. وقتی کارت SD فرمت می شود، سیستم فایل FAT32 روی هسته مموری رایت شده است. FAT32 مخفف عبارت File Allocation Table 32 است که به معنای یک میز توزیع فایل به طول ۳۲ بیت است.

کل دیتای یک فایل در هسته حافظه اسکرمبل می شود و FAT مکان بلوک بعدی را به نسبت به مکان بلوک فعلی نگه می دارد.

در ساختنی بخوانید :  با برد ATtiny85 یک توان سنج یا پاورمتر ساده و کاربردی بسازید

بخش ها

هسته حافظه، مکان های حافظه ۸ بیتی (یک بایتی) دارد. مکان های حافظه ۸ بیتی متوالی در چند بخش گروه بندی شده اند. بخش FAT32 معمولاً به ازای هر بخش ۵۱۲ بایت دارد. گروه بندی بایت های حافظه که بخش ها را شکل می دهد، در تصویر زیر آمده است:

دسته ها

دسته ها از گروه بندی بخش های متوالی شکل می گیرند. تعداد بخش های هر دسته به سایز کل سیستم فایل بستگی دارد. گروه بندی بخش ها که دسته ها را شکل می دهد، در تصویر زیر آمده است:

ذخیره اسکرمبل شده

کل دیتای یک فایل در هسته حافظه به شکل دسته های داده اسکرمبل می شود. تصویر زیر نشان می دهد چطور داده های سه فایل با نام های A، B و C روی هسته حافظه اسکرمبل شده اند. FAT هم مکان دسته بعدی را در نسبت با دسته فعی نگه می دارد.

فرمت سیستم فایل FAT32

سیستم فایل FAT32 با فرمت خاص تعریف شده ای روی هسته حافظه ذخیره یا رایت می شود. در ابتدای هسته حافظه، بخش های مخصوص تعریف شده ای وجود دارد که با چند دسته دنبال می شوند. فرمت سیستم فایل FAT32 در تصویر زیر نشان داده شده است:

 

بخش اول MBR است که در ادامه آن تعداد قابل توجهی از بخش های استفاده نشده قرار دارد. بعد از بخش های استفاده نشده، بخش های رزرو شده قرار دارند که اولین بخش آنها بخش BOOT است. بعد از بخش رزرو شده بخش FAT قرار دارد. تعداد بخش های FAT به سایز سیستم فایل بستگی دارد. بخش های FAT هم با چند بخش مخفی شده دنبال می شوند. بعد از بخش های مخفی شده هم دسته ها قرار دارند. در ادامه این بخش ها را به صورت جداگانه بررسی می کنیم.

منطق خواندن فایل از سیستم فایل FAT32

با استفاده از منطقی که در دیاگرام زیر آمده می توانید یک فایل با نام مشخص را از روی سیستم فایل FAT32 فرمت شده بخوانید. اگر دقیق به دیاگرام نگاه کنید متوجه می شوید که هر فرایند در نهایت به خواندن یک بخش ختم می شود. خواندن بخش ها از روی هسته حافظه در سطح فرمان SD و با فرمان READ_SINGLE_BLOCK میسر می شود.

استفاده از FAT32

FAT32 بخش هایی هستند که هر ۳۲ بیت متوالی آنها یک دسته شامل چندین دسته را نگه می دارد. یعنی هر ۳۲ بیت به سمت یک دسته نشانه گرفته شده اند. چون هر دسته ۵۱۲ بایت دارد، داخل بخش ۱۲۸ دسته نشانگر داخل بخش وجود دارد. همین میز توزیع ۳۲ بیتی FAT32 را شکل می دهد.

شماره دسته نشانگر بعدی داخل FAT32 نسبت به تعداد دسته فعلی با معادله زیر حساب می شود:

 

(شماره اولین بخش پارتیشن + تعداد بخش های رزرو شده + (شماره دسته فعلی*۴)/بایت های هر بخش)= شماره بخش FAT دسته نشانگر بعدی.

تصویر زیر روش خواندن یک فایل اسکرمبل شده روی هسته حافظه با FAT32 را نشان می دهد:

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

گام دوم: مدار را بسازید

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

گام سوم: کدها را آپلود کنید

کدهای میکروکنترلر را از لینک زیر دانلود کنید (رمز فایل saakhtani.ir است). چون کارت SD سه سطح کارکردی دارد (سطح ارتباط سریالی، سطح فرمان SD و سطح سیستم فایل)، کدنویسی این سطوح هم جداگانه انجام شده و سپس کدها با هم ترکیب شده اند. سطوح کدها را در تصویر زیر می بینید:

میکروکنترلر برای خواندن و رایت داده ها از سطح سیستم فایل استفاده می کند. سطح سیستم فایل برای ارتباط با سطح فرمان های SD فقط از فرمان READ_SINGLE_BLOCK استفاده می کند. سطح فرمان های SD هم برای ارتباط با سطح ارتباط سریالی از انتقال SPI و درخواست های SPI استفاده می کند. کل سیستم میکروکنترلر هم از طریق گذرگاه ارتباط SPI با کارت SD ارتباط برقرار می کند.

منبع

خلاصه مطلب
آموزش اتصال کارت SD به میکروکنترلر AVR
عنوان مطلب
آموزش اتصال کارت SD به میکروکنترلر AVR
توضیح کوتاه
هر چیزی که می خواهید درباره کارت SD و اتصال آن به میکروکنترها بدانید، در این ساختنی آمده است.
نویسنده
ساختنی
ساختنی

بیشتر بخوانید:

آموزش کنترل LED با استفاده از میکروکنترلر AVR (سه پروژه ساده با LED)... این ساختنی یک گام دیگر در یادگیری بیشتر در مورد میکروکنترلر AVR است. ساختنی سه پروژه ساده مبتنی بر LED برای آموزش کنترل LED با استفاده از میکروکنترلر ...
دستگاه هویه رومیزی بسازید و از لحیم کاری لذت ببرید !... یکی از ابزار های مهمی که باید روی میز کار همه دوستانداران مدارات الکترونیکی باشد، دستگاه هویه است . برای این که صاحب یک دستگاه لحیم باشید لازم نیست حت...
آموزش ساخت پروگرامر برای میکروکنترلرهای AVR و PIC... در این پست آموزش ساخت پروگرامر USB را یاد می گیرید که برای میکروکنترلرهای AVR و PIC قابل استفاده است. هزینه ساخت پروگرامر خیلی کمتر از خرید پروگرامر آ...
با درایور DVD دستگاه CNC نقشه کش بسازید در این ساختنی ساده ترین و ارزان ترین راه برای ساخت دستگاه CNC نقشه کش را یاد می گیرید. در این روش بجای ساخت کامل بدنه و قطعات از درایور DVD استفاده می...
دماسنج دیجیتال چندکاره با میکرو کنترلر ATMEGA168 بسازید!... در این ساختنی طرز ساخت یک دماسنج دیجیتال را یاد می گیرید که قابلیت های زیادی دارد. مهمترین مزیت این دماسنج دیجیتال این ست که نمایشگر دارد و خواندن درج...
مدار راه انداز LCD کاراکتری با میکرو کنترلر های AVR... این ساختنی یک گام دیگری در یادگیری بیشتر در مورد پروژه های میکروکنترلر AVR است. در این ساختنی ارتباط ماژول LCD با میکروکنترلر ATmega328 را نشان می دهی...

درباره عاطفه اسدزاده

عاطفه اسدزاده

عاطفه اسدزاده،یکی از نویسندگان وبسایت ساختنی است.

پیشنهاد می کنیم

آموزش کنترل LED

آموزش کنترل LED با استفاده از میکروکنترلر AVR (سه پروژه ساده با LED)

این ساختنی یک گام دیگر در یادگیری بیشتر در مورد میکروکنترلر AVR است. ساختنی سه …

پاسخ دهید