صفحه اصلی سخت افزار شبکه اتصال کارت SD به میکروکنترلر. بازیابی اطلاعات از کارت‌های SD و MicroSD یکپارچه، پین اوت اسلات کارت SD

اتصال کارت SD به میکروکنترلر. بازیابی اطلاعات از کارت‌های SD و MicroSD یکپارچه، پین اوت اسلات کارت SD

آرتم ماکاروف با نام مستعار رابین

27.09.2014

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

بازیابی کارت های حافظه SD یکپارچه

قابل توجه است که از بیرون مشخص نیست که آیا این یک کارت SD "کلاسیک" با برد PCB، حافظه NAND و یک کنترلر است یا یک کریستال. تا زمانی که درب پلاستیکی باز شود. اغلب، خرابی چنین کارت های حافظه به دلیل خرابی در جداول ترجمه است. کمتر - آسیب الکترومکانیکی.

برای بازیابی فایل ها از چنین کارتی، اولین کاری که باید انجام دهید خواندن dump ها از کریستال است. برای انجام این کار، لاک محافظی که مسیرها و لنت های تماس یکپارچه را پنهان می کند، به صورت مکانیکی (تمیز کردن و سنگ زنی) حذف می شود. پس از آن درایو فلش شروع به شکل زیر می کند:

آهنگ ها و پین کردن کارت SD یکپارچه

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

نتیجه چیزی شبیه به این است:

یا این:

اکنون باید تحولات داخلی را در زباله های حاصل حذف کنیم. اولین قدم این است که ماسک XOR را که کنترل کننده فلش درایو هنگام نوشتن اطلاعات روی سلول های NAND اعمال می کند، بردارید. با استفاده از این ماسک، بخش به شکل زیر است:

و هنگامی که ماسک XOR مورد نیاز انتخاب و اعمال می شود، بخش ظاهری معنادار به خود می گیرد:

پس از حذف تبدیل های XOR، باید هندسه بخش صحیح را تنظیم کنید، نشانگرها و ناحیه تصحیح داده های ECC را توصیف کنید. خطاهای بیت را با استفاده از الگوریتم ECC تصحیح کنید. دریابید که بلوک ها به چه ترتیبی قرار گرفته اند و اندازه آنها. از آنجایی که نوع کنترلر ناشناخته است (یکپارچه است!)، باید تعیین کرد که در این مورد خاص از کدام کلکتور استفاده شود. آیا مونتاژ تصویر نهایی با استفاده از نشانگر بخش یا با استفاده از بقیه جداول ترجمه خواهد بود؟

پس از جمع‌آوری تصویر، بلوک‌های تضاد که نشانگر یکسانی دارند را بررسی کنید و آن‌هایی را که نتیجه نهایی بهترین است را در تصویر جایگزین کنید. پس از دریافت یک تصویر آشنا با یک سیستم فایل، می توانید آن را در هر ویرایشگر دیسکی باز کنید و فایل های مورد نیاز کاربر را آپلود کنید.

البته، بسیاری از عملیات کاملاً خودکار هستند، اما با این وجود، میزان کار درگیر در بازیابی اطلاعات از یکپارچه‌ها (تک بلورها) بسیار زیاد است. هر مهندس یا شرکتی که اطلاعات را بازیابی می کند، مشتاق مشارکت در چنین کاری نیست. و برچسب قیمت برای این نوع بازسازی بسیار دور از مفهوم "بودجه" است.

در اینجا مورد دیگری با استفاده از مثال بازیابی SD Sandisk وجود دارد - همان یکپارچه، فقط کمی متفاوت در داخل ساخته شده است:

آماده خواندن

بازیابی درایوهای فلش MicroSD

و در اینجا پدهای تماس در کارت Micro SD چگونه به نظر می رسند. فوراً باید توجه داشت که اینها تنها چند نمونه از بسیاری از گزینه های چیدمان هستند.

و در اینجا گزینه pinout برای کارت حافظه یکپارچه Memory Stick Pro Duo وجود دارد

