پین اوت کارت دیجیتال امن (SD). اتصال کارت SD به میکروکنترلر مدیریت کارت SD

کارت‌های SD بر اساس فرمت کارت‌های چند رسانه‌ای قدیمی (MMC) هستند، اما بیشتر آنها از نظر فیزیکی کمی ضخیم‌تر از کارت‌های MMC هستند. آنها همچنین دارای نرخ انتقال داده بالاتری هستند. ویژگی های DRM در دسترس هستند اما کم استفاده می شوند. ابعاد کارت‌های SD معمولاً 32 میلی‌متر × 24 میلی‌متر در 2.1 میلی‌متر است، اما می‌توانند مانند کارت‌های MMC ضخامتی به اندازه 1.4 میلی‌متر داشته باشند.

درجات سرعت متفاوتی وجود دارد. آنها با همان علامت nx به عنوان CD-ROM نامیده می شوند. مضربی از 150 کیلوبایت بر ثانیه دستگاه‌های دارای اسلات SD می‌توانند از کارت‌های MMC نازک‌تر استفاده کنند، اما کارت‌های SD استاندارد در اسلات‌های نازک‌تر MMC جا نمی‌شوند. کارت های MiniSD و MicroSD را می توان مستقیماً در اسلات های SD با آداپتور استفاده کرد. خواننده هایی وجود دارند که به کارت های SD امکان دسترسی از طریق بسیاری از درگاه های اتصال مانند USB، FireWire را می دهند.

سنجاق حالت SD حالت SPI
نام تایپ کنید شرح نام تایپ کنید شرح
1 CD/DAT3 I/O/PP شناسایی کارت / خط داده رابط 3 C.S. من انتخاب تراشه در وضعیت پایین
2 CMD PP خط فرمان/پاسخ D.I. من ورود اطلاعات
3 Vss1 اس GND VSS اس GND
4 Vdd اس منبع تغذیه VDD اس منبع تغذیه
5 CLK من ساعت SCLK من ساعت
6 Vss2 اس GND VSS2 اس GND
7 DAT0 I/O/PP خط داده کانکتور 0 انجام دادن O/PP خروجی داده
8 DAT1 I/O/PP خط داده کانکتور 1 RSV
9 DAT2 I/O/PP خط داده کانکتور 2 RSV

رابط کارت SD با عملیات استاندارد کارت MMC سازگار است. تمام حافظه‌های SD و کارت‌های SDIO برای پشتیبانی از حالت SPI/MMC قدیمی‌تر مورد نیاز هستند که از رابط سریال چهار سیمه کمی کندتر (ساعت، ورودی سریال، خروجی سریال، انتخاب چیپ) که با پورت‌های SPI در بسیاری از میکروکنترلرها سازگار است، پشتیبانی می‌کند. بسیاری از دوربین های دیجیتال، پخش کننده های صوتی دیجیتال و سایر دستگاه های قابل حمل احتمالاً منحصراً از حالت MMC استفاده می کنند. حالت MMC دسترسی به ویژگی‌های رمزگذاری اختصاصی کارت‌های SD را فراهم نمی‌کند و اسناد SD رایگان این ویژگی‌ها را توصیف نمی‌کنند. از آنجایی که رمزگذاری SD اساساً برای تولیدکنندگان رسانه وجود دارد، برای مصرف‌کنندگانی که معمولاً از کارت‌های SD برای نگهداری داده‌های محافظت نشده استفاده می‌کنند، کاربرد چندانی ندارد.

سه حالت انتقال توسط SD پشتیبانی می‌شود: حالت SPI (سریال مجزا به داخل و خارج سریال)، حالت SD تک بیتی (کانال‌های فرمان و داده جداگانه و فرمت انتقال اختصاصی) و حالت SD چهار بیتی (از پین‌های اضافی به اضافه مقداری استفاده می‌کند). پین‌های تخصیص مجدد) برای پشتیبانی از انتقال‌های موازی با عرض چهار بیت. کارت های کم سرعت از سرعت داده 0 تا 400 کیلوبیت بر ثانیه و حالت های انتقال SPI و یک بیت SD پشتیبانی می کنند. کارت های پرسرعت از سرعت داده 0 تا 100 مگابیت بر ثانیه در حالت چهار بیتی و 0 تا 25 مگابیت بر ثانیه در حالت SPI و یک بیت SD پشتیبانی می کنند.

ویژگی های امنیتی کارت SD عبارتند از:

  • مکانیسم حفاظت از حق چاپ با استاندارد SDMI (ابتکار موسیقی دیجیتال امن)
  • سیستم یکپارچه حفاظت و رمزگذاری فایل CPRM (CPRM یک محافظ محتوا برای رسانه های قابل ضبط است)