این به این معنی نیست که یکپارچه است، اما یک درایو فلش USB معمولی نیز نیست. تراشه حافظه (کریستال) با ترکیب (چسب) پر شده است.

و در اینجا یک کارت یکپارچه Olympus XD Picture به نظر می رسد، که از آن لازم بود عکس ها را بازیابی کنید:

بازیابی Micro SD های خراب

به طور جداگانه، شایان ذکر است که انجام موفقیت آمیز وظایف بازیابی اطلاعات از درایوهای فلش MicroSD که به قطعات شکسته شده، با یک قطعه شکسته، با ترک در بدنه و غیره تبدیل شده اند. چند نمونه در تصاویر زیر:

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

آزمایشگاه هاردمستر یکی از معدود آزمایشگاه هایی است که در بازیابی اطلاعات از USB یکپارچه، SD، microSD، Memory Stick و غیره تجربه و صلاحیت دارد. کارت های حافظه اگر فایل های مهمی در فلش مموری شکسته یکپارچه شما وجود دارد که می خواهید آنها را بازگردانید، لطفاً با ما تماس بگیرید!

چند سال پیش در می 2011، خالق بازی کالت "Elite" دیوید برابن اولین مفهوم از یک کامپیوتر تک برد Raspberry Pi را ارائه کرد. این لحظه نقطه عطفی در زندگی من شد. ایده ساخت کامپیوتری به اندازه یک درایو فلش در سطح بود، اما تنها با کمک بنیاد Raspberry Pi شتاب گرفت.

قبلاً در 25 ژوئیه 2011، نسخه آلفای رایانه به تولید رسید. متأسفانه، مفهوم پروژه تغییر کرده است و اکنون به عنوان یک رایانه به اندازه یک کارت اعتباری قرار گرفته است. با وجود این شرایط، میلیون ها نفر از او پیروی کردند. من هم از اثر جمعیت اطاعت کردم و هر روز صفحه رسمی پروژه را چک می کردم. انتظار طولانی و دردناک برای "معجزه" آغاز شد که در 29 فوریه 2012 اتفاق افتاد - شروع فروش.

Raspberry Pi را می توان از طریق شبکه Farnell یا از RS Components خریداری کرد. همانطور که مشخص شد، در 29 فوریه فقط امکان پیش خرید وجود داشت. هیچ یک از دفاتر این تابلوها را در انبار نداشتند. اولین دسته از دستگاه ها تنها 10000 نسخه بود، بنابراین با توجه به هیاهویی که در اطراف پروژه وجود داشت، ثبت سفارش بسیار دشوار بود. با این حال، با غلبه بر همه مشکلات، در ساعت 14:06 همان روز کامپیوتر به قیمت 46.73 پوند از فارنل خریداری شد.

هیچ یک از سفارش های خارجی من برای مدت طولانی محقق نشد. من بسیار ناراحت شدم که فارنل با دریافت 20 پوند برای تحویل، بسته را در 29 می 2012 (2 ماه بعد) از طریق پست معمولی بدون شماره رهگیری ارسال کرد. در کمال تعجب، همزیستی پست رویال و روسیه این بسته را در 22 ژوئن سالم و سالم تحویل داد. این بسته مورد نظر در چند ماه گذشته بود، بنابراین، از آنجا که نمی توانستم استرس را تحمل کنم، مجبور شدم از کار مرخصی بگیرم و به اداره پست بدوم.

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

دو گزینه برای حل این مشکل وجود دارد: یک آداپتور SD->microSD را به موازات کانکتور نصب شده روی Raspberry Pi لحیم کنید (نحوه انجام این عمل را می توانید در مقاله Habré بخوانید)، یا از یک MicroSD-> با مشخصات پایین استفاده کنید. آداپتور SD گزینه اول برای من به سادگی غیرقابل قبول است - خوب، من جرات لحیم کردن تخته را ندارم، زیرا ... من می ترسم ارائه Raspberry خود را خراب کنم. به نظر من بهترین انتخاب استفاده از آداپتور Low-Profile است.

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

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

جدول 2: پین اوت کارت حافظه SD

با اتصال کنتاکت های مربوطه روی کارت های حافظه و ترکیب Vss1، Vss2، نمودار مدار الکتریکی آداپتور را به دست می آوریم.

برای ساخت آداپتور به موارد زیر نیاز داریم:
1) نگهدارنده microSD (CF TFC-WPCE-08 MICROSD CARD) – 52.22 روبل.
2) یک تکه لمینت فایبرگلاس فویل دو طرفه با مساحت حدود 4 سانتی متر مربع (2٪ موقعیت FOIL GLASS TEXTOLITE 1.5mm 2 SIDES) - 3 روبل.
3) مواد برای نصب (کلرید آهن، قلع، شار) - 10 روبل.

سپس هزینه پروژه 65 روبل 22 کوپک و مقدار مشخصی وقت آزاد خواهد بود. به منظور کاهش هزینه طراحی، می توانید نگهدارنده کارت microSD را با یک کارت MICROSD CF TFC-WPCER-08 جایگزین کنید. متأسفانه این کالا در انبار Promelektronika JSC موجود نبود، بنابراین گزینه گرانتری را خریداری کردم. توجه شما را به این نکته جلب می کنم که اگر نوع نگهدارنده را تغییر دهید، ممکن است نتوانید از الگوی من برای LUT (فناوری اتو لیزری) استفاده کنید.

من از اتوکد برای طراحی PCB استفاده کردم زیرا ... SprintLayout مورد علاقه من نتوانست با وجود الگوی مورد نیاز من را خوشحال کند. برای کسانی که دوست دارند یک برد مدار چاپی را اصلاح کنند، می توانند منبع را با فرمت DWG دانلود کنند و اگر چنین نیازی وجود ندارد، یک خالی در قالب PDF (توصیه می کنم قبل از اعمال الگوی PDF ابعاد را بررسی کنید).

پس از انتقال قالب به تخته، من توصیه می کنم سوراخ هایی با قطر 0.5 میلی متر برای انتقال از یک لایه به لایه دیگر سوراخ کنید.

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

خودتان یک آداپتور بسازید یا بخرید - انتخاب با شماست. برای اینکه انتخاب شما آگاهانه تر باشد، چندین لینک را برای خرید ویژه شما انتخاب کرده ام:
1) آداپتور MicroSD با مشخصات پایین Raspberry Pi Premium (TF) به کارت SD. هیئت حفاظت.
2) Raspberry Pi MicroSD به کارت SD کم مشخصات، کارت SD آسیب نمی بیند!!
3) آداپتور MicroSD به "کوتاه" SD / RS-MMC. برای چرخ دستی های Everdrive، Raspberry Pi و غیره.
4) آداپتور MicroSD به کارت SD کم مشخصات برای Raspberry Pi.
5) آداپتور کارت SD برای Raspberry pi REV2 + ارسال رایگان.

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

برای مونتاژ خود دستگاه، باید فایل های زیر را دانلود کنید:
1. صفحه منبع برای LUT در فرمت DWG
2. پرداخت برای LUT در قالب PDF

در تلاش هایتان موفق باشید!!!

درس 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; من++) //حرکت بر اساس بیت از بایت

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

ارتباط با کارت از طریق یکی از دو رابط امکان پذیر است، SPIیا SD.



باید گفت که رابط SD می تواند در حالت های یک بیتی و چهار بیتی کار کند.

نمودار اتصال کارت از طریق SPI استاندارد است و به نظر می رسد پین های استفاده نشده کارت باید با استفاده از یک مقاومت 10K به منبع تغذیه متصل شوند.


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

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