دستگاه های مبتنی بر میکروکنترلر استفاده می کنند حافظه خارجی. اگر نیاز به ذخیره واحدهای مگابایت دارید، چیپ های حافظه فلش سریال مناسب هستند. با این حال، برای حجم های زیاد (ده ها تا صدها مگابایت)، معمولاً از نوعی کارت حافظه استفاده می شود. در حال حاضر کارت‌های SD و microSD رایج‌ترین هستند و من می‌خواهم در مورد آنها در یک سری مطالب صحبت کنم. در این مقاله در مورد اتصال کارت های SD به میکروکنترلر صحبت خواهیم کرد و در ادامه نحوه خواندن یا نوشتن داده ها بر روی آنها را خواهیم فهمید.

پینوت کارت های SD و microSD

کارت های SD می توانند در دو حالت کار کنند - SD و SPI. هدف پین های کارت و نمودار اتصال به حالت استفاده شده بستگی دارد. میکروکنترلرهای 8 بیتی AVR پشتیبانی سخت افزاری برای حالت SD ندارند، بنابراین معمولاً از کارت هایی با آنها در حالت SPI استفاده می شود. میکروکنترلرهای 32 بیتی مبتنی بر هسته ARM، به عنوان مثال AT91SAM3، یک رابط برای کار با کارت ها در حالت SD دارند، بنابراین می توانید از هر حالت عملیاتی در آنجا استفاده کنید.

تخصیص مخاطبین کارت SD در حالت SD


تخصیص مخاطبین کارت SD در حالت SPI

تخصیص مخاطبین کارت microSD در حالت SD



تخصیص مخاطبین کارت microSD در حالت SPI



اتصال کارت های SD و microSD به میکروکنترلر در حالت SPI

ولتاژ تغذیه کارت‌های SD 2.7 - 3.3 V است. اگر میکروکنترلر مورد استفاده با همان ولتاژ تغذیه می‌شود، می‌توان SD را مستقیماً به میکروکنترلر متصل کرد. نمودار صحیح نژادی که با مطالعه مشخصات روی کارت های SD و شماتیک های بردهای توسعه مختلف گردآوری شده است، در شکل زیر نشان داده شده است. بر اساس این طرح، کارت ها به تابلوهای توسعهشرکت های Olimex و Atmel.

نمودار پین های کارت SD را نشان می دهد، نه کانکتور.


L1 - فریت یا چوک، دارای امتیاز جریان بیش از 100 میلی آمپر. برخی آن را نصب می کنند، برخی بدون آن انجام می دهند. اما چیزی که واقعاً نباید از آن غافل شوید خازن قطبی C2 است. از آنجایی که وقتی کارت وصل می‌شود، افزایش جریان رخ می‌دهد، ولتاژ منبع تغذیه کاهش می‌یابد و میکروکنترلر می‌تواند ریست شود.

در مورد مقاومت های کششی ابهاماتی وجود دارد. از آنجایی که کارت های SD توسط چندین سازنده ساخته می شوند، مشخصات مختلفی برای آن ها وجود دارد. برخی از اسناد به وضوح نیاز به مقاومت های کششی را نشان می دهند (حتی برای خطوط استفاده نشده - 8، 9)، در حالی که سایر اسناد حاوی این دستورالعمل ها نیستند (یا من آنها را پیدا نکردم).

یک نسخه ساده شده از مدار (بدون مقاومت کششی) در شکل زیر نشان داده شده است. این مدار به صورت عملی تست شده و در بردهای میکروالکترونیکا کاربرد دارد. همچنین در بسیاری از پروژه های آماتوری که در اینترنت یافت می شوند استفاده می شود.



در اینجا خطوط سیگنال کارت SD توسط میکروکنترلر بالا نگه داشته می شود و خطوط استفاده نشده (8، 9) به جایی متصل نمی شوند. در تئوری، آنها باید در داخل کارت SD کشیده شوند. در ادامه بر روی این طرح خواهم ساخت.

اگر میکروکنترلر با ولتاژی متفاوت از ولتاژ تغذیه کارت SD تغذیه می شود، به عنوان مثال 5 ولت، سطوح منطقی باید هماهنگ شوند. نمودار زیر نمونه ای از تطبیق سطوح کارت و میکروکنترلر با استفاده از تقسیم کننده ولتاژ را نشان می دهد. اصل تطبیق سطح ساده است - شما باید 3.0 - 3.2 ولت را از 5 ولت دریافت کنید.



خط MISO - DO حاوی تقسیم کننده ولتاژ نیست، زیرا داده های روی آن از کارت SD به میکروکنترلر منتقل می شود، اما برای محافظت در برابر احمق ها، می توانید یک تقسیم کننده ولتاژ مشابه را نیز در آنجا اضافه کنید، این بر عملکرد دستگاه تأثیر نمی گذارد. مدار

اگر از یک تراشه بافر مانند CD4050 یا 74AHC125 برای مطابقت با سطوح استفاده می کنید، می توان از این معایب اجتناب کرد. در زیر مداری وجود دارد که تطبیق سطح با استفاده از آی سی 4050 انجام می شود. این آی سی دارای 6 بافر غیر معکوس است. بافرهای تراشه های استفاده نشده "خفه" هستند.