نمودارهای نشان داده شده در بالا نشان می دهد که کارت برای کار کردن به 3.3 ولت نیاز دارد، ولتاژ در خطوط انتقال داده نباید فراتر از محدوده 0 - 3.3 ولت باشد، و در اینجا این سوال مطرح می شود که اگر MK توسط MK تغذیه شود، چه باید کرد. 5 ولت؟
پاسخ ساده است، شما باید خطوط داده را مطابقت دهید، و این را می توان با استفاده از یک تقسیم کننده مقاومتی معمولی انجام داد.


نمودار نشان می دهد که خط MISO نیازی به هماهنگی مشابه با داده ها از طریق این خط ندارد. از کارت به MK.
در واقع، تعداد کمی از افراد کارت را مستقیماً به MK متصل می کنند.

ما اتصال را مرتب کردیم، بیایید اکنون نحوه استفاده از کتابخانه را بررسی کنیم پتی FatFsکه برای میکروکنترلرهای 8 بیتی با حافظه کوچک طراحی شده است.

این کتابخانه شامل 5 فایل است:
عدد صحیح.h- یک فایل هدر که انواع داده های اصلی را توصیف می کند.

diskio.h- یک فایل هدر که در آن نمونه های اولیه توابع سطح پایین برای کار با دیسک و کدهای وضعیتی که آنها برمی گردند، اعلام شده است.

diskio.c- توابع سطح پایین باید در این فایل پیاده سازی شوند.

pffсonf.h- فایل پیکربندی.

pff.h- یک فایل هدر که در آن نمونه های اولیه توابع برای تعامل با سیستم فایل دیسک اعلام شده است.

pff.c- فایل شامل اجرای توابع برای تعامل با سیستم فایل دیسک است.

مشاهده می شود که برای کارکرد کتابخانه، نیاز به پیاده سازی توابع سطح پایین است. اما اگر در مورد AVR یا PIC صحبت می کنیم، برای آنها در وب سایت می توانید نمونه ای از کار با کتابخانه را که حاوی فایل است دانلود کنید. mmc، از قبل توابع سطح پایین را پیاده سازی می کند. همچنین باید کتابخانه را در فایل pff.h پیکربندی کنید و توابع لازم برای عملیات SPI را بنویسید.

توابع Petit FatFs.

FRESULT pf_mount (FATFS*)- تابع دیسک را سوار/از حالت نصب می کند. این تابع باید قبل از کار با دیسک فراخوانی شود. تابع را می توان در هر زمان فراخوانی کرد.

گزینه ها
FATFS* fs- یک اشاره گر به یک شی از نوع FATFS شرح این ساختار را می توان در فایل pff.h یافت. ما فقط باید یک متغیر از این نوع را اعلام کنیم.

مقادیر برگشتی:
FR_OK (0)
FR_NOT_READY- دستگاه را نمی توان مقداردهی اولیه کرد
FR_DISK_ERR- هنگام خواندن از دیسک خطایی رخ داد
FR_NO_FILESYSTEM- دیسک دارای پارتیشن FAT معتبر نیست

FATFS fs;//اعلان یک شی از نوع FATFS //mount the disk if (pf_mount(&fs) == FR_OK) (//دیسک نصب شده است، ما با آن کار می کنیم //unmount the disk pf_mount(NULL); ) other (// مونت کردن دیسک ناموفق بود)

FRESULT pf_open (const char* مسیر)- تابع یک فایل موجود را باز می کند. پس از باز شدن فایل، می توانید با آن کار کنید، یعنی از روی آن بخوانید و روی آن بنویسید. می توانید با یک فایل باز کار کنید تا زمانی که فایل دیگری باز شود. تابع را می توان در هر زمان فراخوانی کرد.

گزینه ها
مسیر char* const- اشاره گر به رشته ای که مسیر فایل را نشان می دهد. مسیر باید کاملاً نسبت به دایرکتوری ریشه مشخص شود و دایرکتوری ها را با اسلش از هم جدا کند.

مقادیر برگشتی:
FR_OK (0)- در صورتی که تابع با موفقیت اجرا شد، برمی گردد
FR_NO_FILE- فایل پیدا نشد
FR_DISK_ERR- خطای دیسک
FR_NOT_ENABLED- دیسک نصب نشده بود