اتصال کارت های microSD مشابه است، فقط شماره پین ​​آنها کمی متفاوت است. من فقط یک نمودار می دهم.



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

اتصال کارت های SD و microSD به میکروکنترلر در حالت SD

خوب، برای تکمیل تصویر، نموداری برای اتصال یک کارت SD در حالت اصلی آن ارائه می دهم. این امکان تبادل اطلاعات با سرعت بالاتر از حالت SPI را فراهم می کند. با این حال، همه میکروکنترلرها رابط سخت افزاری برای کار با کارت در حالت SD ندارند. به عنوان مثال، میکروکنترلرهای ARM Atmel SAM3/SAM4 آن را دارند.



گذرگاه داده DAT را می توان در حالت های 1 بیتی یا 4 بیتی استفاده کرد.

ادامه دارد...

روز همگی بخیر! امروز در مورد آن صحبت خواهیم کرد اتصال کارت حافظه SDبه میکروکنترلر STM32.

به نظر می رسد که کنترلرهای STM32F10x حافظه زیادی دارند، چرا بیشتر وجود دارد، اما این تصور فریبنده است) به عنوان مثال، ما باید چند عدد را نمایش دهیم. تصاویر مختلف– فرمت 320*240 – یعنی 76800 پیکسل که هر کدام معادل 2 بایت است. بنابراین ما حدود 150 کیلوبایت در هر تصویر دریافت می کنیم. و این با استانداردهای یک میکروکنترلر بسیار زیاد است، و این یک واقعیت نیست که بتوان دو تصویر مختلف را در حافظه فلش آن قرار داد. یا اینکه برای مثال نیاز به ذخیره حجم زیادی از اطلاعات، داده های برخی از سنسورها داریم. علاوه بر این، به طوری که این داده ها حتی پس از خاموش شدن برق در دسترس هستند. اینجاست که حافظه خارجی به کار می آید. و یک راه حل عالی خواهد بود کارت حافظه SDیا MMC. به هر حال، در این مقاله آزمایشاتی را در مورد انجام خواهیم داد کارت میکرو SD.

ابتدا چند کلمه در مورد خود کارت حافظه یا به طور دقیق تر در مورد pinout آن. کل ماجرا به این شکل است:

بنابراین ما اینجا چی داریم؟ خوب، بلافاصله مشخص می شود که هشت پین دارد. تخصیص پین ها به شرح زیر است (از چپ به راست):


ستون SPI Mode به ما اشاره می کند که با استفاده از رابط SPI با میکروکنترلر تعامل دارد. ولی! ما مسیر متفاوتی را در پیش خواهیم گرفت 😉 نکته اینجاست که STM32 یک ماژول جانبی آماده برای کار با کارت های حافظه روی خود دارد که SDIO نام دارد.

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

به هر حال، STM همچنین از مستندات خوب در مورد این موضوع خشنود است. در اینجا، برای مثال، توصیف همراه با جزئیاتمقداردهی اولیه برای کارت حافظه SD (همه چیز به طور مشابه برای انواع دیگر کارت ها توضیح داده شده است):

خوب، در واقع، زمان آن رسیده که به یک مثال عملی برویم. بیایید کتابخانه محیطی استاندارد را بررسی کنیم.

در پرونده stm32f10x_sdio.hبه طور سنتی، ساختارهایی را برای انواع تنظیمات پیدا می کنیم - یعنی برای انتخاب منبع سیگنال ساعت، فرکانس کنترل کننده SDIO و تنظیم تعداد بایت های منتقل شده. همه چیز در آنجا آنقدر سخاوتمندانه در مورد آن نظر داده شده است که من حتی نمی خواهم آن را جداگانه تکرار کنم)) فقط نگاه کنید:

ساختار typedef (uint32_t SDIO_ClockEdge; /* انتقال ساعتی را مشخص می کند که بر روی آن ضبط بیت انجام می شود. این پارامتر می تواند مقدار @ref SDIO_Clock_Edge */ باشد uint32_t SDIO_ClockBypass. /* مشخص می کند که آیا دور زدن تقسیم کننده ساعت SDIO فعال یا غیرفعال باشد. این پارامتر می تواند مقدار @ref SDIO_Clock_Bypass */ باشد uint32_t SDIO_ClockPowerSave. /* مشخص می کند که خروجی SDIO Clock زمانی که گذرگاه بیکار است فعال یا غیرفعال شود. این پارامتر می تواند مقدار @ref SDIO_Clock_Power_Save */ باشد uint32_t SDIO_BusWide; /* عرض گذرگاه SDIO را مشخص می کند. این پارامتر می تواند مقدار @ref SDIO_Bus_Wide */ باشد uint32_t SDIO_HardwareFlowControl; /* مشخص می کند که آیا کنترل جریان سخت افزاری SDIO فعال یا غیرفعال باشد. این پارامتر می تواند مقدار @ref SDIO_Hardware_Flow_Control */ باشد uint8_t SDIO_ClockDiv; /* فرکانس ساعت کنترلر SDIO را مشخص می کند. این پارامتر می تواند مقداری بین 0x00 و 0xFF باشد. */) SDIO_InitTypeDef; ساختار typedef (uint32_t SDIO_Argument; /* آرگومان فرمان SDIO را مشخص می کند که به عنوان بخشی از پیام فرمان به کارت ارسال می شود. اگر دستوری حاوی آرگومان باشد، باید قبل از نوشتن دستور در ثبات فرمان در این ثبات بارگذاری شود */ uint32_t SDIO_CmdIndex; /* نمایه فرمان SDIO را مشخص می کند. باید کمتر از 0x40 باشد. */ uint32_t SDIO_Response. /* نوع پاسخ SDIO را مشخص می کند. این پارامتر می تواند مقدار @ref SDIO_Response_Type */ باشد uint32_t SDIO_Wait; /* مشخص می کند که درخواست انتظار برای وقفه SDIO فعال یا غیرفعال باشد. این پارامتر می تواند مقدار @ref SDIO_Wait_Interrupt_State */ باشد uint32_t SDIO_CPSM; /* مشخص می کند که دستگاه وضعیت مسیر فرمان SDIO (CPSM) فعال یا غیرفعال باشد. این پارامتر می تواند مقدار @ref SDIO_CPSM_State */ باشد) SDIO_CmdInitTypeDef; ساختار typedef (uint32_t SDIO_DataTimeOut; /* مدت زمان پایان داده را در دوره های ساعت اتوبوس کارت مشخص می کند. */ uint32_t SDIO_DataLength; /* تعداد بایت های داده ای که باید منتقل شوند را مشخص می کند. */ uint32_t SDIO_DataBlockSize; /* اندازه بلوک داده را برای انتقال بلوک مشخص می کند. این پارامتر می تواند مقدار @ref SDIO_Data_Block_Size */ باشد uint32_t SDIO_TransferDir; /* جهت انتقال داده را مشخص می کند، خواه این انتقال خواندن یا نوشتن باشد. این پارامتر می تواند مقدار @ref SDIO_Transfer_Direction */ باشد uint32_t SDIO_TransferMode. /* مشخص می کند که انتقال داده در حالت استریم یا بلوک باشد. این پارامتر می تواند مقدار @ref SDIO_Transfer_Type */ باشد uint32_t SDIO_DPSM; /* مشخص می کند که دستگاه وضعیت مسیر داده SDIO (DPSM) فعال یا غیرفعال باشد. این پارامتر می تواند مقدار @ref SDIO_DPSM_State */ باشد) SDIO_DataInitTypeDef;

بیایید توجه کنیم که SPL چگونه انتقال دستورات را به کارت حافظه اجرا می کند. ساختار جداگانه ای برای این اهداف اختصاص داده شده است. SDIO_CmdInitTypeDef.در زمینه SDIO_CmdIndexکد دستوری را در فیلد وارد کنید SDIO_Argument– آرگومان فرمان، فیلدهای باقیمانده را نیز پر کنید. تنها چیزی که باقی می ماند این است که به نحوی این داده ها را در خود جای دهیم کارت میکرو SD 😉 و برای این یک تابع برای ما آماده کردند:

SDIO_SendCommand (SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)

به عنوان یک استدلال، ساختاری که ایجاد کردیم به آن منتقل می کنیم. برای ثبت داده ها یک تابع وجود دارد - SDIO_WriteData(Uint32_t Data). پس از فراخوانی این تابع، داده ها در یک ثبات که مخصوص این منظور طراحی شده است قرار می گیرند - SDIO_FIFO.

این نحوه کار با ماژول SDIO در STM32F10x است)

حالا بیایید در نهایت به سراغ تمرین برویم. من دوباره با برد Mini STM32 کار خواهم کرد، زیرا چینی های مهربان با نصب یک اسلات برای کارت حافظه micro SD روی آن متحیر شدند. در اینجا یک نمودار از اتصال کانکتور کارت به میکروکنترلر آمده است:

برای نوشتن برنامه از یک مثال آماده برای Keil استفاده می کنیم - از آنجا دو فایل می گیریم که در آنها چیزی شبیه درایور کار با کارت ها پیاده سازی شده است - اینها فایل ها هستند. sdcard.cو sdcard.h.ما ایجاد می کنیم پروژه جدیداین فایل ها را در آنجا ضمیمه می کنیم و البته علاوه بر آن فایل های CMSIS و SPL. در اینجا پروژه تمام شده است که در آن همه چیز قبلاً اضافه شده است - تنها چیزی که باقی می ماند نوشتن کد برای تابع main () است.