FATFS fs;//اعلان یک شی از نوع FATFS //mount دیسک اگر (pf_mount(&fs) == FR_OK) ( //باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK ( //) مونت کردن دیسک ناموفق بود)

FRESULT pf_read(void* buff، WORD btr، WORD* br)- تابع تعداد مشخص شده بایت ها را از فایل می خواند و آنها را در یک بافر ذخیره می کند. اگر تعداد بایت های خوانده شده کمتر از مقدار مشخص شده باشد، به پایان فایل رسیده است.
#define _USE_READ 1

گزینه ها:
باطل * گاومیش- اشاره گر به بافری که داده های خوانده شده در آن ذخیره می شود
WORD btr- تعداد بایت هایی که باید خوانده شوند
WORD*br- اشاره گر به متغیری که تعداد بایت های خوانده شده را ذخیره می کند.

مقادیر برگشتی:
FR_OK (0)- در صورتی که تابع با موفقیت اجرا شد، برمی گردد
FR_DISK_ERR- خطای دیسک
FR_NOT_OPENED- فایل باز نشد
FR_NOT_ENABLED- دیسک نصب نشده بود

FATFS fs;//یک شی از نوع FATFS BYTE buff;//بافر برای خواندن فایل WORD br; // شمارشگر بایت خوانده شده // mount دیسک اگر (pf_mount(&fs) == FR_OK) ( //باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK) ( //read 10 بایت از آن pf_read(buff, 10, &br if(br != 10) (//اگر br برابر با 10 نیست //یعنی به انتهای فایل رسیده ایم) )

FRESULT pf_write (const void* buff، WORD btw، WORD* bw)- عملکرد به شما امکان می دهد داده ها را در یک فایل باز بنویسید. برای اینکه تابع کار کند، باید در فایل pffconf.h بنویسید
#define_USE_WRITE 1

گزینه ها:
باطل * گاومیش- اشاره گر به بافری که می خواهیم بنویسیم، یک مقدار صفر ضبط را نهایی می کند
WORD btw- تعداد بایت هایی که می خواهیم بنویسیم
WORD* bw- یک اشاره گر به متغیری که تعداد بایت هایی را که می توانستند نوشته شوند ذخیره می کند. با تجزیه و تحلیل این متغیر می توانید متوجه شوید که آیا به پایان پرونده رسیده است یا خیر.

مقادیر برگشتی:
FR_OK (0)- در صورتی که تابع با موفقیت اجرا شد، برمی گردد
FR_DISK_ERR- خطای دیسک
FR_NOT_OPENED- فایل باز نشد
FR_NOT_ENABLED- دیسک نصب نشده بود

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

  • شما نمی توانید فایل های جدیدی ایجاد کنید و فقط می توانید روی فایل های موجود بنویسید
  • شما نمی توانید حجم فایل را افزایش دهید
  • نمی توان مهر زمانی را به روز کرد
  • عملیات نوشتن فقط در مرز بخش قابل شروع/توقف است
  • ویژگی فایل فقط خواندنی نمی تواند از نوشتن جلوگیری کند

برای درک نکته ماقبل آخر باید بدانید که حافظه کارت به بلوک (بخش) 512 بایتی تقسیم شده است. ضبط را فقط می توان از ابتدای بخش شروع کرد. بنابراین، اگر بخواهیم 1000 بایت بنویسیم، بخش اول به طور کامل نوشته می شود و تنها 488 بایت به دومی نوشته می شود و 24 بایت باقی مانده با صفر پر می شود.

برای نوشتن در یک فایل باز، باید مراحل زیر را انجام دهید:

  • نشانگر را روی مرز بخش تنظیم کنید
  • تابع ضبط را به تعداد مورد نیاز صدا بزنید
  • رکورد را با فراخوانی تابع با اشاره گر تهی نهایی کنید

برای مثالی از نحوه عملکرد تابع ضبط، لازم است یک تابع دیگر را در نظر بگیرید.