فایل sdcard.c انواع توابع را برای کار با کارت حافظه پیاده سازی می کند، اکنون تنها کاری که باید انجام دهیم این است که از آنها استفاده کنیم 😉 بیایید کد را بنویسیم! به عنوان مثال، بیایید 512 بایت داده آزمایشی را در micro SD بنویسیم و سپس سعی کنیم آنها را بخوانیم:

// فایل های لازم را پیوند دهید#include "stm32f10x.h" #include "sdcard.h" /*******************************************************************/ // آرایه های داده های ورودی و خروجی و متغیری برای ذخیره داده ها// درباره کارت ما uint8_t writeBuffer[ 512 ] ; uint8_t readBuffer[ 512] ; SD_CardInfo SDCardInfo; /*******************************************************************/ int main() ( // داده ها را برای نوشتن آزمایش کنیدبرای (uint16_t i = 0 ; i< 512 ; i++ ) { writeBuffer[ i] = i % 256 ; readBuffer[ i] = 0 ; } // نقشه را مقدار دهی اولیه کنید SD_Init(); // اطلاعات مربوط به کارت را دریافت کنید SD_GetCardInfo(& SDCardInfo) ; // انتخاب کارت و تنظیم حالت کار SD_SelectDeselect((uint32_t ) (SDCardInfo.RCA<< 16 ) ) ; SD_SetDeviceMode(SD_POLLING_MODE) ; // و بالاخره نوشتن و خواندن SD_WriteBlock(0x00، writeBuffer، 512); SD_ReadBlock(0x00، readBuffer، 512); در حالی که (1) ( ) /*******************************************************************/

لطفاً توجه داشته باشید که کارت SD از ضبط در بلوک های 512 بایتی پشتیبانی می کند.

اگر برنامه را تحت دیباگر اجرا کنیم، می بینیم که داده های خوانده شده با داده های نوشته شده مطابقت دارد =) بنابراین می توانیم آزمایش را موفقیت آمیز بدانیم. برای امروز تمام شد، به زودی می بینمت!

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

این پروژه در ابتدا از یک کارت حافظه microSD 1 گیگابایتی استفاده می کرد. میکروکنترلر ATmega8 یا ATmega32 است که با فرکانس 8 مگاهرتز از یک اسیلاتور RC داخلی کار می کند. علاوه بر این، یک رابط RS-232 برای اتصال نمونه اولیه به یک رایانه شخصی برای نظارت بر داده ها استفاده شد. برای تبدیل سطوح منطقی رابط از تراشه MAX232 استفاده می شود. برای تغذیه مدار، یک منبع تغذیه تثبیت شده 3.3 ولت مورد نیاز است (تراشه MAX232 برای ولتاژ تغذیه 5 ولت طراحی شده است، با این حال، همانطور که تمرین نشان داده است، در 3.3 ولت کار می کند). اتصال کارت حافظه با استفاده از یک مدار 7 سیم مطابق با پین اوت (شکل را ببینید).

نمودار شماتیک برای میکروکنترلر ATmega8.

مقاومت های کششی R1، R2 با مقدار اسمی 51 کیلو اهم رابط SPI پایداری بهتری را هنگام کار با کارت های مختلف ارائه می دهند. دیودهای Zener D1, D2 برای محافظت از کارت حافظه در حین کار برنامه نویس مدار (ISP) طراحی شده اند. پین های ریز مدار MAX232 VCC و GND روی نمودارها نشان داده نمی شوند، اما باید به نقاط مربوطه در نمودار متصل شوند.

نمودار مدار میکروکنترلر ATmega32

نمودار شماتیک برای میکروکنترلر ATmega32 (ساعت بلادرنگ اضافه شده بر روی تراشه DS1307)

همانطور که متوجه شدید، آخرین نسخه دستگاه از یک منبع 12 ولت تغذیه می شود و برد دارای دو تنظیم کننده ولتاژ 5.0 ولت (LM7805) و 3.3 ولت (LM1117-3.3) است. برای تغذیه رابط کارت SD از 3.3 ولت استفاده می شود، بقیه مدار از منبع 5.0 ولت تغذیه می شود.تراشه ساعت بلادرنگ DS1307 در پیکربندی استاندارد قرار دارد و به رابط I2C میکروکنترلر متصل است.

ابتدا، قالب انتقال داده "خام" با استفاده از مثالی از عملیات خواندن هر بلوک داده، خواندن و نوشتن چندین بلوک داده، پاک کردن چندین بلوک، نوشتن داده ها در هر بلوک حافظه SD مورد مطالعه قرار گرفت. این دستگاه که روی یک تخته نان مونتاژ شده بود، از طریق رابط RS-232 به کامپیوتر متصل شد. برای نمایش داده های خوانده شده از کارت حافظه و همچنین برای وارد کردن و نوشتن داده ها در کارت، از برنامه HyperTerminal (یا مشابه) در رایانه استفاده کنید.

پس از اجرای موفقیت آمیز تبادل اطلاعات بدون مشخصات، کارت حافظه در سیستم عامل ویندوز XP فرمت (FAT32) شد، سپس چندین فایل متنی، دایرکتوری و انواع دیگر فایل ها بر روی کارت (در فهرست اصلی کارت) نوشته شد. پس از این، روال ها و توابع برای کار با سیستم فایل FAT32 برای خواندن فایل ها، به دست آوردن لیستی از فایل های کارت حافظه (با استفاده از HiperTerminal)، برای به دست آوردن اطلاعات در مورد مقدار کامل و رایگان حافظه نوشته شد.

نمای پنجره برنامه HiperTerminal با عملکردهایی برای کار با کارت حافظه SD:

بیش از 10 گزینه برای کار با کارت حافظه (برای نسخه دارای ساعت) به کاربر ارائه می شود.

گزینه های 0 - 4اینها توابع سطح پایین هستند. پس از استفاده از گزینه های 0 - 3، قبل از استفاده از روال های FAT32 باید کارت را دوباره فرمت کنید.
گزینه های 5 - 9- به فایل سیستم FAT32 مراجعه کنید. در حال حاضر، فقط نام فایل های کوتاه پشتیبانی می شود (8 بایت - نام فایل، 3 بایت - پسوند فایل). اگر فایل هایی با نام طولانی نوشته شوند، در برنامه ترمینال با فرمت کوتاه نمایش داده می شوند. برای تست این گزینه ها فراموش نکنید که کارت را در سیستم فایل FAT32 فرمت کنید و چندین دایرکتوری و فایل متنی را یادداشت کنید.

شرح گزینه ها:

0 - بلوک ها را پاک کنید- پاک کردن تعداد بلوک های انتخاب شده که از تعداد مشخص شده شروع می شود.
1 - تک بلوک را بنویسید- نوشتن داده ها در یک بلوک با یک آدرس خاص. داده ها از صفحه کلید در برنامه Hiperterminal وارد می شوند.
2 - تک بلوک را بخوانید- خواندن داده ها از یک بلوک با یک آدرس خاص. داده های خوانده شده در پنجره برنامه ترمینال نمایش داده می شود.
3 - نوشتن چند بلوک- ضبط چندین بلوک با شروع از یک آدرس خاص.
4 - خواندن چند بلوک- خواندن چندین بلوک که از یک آدرس خاص شروع می شود.