FRESULT pf_lseek (افست DWORD)- نشانگر خواندن/نوشتن را در فایل باز تنظیم می کند. شما می توانید نشانگر را با افست مطلق یا نسبی تنظیم کنید
pf_lseek(5000);
برای نسبی، مقدار اشاره گر را به موقعیت فعلی منتقل کنید fs.fptrو میزان جابجایی
pf_lseek(fs.fptr + 3000);
برای اینکه تابع کار کند، باید در فایل pffconf.h بنویسید
#define_USE_LSEEK 1

گزینه ها:
افست DWORD- تعداد بایت هایی که نشانگر باید توسط آن جابجا شود.

مقادیر برگشتی:
FR_OK (0)- در صورتی که تابع با موفقیت اجرا شد، برمی گردد
FR_DISK_ERR- خطای دیسک
FR_NOT_OPENED- فایل باز نشد

می توانید داده ها را به صورت زیر در یک فایل بنویسید.
FATFS fs;//یک شی از نوع FATFS BYTE buff;//بافر برای خواندن فایل WORD br; //تعداد بایت های خوانده شده //mount دیسک اگر (pf_mount(&fs) == FR_OK) ( //باز کردن فایل واقع در دایرکتوری ریشه if(pf_open("hello.txt") == FR_OK) ( //set نشانگر اولین بخش pf_lseek(0) //write pf_write(buff, 10, &br) )

من همچنین در اینجا یک قطعه از کد واقعی کار می گذارم که از تمام توابع توضیح داده شده در بالا استفاده می کند.
#define F_CPU 8000000UL #define buff_size 10 #شامل #عبارتند از #include "diskio.h" #include "pff.h" #include "spi.h" FATFS fs;//یک شی از نوع FATFS BYTE read_buff;//بافر برای خواندن فایل BYTE write_buff = "Hello word"; /// /بافر برای نوشتن در فایل UINT br; //شماره بایت خوانده شده int main(void) (//mount the disk if (pf_mount(&fs) == FR_OK) (//باز کردن فایل واقع در پوشه جدید if(pf_open("new/hello.txt") == FR_OK) (//تنظیم نشانگر نوشتن pf_lseek(0)؛ //نوشتن pf_write(write_buff, buff_size, &br)؛ //نهایی نوشتن pf_write(0, 0, &br)؛ //تنظیم نشانگر خواندن pf_lseek( 0 //read سپس آنچه نوشته شد pf_read(read_buff, buff_size, &br if(br != buff_size) (//اگر br برابر با buff_size نیست //یعنی به انتهای فایل رسیده ایم) ; // دیسک را جدا کنید pf_mount(NULL) while(1) ( ) )

FRESULT pf_opendir (DIR* dp، const char * مسیر)- تابع یک دایرکتوری موجود را باز می کند و یک اشاره گر به یک شی از نوع DIR ایجاد می کند که برای به دست آوردن لیستی از فایل ها در دایرکتوری باز استفاده می شود.
برای اینکه تابع کار کند، باید در فایل pffconf.h بنویسید
#تعریف_USE_DIR 1

گزینه ها:
DIR *dp- اشاره گر به متغیری از نوع DIR.

const char * مسیر- اشاره گر به رشته ای که حاوی مسیر دایرکتوری است، دایرکتوری ها با یک اسلش از هم جدا می شوند

مقادیر برگشتی:
FR_OK (0)- در صورتی که تابع با موفقیت اجرا شد، برمی گردد
FR_NO_PATH- نتوانستم مسیر را پیدا کنم
FR_NOT_READY- در مقداردهی اولیه دیسک ناموفق بود
FR_DISK_ERR- خطای دیسک
FR_NOT_ENABLED- دیسک نصب نشده بود

//اعلان متغیرهای FATFS fs; DIR dir; //نصب دیسک pf_mount(&fs); //باز کردن دایرکتوری pf_opendir(&dir, "MY_FOLDER");