توجه داشته باشید.در اینجا، ویژگی‌های چند بلوکی (گزینه‌های 3 و 4) به دلیل محدودیت‌های حافظه در میکروکنترلر ATmega8 غیرفعال می‌شوند، زیرا این ویژگی‌ها برای آزمایش سیستم فایل FAT32 مورد نیاز نیستند. برای فعال کردن این گزینه‌ها، باید ماکرو موجود در فایل SD_routines.h را حذف کنید (#define FAT_TESTING_ONLY). و اگر از ATmega8 استفاده می کنید، هنگام آزمایش گزینه های 3 و 4، کتابخانه FAT32 را می توان حذف کرد تا حافظه میکروکنترلر آزاد شود.

5 - لیست فایل ها را دریافت کنید- فهرستی از دایرکتوری ها و فایل های موجود را با مقدار حافظه ای که آنها اشغال می کنند (در فهرست اصلی کارت) نمایش می دهد.
6 - فایل را بخوانید- خواندن فایل مشخص شده و نمایش محتویات در پنجره برنامه ترمینال.
7 - ایجاد فایل- ایجاد/افزودن یک فایل با نام مشخص شده؛
8 - حذف فایل- حذف تمام فایل های فایل با نام مشخص شده؛
9 - ظرفیت حافظه SD را بخوانید- اطلاعات در مورد ظرفیت کامل و رایگان کارت حافظه (بخش FSinfo کارت SD استفاده می شود).

در برنامه ترمینال، پورت سریال در 19200 baud پیکربندی شده است، بدون کنترل جریان و بدون بررسی برابری.

برای نسخه با ساعت بلادرنگ (DS1307) در میکروکنترلر ATmega32، ویژگی های فایل های ایجاد شده یا به روز شده به تاریخ و زمان (تاریخ ایجاد/تغییر) گره خورده است، این ویژگی ها در جدول فایل ثبت شده و قابل بررسی هستند. با استفاده از کامپیوتر و ساعت می تواند هنگام جمع آوری داده ها مفید باشد. سه گزینه به منوی گزینه ها در برنامه ترمینال اضافه شده است.

درس 33

قسمت 1

SPI. کارت SD. چربی

امروز ما موضوع مورد علاقه خود را در رابط SPI ادامه خواهیم داد. کار ما با این گذرگاه که کنترلرهای Atmega8a و ATTtiny2313 را به یکدیگر متصل می کند، تمام شده است. و امروز سعی می کنیم با استفاده از این رابط، یک کارت حافظه را از طریق این گذرگاه به میکروکنترلر متصل کنیم SD (Secure Digital).

این کارت را می توان از طریق رابط SDIO نیز متصل کرد، اما از آنجایی که چنین رابطی توسط کنترلر ما در سخت افزار پشتیبانی نمی شود، در این درس به آن نمی پردازیم. ما علاقه مند به نوع اتصال اتوبوس هستیم SPI، از آنجایی که ما قبلاً دانش انباشته خوبی در مورد این موضوع و همچنین پشتیبانی سخت افزاری در کنترلری که در حال برنامه نویسی آن هستیم، داریم.

با این وجود، ما به پین ​​اوت پایه های کارت برای هر دو نوع نگاه خواهیم کرد

خب چون به نوع دوم علاقه داریم به آن می پردازیم.

و اینجا چیز زیادی برای فهمیدن وجود ندارد. ما همه این اختصارات را می دانیم. تمام پین های رابط استاندارد SPI اینجا هستند و هیچ چیز اضافی در اینجا وجود ندارد.

حالا در مورد نقشه به طور کلی. این کارت امکان ذخیره اطلاعات را به ما می دهد؛ نوع حافظه آن FLASH است که در مقایسه با حافظه های نوع EEPROM نیز غیرفرار است، یعنی وقتی برق قطع می شود، داده ها در جایی ناپدید نمی شوند، بلکه ذخیره می شوند. همچنین این حافظه دارای تفاوت هایی است که در طی مراحل برنامه نویسی با آنها آشنا می شویم. یکی از تفاوت های اصلی این است که مانند حافظه EEPROM، نمی توانیم یک بایت در این حافظه بنویسیم. از نظر تئوری، البته ما می توانیم، اما بسته به نوع FLASH - NOR یا NAND، فقط یک هایی از بایت ما یا فقط صفرها در آنجا نوشته می شود. یعنی قبل از نوشتن یک بایت، باید آن را پاک کنیم و به دلیل سازماندهی این حافظه، فقط می توانیم در بلوک ها را پاک کنیم، بنابراین می توانیم فقط در بلوک بنویسیم. اما بیشترین تفاوت با EEPROM وجود دارد - این قیمت است. برای یک واحد ذخیره شده اطلاعات (به ازای هر مگابایت، در هر گیگابایت) چندین برابر ارزان تر است، حتی گاهی اوقات حتی چند مرتبه ارزان تر است. بنابراین، حافظه FLASH معمولاً همیشه دارای حجم بسیار بیشتری از اطلاعات است.

4 نوع SD وجود دارد، اما کمی بعد به بررسی این موضوع خواهیم پرداخت.

اجازه دهید این کارت را در پروتئوس وصل کنیم

اینجا همه چیز ساده است. در واقع کاملاً اینطور نیست. به مقاومت های بیشتری نیاز دارید

این مقاومت ها برای اطمینان از سطوح مناسب مورد نیاز هستند، زیرا کارت توسط 3.3 ولت تغذیه می شود. به طور کلی، با توجه به مستندات فنی، از 2.7 تا 3.6 ولت.

همچنین در پروتئوس مشخص نشده است، اما در واقع با نصب یک میکرو مدار که 5 ولت را به 3.3 ولت تبدیل می کند، کارت خود را از یک منبع تغذیه جداگانه تغذیه می کنیم.

یا بهتر است بگوییم، ما چیزی نصب نمی کنیم، بلکه از یک ماژول آماده استفاده می کنیم که همه چیز از قبل در آن نصب شده است.

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

از نظر عملی همه چیز به این صورت است:

این چیزی است که ماژول با نگهدارنده به نظر می رسد

شما می توانید چنین ماژولی را در همه جا پیدا کنید، هزینه آن یک پنی است. ماژولی که از طریق SDIO متصل می شود هزینه بیشتری دارد. همچنین می بینیم که ماژول از قبل دارای یک ریز مدار برای کاهش ولتاژ به 3.3 ولت است. و فقط به کنتاکت 5 ولت برق وصل می کنیم و به 3.3 چیزی وصل نمی کنیم

همچنین تمامی جداکننده های سطح روی ماژول نصب شده است، یعنی این ماژول مخصوص اتصال به دستگاه های 5 ولتی طراحی شده است.

و یک فلش کارت برای تست با 32 مگابایت بیرون آوردم، دقیقا یک مگابایت نه یک گیگابایت

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

کل کد نیز از آخرین درس به همراه کتابخانه نمایش گرفته شده است، زیرا ما از تابعی که در درس گذشته ایجاد کردیم بسیار فعال استفاده خواهیم کرد، اما البته یک پروژه جدید ایجاد شده و نامگذاری شده است. MYSD_SPI.

بیایید خطوط غیر ضروری را حذف کنیم، در main() فقط این را خواهیم داشت

بین المللیاصلی( خالی)

بدون امضابین المللیمن;

Port_ini();

LCD_ini(); //آغاز کردن صفحه نمایش

Clearlcd(); //صفحه نمایش را پاک کنید

Setpos(0,0);

Str_lcd( "رشته 1");

Setpos(2,1);

Str_lcd( "رشته 2");

Setpos(4,2);

Str_lcd( "رشته 3");

Setpos(6,3);

Str_lcd( "رشته 4");

Delay_ms(2000);

// برای (i=0;i<=22;i++) {str80_lcd(buffer2+i*20);_delay_ms(1000);}

در حالی که(1)

از آنجایی که کاراکتر متن را به کاراکتر خروجی نمی دهیم، می توانیم از نوع char در متغیر استفاده کنیم

بدون امضاکاراکتر من;

حالا یک نکته ظریف دیگر.

برای اینکه بتوانیم با کارت SD در پروتئوس کار کنیم، کافی نیست که خود نگهدارنده را به کارت اضافه کنیم، همچنین باید فایل تصویر فلش کارت را در ویژگی های آن ضمیمه کنیم.

ایجاد آن کار سختی نیست. یکی از راه ها ایجاد با استفاده از برنامه WinImage است.

با استفاده از منوی File -> New یک فایل جدید در آن ایجاد می کنیم. آخرین مورد را در گفتگو انتخاب کنید و روی "OK" کلیک کنید.

برای تست در پروتئوس حجم 4 مگابایت برای ما کافی است بنابراین در گفتگوی بعدی فیلد را با تعداد سکتورها تغییر می دهیم و همچنین فرمت FAT12/16 را انتخاب می کنیم زیرا مشخصات کار با 32- سیستم فایل بیت کمی متفاوت است و ما همچنین روی "OK" کلیک می کنیم.

به طور کلی، البته، ما می توانیم FAT32 را ترک کنیم، زیرا هنوز با سیستم فایل کار نمی کنیم، اما در قسمت های بعدی درس با فایل سیستم کار خواهیم کرد و با 12/16 کار خواهیم کرد.

سپس ما هزینه های خود را ذخیره می کنیم این فایلبا استفاده از آیتم منو File -> Save As. و آن را در پوشه ای که پروژه پروتئوس ذخیره شده را داریم ذخیره می کنیم. بیایید فایل را نامگذاری کنیم و روی "ذخیره" کلیک کنیم.

همچنین، پس از آن باید مطمئن شویم که این فایل با ویژگی “تنها خواندنی” نیست و پس از آن می‌توانیم آن را در پروتئوس وصل کنیم. شما باید به صورت دستی نام فایل را وارد کنید، زیرا Proteus به نوعی فرمت نیاز دارد و فایل ما به سادگی قابل مشاهده نخواهد بود.

ما به هیچ مسیری نیاز نداریم، زیرا فایل در پوشه پروژه قرار دارد. روی "OK" کلیک کنید.

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

بیایید جایگزین های ماکرو برای پاهای پورت اضافه کنیم

#عبارتند از"main.h"

#تعريف كردنMOSI3

#تعريف كردنمیسو4

#تعريف كردنSCK5

#تعريف كردناس اس2

بیایید کدی را برای مقداردهی اولیه پاها به تابع مقداردهی اولیه پورت اضافه کنیم

خالیport_ini( خالی)

پورت=0x00;

DDRD=0xFF;

PORTB|=(1<< اس اس)|(1<< میسو)|(1<< MOSI);

DDRB|=(1<< اس اس)|(1<< MOSI)|(1<< SCK);

ما پین MISO را در ورودی می گذاریم، زیرا به طور پیش فرض تمام بیت های موجود در ثبات صفر هستند و ما به سادگی آن را لمس نمی کنیم. همچنین بلافاصله سطح بالا را در MOSI و SS روشن می کنیم و یک مقاومت را به سمت MISO می کشیم.

بیایید یک تابع برای انتقال یک بایت از طریق گذرگاه SPI بنویسیم

خالیSPI_SendByte( بدون امضاکاراکتربایت)

{

}

بیایید یک متغیر برای حلقه و خود حلقه اضافه کنیم

خالیSPI_SendByte( بدون امضاکاراکتربایت)

بدون امضاکاراکترمن;

برای( من=0; من<8; من++) //حرکت بر اساس بیت از بایت

{

}

من فکر می کنم واضح است که چرا ما تا 8 می شماریم، زیرا دقیقاً 8 بیت را ارسال می کنیم.

خوب، بیایید کم کم انتقال آنها را شروع کنیم.

بیایید ابتدا بیت سمت چپ را بررسی کنیم و با ماسک کردن آن را از کل بایت جدا کنیم و اگر برابر با 1 باشد، آن را روی گذرگاه MOSI روی 1 قرار می دهیم و اگر 0 باشد، گذرگاه را لمس نمی کنیم.

برای( من=0; من<8; من++) //حرکت بر اساس بیت از بایت