FRESULT pf_readdir (DIR* dp، FILINFO* fno)- تابع به شما امکان می دهد محتویات یک فهرست را بخوانید. برای انجام این کار، باید دایرکتوری را با استفاده از تابع ()pf_opendir باز کنید و ()pf_readdir را فراخوانی کنید. هر بار که تابع فراخوانی می شود، نام شی (پوشه/فایل) واقع در دایرکتوری مشخص شده را برمی گرداند. هنگامی که در تمام اشیاء تکرار می شود، یک رشته تهی در عنصر آرایه fno.fname برمی گرداند.
برای اینکه تابع کار کند، باید در فایل pffconf.h بنویسید
#تعریف_USE_DIR 1

گزینه ها:
DIR *dp- اشاره گر به متغیری از نوع DIR که باید قبلاً اعلام شود

FILINFO * fno- یک اشاره گر به متغیری از نوع FILINFO که باید قبلاً اعلام شده باشد.

مقادیر برگشتی:
FR_OK- تکمیل موفقیت آمیز عملکرد
FR_DISK_ERR- خطای دیسک
FR_NOT_OPENED- دایرکتوری باز نیست

FATFS fs; پاسخ FRESULT; FILINFO fno; DIR dir; //نصب دیسک pf_mount(&fs); //باز کردن دایرکتوری res = pf_opendir(&dir, MY_FOLDER); //خواندن محتویات دایرکتوری برای(;;)( res = pf_readdir(&dir, &fno); //بررسی کنید آیا هنگام خواندن خطاهایی وجود دارد یا نه و آیا فایل های دیگری در دایرکتوری مشخص شده وجود دارد اگر ((res ! = FR_OK) ||.

و در نهایت، پیش نویس کاری را اینجا می گذارم

  • آندریاس می گوید:

    اگر هدف پین های عملکردی یک کارت حافظه خاص را بدانید، مونتاژ یک آداپتور Memory Stick با دستان خود دشوار نیست. معمولاً پین اوت کارت حافظه یا مثلاً ریزمدار، تراشه و غیره نامیده می شود. به طور کلی، تکنولوژی ساده است. طرح کارت حافظه MMC (کارت چند رسانه ای) از PCB بریده شده است. 7 آهنگ روی تخته نان بریده شده است (MMC دارای 7 پین است). سپس مطابق با پین‌آوت که در شکل زیر نشان داده شده است، تراک‌ها به پین‌های کارت حافظه SD (دارای 9 پایه که 2 پایه آن استفاده نمی‌شود)، میکرو اس‌دی (دارای 8 پایه، که 2 پایه آن نیز نیست، لحیم می‌شوند. استفاده شده است، اما توجه داشته باشید که حافظه کارت حافظه microSD خروجی Vcc ندارد) یا microM2 (پینوت microM2 در مبحث مرتبط Memory Stick Micro M2 Adapter). همین. آداپتور Memory Stick آماده است.

    P.S. ما کارت حافظه 1 و 2 گیگابایتی MMC در انبار داریم. هزینه به ترتیب 285 و 360 روبل است. تحویل در قیمت درج شده است.

    همچنین می توانید کارت های حافظه در اندازه های زیر را ارزان خریداری کنید:
    - Memory Stick و Memory Stick M2;
    - دیجیتال امن (SD)؛
    - Mini SD؛
    - میکرو SD (TF)؛
    - فلش فشرده؛
    -XD؛
    - درایوهای فلش USB با طرح ها و ظرفیت های مختلف.
    مثلاً اینها:

  • اسلاوا می گوید:

    اتفاقا من در این نوشته ها خیلی واضح نیستم. نمی‌توانید آهنگ‌ها را از MicroCD به MMC در آن صفحه دریافت کنید، بسیار سپاسگزار خواهم بود.

  • آندریاس می گوید:

    آداپتور microSD به MMC اینگونه خواهد بود:

  • اسلاوا می گوید:
  • جدید در سایت

    >

    محبوبترین