Додому мережеве обладнання Підключення sd карти до мікроконтролера. Відновлення даних з монолітних SD та MicroSD карт Розпинка слота sd карти

Підключення sd карти до мікроконтролера. Відновлення даних з монолітних SD та MicroSD карт Розпинка слота sd карти

Artem Makarov aka Robin

27.09.2014

Останнім часом все частіше приносять відновлення інформації флешки, виконані на монокристальной основі, звані моноліти. Сьогодні мова піде про процес відновлення даних з такого моноліту, - карти пам'яті SD, яку надіслав партнер з міста Кемерово. На картці було записано відеозйомку весілля, і коли торжество успішно закінчилося і настав час приступати до монтажу та випуску подарункових DVD, флешка наказала довго жити.

Відновлення монолітних карток пам'яті SD

Примітно, що зовні не зрозуміти, - це "класична" картка SD, з платою текстоліту, NAND пам'яттю і контролером, або монокристал. Доки не розкриється пластиковий корпус. Найчастіше вихід таких карт пам'яті з ладу обумовлений збоєм таблицях трансляції. Рідше – електромеханічними пошкодженнями.

Для відновлення файлів з такої картки насамперед треба віднімати дампи з кристала. Для цього механічним (очищенням та шліфуванням) шляхом видаляється захисний лак, що приховує доріжки та контактні майданчики моноліту. Після чого флешка починає виглядати так:

Доріжки та розпинування монолітної SD картки

Видно контактні майданчики, до яких підключені шина даних, chip enable, read/write busy, харчування тощо. Зрозуміло нічого не промарковано, і даташитів, у яких докладно розписано, що куди підключати, у вільному доступі немає. Розпинування можна знайти або взявши точно таку ж справну флешку (а їх безліч типів, і знайшовши такий же на вигляд умовний SD Kingston, можна отримати всередині зовсім інакше зроблений девайс) і озброївшись логічним аналізатором ретельно шукати що куди і навіщо. Або купивши розпинання у людини/контори, які таку роботу за тебе вже зробили.

У результаті виходить щось таке:

Або таке:

Тепер у отриманих дампах слід усунути внутрішні перетворення. Насамперед прибрати маску XOR, яку накладав при записі інформації в комірки NAND контролер флешки. З цією маскою сектор виглядає так:

а коли потрібна маска XOR підібрана та застосована, то сектор набуває осмисленого вигляду:

Після усунення XOR перетворень потрібно виставити коректну геометрію сектора, описати маркери та область ECC коригування даних. За допомогою алгоритму ECC виправити бітові помилки. З'ясувати, у якій послідовності були розташовані блоки, їх розмір. Оскільки тип контролера невідомий (це моноліт!), то треба визначити, яким збирачем користуватися в даному конкретному випадку. Чи це буде складання фінального образу за маркером сектора чи залишками таблиць трансляції.

Після того, як образ зібраний, перевірити конфліктні блоки, що мають однаковий маркер, на актуальність і підставити в образ ті, з якими результат буде найкращим. Отримавши звичний образ із файловою системою можна відкрити його в будь-якому дисковому редакторі та вивантажити потрібні користувачеві файли.

Безумовно, багато операцій досить автоматизовані, проте обсяг робіт при відновленні даних з монолітів (монокристалів) дуже великий. Далеко не кожен інженер або компанія, яка відновлює інформацію, має бажання з такими роботами зв'язуватися. І цінник на такого роду відновлення дуже далекий від поняття "бюджетний".

Ось ще один випадок на прикладі відновлення SD Sandisk - такий же моноліт, тільки всередині трохи інакше зроблено:

Готово для читання

Відновлення MicroSD флешок

А ось як виглядають контактні майданчики на карті Micro SD. Відразу слід зазначити, що це лише кілька прикладів з безлічі варіантів компонування.

А ось варіант розпинування монолітної картки пам'яті Memory Stick Pro Duo

Ось – не сказати що моноліт, але й не звичайна USB флешка. Мікросхема пам'яті (кристал) залита компаундом (клеєм).

А ось як виглядає монолітна картка пам'яті Olympus XD Picture card, з якої потрібно відновити фотознімки:

Відновлення поламаних Мікро ЦД

Окремо варто згадати про успішне виконання завдань із відновлення інформації з MicroSD флешок, зламаних на частини, з відламаним шматком, з тріщинами на корпусі тощо. Декілька прикладів на картинках нижче:

У всіх випадках, коли йдеться про флешку розламану на шматки, з відламаною частиною тощо. є можливість відновлення інформації якщо залишився цілий кристал NAND. Наприклад, у мікро-флешці Сандіск з прикладу нижче в результаті неакуратної експлуатації відколовся шматок з пошкодженням доріжок, помічених червоним овалом.

Лабораторія "Хардмайстер" одна з небагатьох, які мають досвід та кваліфікацію у відновленні даних з монолітних USB, SD, microSD, Memory Stick тощо. карток пам'яті. Якщо на вашій монолітній поламаній флешці залишилися важливі файли, які хотілося б повернути - звертайтесь до нас!

Кілька років тому в травні 2011 року творцем культової гри «Elite» Девідом Бребеном був представлений перший концепт одноплатного комп'ютера Raspberry Pi. Цей момент став переломним у моєму житті. Ідея зробити комп'ютер розміром із флеш-накопичувач лежала на поверхні, але великий розмах отримала лише за допомогою компанії Raspberry Pi Foundation.

Вже 25 липня 2011 року у виробництво віддається альфа версія комп'ютера. На жаль, у проекту змінився концепт, і тепер він позиціонується як комп'ютер розміром із кредитну картку. Незважаючи на цю обставину, за ним стежили мільйони людей. Ефект натовпу корився і я, щодня перевіряючи офіційну сторінку проекту. Почалося тривале та болісне очікування «чуда», яке сталося 29 лютого 2012 року – старт продажів.

Купити Raspberry Pi можна було через мережу Farnell або у RS Components. Як виявилося, 29 лютого можна було зробити лише попереднє замовлення. Наявність цих плат не мала жодної з контор. Перша партія пристроїв становила лише 10000 екземплярів, тому, враховуючи ажіотаж навколо проекту, оформити замовлення було дуже важко. Однак, подолавши всі труднощі, о 14:06 того ж дня комп'ютер купили за 46.73 фунтів стерлінгів у Farnell'а.

Так довго не виконували жодне з моїх закордонних замовлень. Мене вкрай засмутив той момент, що Farnell, взявши за доставку 20 фунтів, відправив посилку 29 травня 2012 (за 2 місяці) звичайною поштою без номера для відстеження. На диво, симбіоз Королівської та Російської пошти доставив посилку цілістю та безпекою вже 22 червня. Це була найбажаніша посилка за останні кілька місяців, тому, не витримавши напруження, мені довелося відпроситися з роботи та бігти на пошту.

Розповідати про те, як налаштовувати Raspberry Pi для першого запуску, немає сенсу. Зі статтею на цю тему я запізнився на кілька років, вже багато рядків про це написано на інших ресурсах, а на Youtubeвикладено достатньо відеоматеріалів. Я ж хочу розповісти про суттєвий для мене недолік у конструкції – незручне розташування роз'єму для SD карти. Коли картку вставлено, вона сильно випирає за межі плати, що псує вигляд саморобного корпусу.

Є два варіанти вирішення цієї проблеми: підпаяти перехідник SD->microSD паралельно роз'єму, встановленому на Raspberry Pi (як зробити таку операцію можна почитати в статті на Хабре), або використовувати перехідник Low-profile MicroSD->SD. Перший варіант для мене просто неприпустимий - ну не піднімається рука паяти плату, т.к. боюся зіпсувати товарний вигляд своєї Малинки Вважаю, що оптимальним вибором є все ж таки використання 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 (2% від позиції СКЛОТЕКСТОЛІТ ФОЛЬГІР.1.5ММ 2-Х СТОРІН) - 3 руб.
3) Матеріали для монтажу (хлорне залізо, олово, флюс) – 10 руб.

Тоді собівартість проекту складе 65 рублів 22 копійки та кілька вільного часу. Для того, щоб здешевити конструкцію можна замінити тримач картки microSD на CF TFC-WPCER-08 MICROSD CARD. На жаль, цієї позиції не було в наявності на складі ЗАТ «Промелектроніка», тому я придбав дорожчий варіант. Звертаю Вашу увагу, що якщо Ви заміните тип власника, то скористатися моїм шаблоном для ЛУТ (лазерно-прасної технології) у Вас може не вийти.

Для проектування друкованої плати використовував Autocad, т.к. мій улюблений SprintLayout не зміг порадувати наявним потрібним шаблоном. Для любителів видозмінити друковану плату Ви можете завантажити вихідний формат у форматі DWG , а якщо такої необхідності немає, то – заготовку у форматі PDF (рекомендую перед нанесенням шаблону з PDF звірити розміри).

Після того, як шаблон перенесено на плату, рекомендую просвердлити отвори діаметром 0,5 мм для переходу з одного шару на інший.

Перехід із шару на шар я проводжу за допомогою тонкого дроту, попередньо обладнавши доріжки майбутнього перехідника. У тих місцях, де отвори знаходяться під тримачем microSD, необхідно надфілем сточити краплі олова, щоб він встановився без перекосу. В останню чергу монтаж тримача. Якщо в процесі виготовлення плати використовувалися різні флюси, перед тим як штовхати її у Ваш Raspberry Pi обов'язково промийте плату.

Робити перехідник самим чи купувати – вибирати Вам. Щоб вибір був усвідомленішим, спеціально для Вас я підібрав кілька посилань для покупки:
1) Raspberry Pi Premium Low-profile MicroSD (TF) до SD Card Adapter. Protect Board
2) Raspberry Pi Low-profile MicroSD to SD Card Adapter, SD card won"t get damaged!!
3) MicroSD для "short" SD / RS-MMC адаптера. Для Everdrive carts, Raspberry Pi, etc.
4) Low-profile MicroSD до SD Card Adapter для Raspberry Pi.
5) SD card adapter for Raspberry pi REV2 + free shipping.

На закінчення хочеться сказати, що весь матеріал призначений лише для ознайомлення. Використання напрацювань у комерційних цілях суворо заборонено. Передрук матеріалів можливий тільки з мого дозволу та з дотриманням посилань на першоджерело. Охочих підтримати не лише словом, а й ділом, а також подякувати – прошу до мене на пошту.

Для самостійного збирання пристрою Вам необхідно завантажити такі файли:
1. Вихідник плати для ЛУТ у форматі DWG
2. Плата для ЛУТ у форматі PDF

Удачі у Ваших починаннях!

Урок 33

Частина 1

SPI. Мапа SD. FAT

Сьогодні ми продовжимо нашу улюблену тему з інтерфейсу 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() у нас залишиться тільки в це

intmain( void)

unsignedinti;

Port_ini();

LCD_ini(); //ініціалізуємо дисплей

Clearlcd(); //очистимо дисплей

Setpos(0,0);

Str_lcd( "String 1");

Setpos(2,1);

Str_lcd( "String 2");

Setpos(4,2);

Str_lcd( "String 3");

Setpos(6,3);

Str_lcd( "String 4");

Delay_ms(2000);

// for (i = 0; i<=22;i++) {str80_lcd(buffer2+i*20);_delay_ms(1000);}

While(1)

Так як ми посимвольно не виводитимемо текст, то можна буде в змінній обійтися типом char

unsignedchar i;

Тепер ще один аспект.

Щоб нам працювати з SD-картою в протеусі, нам мало додати сам власник з карткою, необхідно також у його властивостях прикріпити файл флеш-карти.

Створити його не складно. Одним із способів є створення за допомогою програми WinImage.

Ми в ній стандартно створюємо новий файл за допомогою пункту меню File -> New. Вибираємо в діалозі останній пункт і тиснемо "OK"

Для тесту в протеусі нам цілком вистачить розміру 4 мегабайти, тому поміняємо в наступному діалозі поле з номером секторів, а також виберемо формат FAT12/16, тому що з 32-бітною файловою системою трохи інша специфіка роботи, а також натиснемо "OK"

Взагалі ми звичайно можемо залишити і FAT32, тому що ми з файловою системою поки не працює, але в подальших частинах заняття буде робота з файловою системою і ми будемо працювати з 12/16.

Потім ми зберігаємо створений файл за допомогою пункту меню File -> Save As. І зберігаємо ми його в тій папці, де у нас знаходиться збережений проект протеуса. Назвемо файл та натиснемо "Зберегти"

Також потім потрібно буде переконатися, що цей файл у нас вийшов не з атрибутом "тільки для читання" і після цього ми зможемо його підключити в протеусі. Треба буде вручну вписати ім'я файлу, оскільки протеус вимагає якийсь свій формат і наш файл буде просто не видно.

Шлях нам ніякий не потрібен, тому що файл у нас знаходиться у папці із проектом. Тиснемо "ОК".

Ініціалізація шини нам не потрібна, так як у нас SPI буде програмний, з апаратною флеш-картою працюють коректно не всі, то нам не треба буде використовувати жодних регістрів. Апаратний звичайно, краще, але щоб усвідомити роботу протоколу досконально, треба ще попрацювати і з програмним, тобто підригати ніжками портів. Взагалі, дивлячись на схему, може здатися, що у нас все апаратно, тому що я саме такі ніжки вибрав, це тому, що я просто так вибрав, щоб згодом колись може бути хтось спробує таки попрацювати з апаратною реалізацією шини.

Додамо макропідстановки для ніжок порту

#include"main.h"

#defineMOSI3

#defineMISO4

#defineSCK5

#defineSS2

Додамо код для ініціалізації ніжок у функцію ініціалізації портів

voidport_ini( void)

PORTD=0x00;

DDRD=0xFF;

PORTB|=(1<< SS)|(1<< MISO)|(1<< MOSI);

DDRB|=(1<< SS)|(1<< MOSI)|(1<< SCK);

Ми залишаємо на вхід ніжку MISO, оскільки за замовчуванням усі біти в регістрі дорівнюють нулю, і ми його просто не чіпаємо. Також ми включаємо відразу високий рівень у MOSI та SS, а до MISO підтягуємо резистор.

Напишемо функцію передачі байта по шині SPI

voidSPI_SendByte( unsignedcharbyte)

{

}

Додамо змінну для циклу і сам цикл

voidSPI_SendByte( unsignedcharbyte)

unsignedchari;

for( i=0; i<8; i++) // рухаємося по бітах байта

{

}

Я думаю, зрозуміло, чому ми рахуємо до 8, тому що бітів ми передаємо саме 8.

Ну і почнемо їх передавати потихеньку.

Перевіримо спочатку найлівіший біт, виділивши його з усього байта маскуванням, і, якщо він у нас дорівнює 1, то виставимо 1 і на шині MOSI, а якщо 0 - то не чіпаємо шину

for( i=0; i<8; i++) // рухаємося по бітах байта

Ми виводили картинку на дисплей з sd картки, але в ній було втрачено деякі моменти, перший - підключення самої картки, другий - була розглянута лише частина функцій бібліотеки Petit FatFs, давайте зупинимося на цих моментах докладніше.

Спілкування з карткою можливе за одним із двох інтерфейсів, SPIабо SD.



Треба сказати, що інтерфейс SD може працювати в однобітному і чотирибітному режимах.

Схема підключення картки по SPI стандартна і виглядає наступним чином, висновки картки, що не використовуються, потрібно за допомогою резистора 10К підтягнути до живлення.


Але в аматорських конструкціях часто нехтують резисторами, що підтягують, спрощуючи схему підключення.

Треба відзначити, що при підключенні по SPI картка дуже вимоглива до напруги живлення і невелика просадка напруги живлення призводить до непрацездатності картки, це перевірено на особистому досвіді, з приводу SD інтерфейсу сказати нічого, ще не пробував. Це все писав до того, що з харчування обов'язково ставити конденсатори. Що стосується дроселя, він має бути розрахований на струм до 100мА, але ставити його необов'язково.

На схемах, зображених вище видно, що з роботи картці необхідно 3.3 вольта, відповідно, лініях передачі напруга має виходити за діапазон 0 – 3.3 вольт і тут виникає питання, що робити якщо МК живиться від 5 вольт?
Відповідь проста, треба узгодити лінії передачі, а зробити це можна за допомогою звичайного резистивного дільника.


На схемі видно, що лінію MISO узгоджувати не треба так, як за цією лінією дані передаються від картки до МК.
Насправді мало хто підключає картку безпосередньо до МК, набагато зручніше підключити до МК роз'єм для картки або купити шилд з роз'ємом і всією необхідною обв'язкою.

З підключенням розібралися, тепер розглянемо як користуватися бібліотекою Petit FatFsяка призначена для 8-бітових мікроконтролерів з малим розміром пам'яті.

Бібліотека складається з 5 файлів:
integer.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; )

FRESULT pf_open (const char * path)- Функція відкриває існуючий файл. Після того, як файл відкритий з ним можна працювати, тобто читати з нього і записувати в нього. З відкритим файлом можна працювати, доки не буде відкритий інший файл. Функція може бути викликана будь-якої миті часу.

Параметри
const char* path- Вказівник на рядок, що вказує шлях до файлу. Шлях треба вказувати повністю щодо кореневої директорії, поділяючи директорії слешем.

Значення, що повертаються:
FR_OK (0)- повертається у разі успішного виконання функції
FR_NO_FILE- Файл не знайдено
FR_DISK_ERR- помилка диска
FR_NOT_ENABLED- диск не був змонтований

FATFS fs; щось ) //відкриваємо файл , що лежить у папці new if(pf_open("new/hello.txt") == FR_OK) ( //робимо щось ) //демонтуємо диск pf_mount(NULL); ) else ( // не вдалося змонтувати диск)

FRESULT pf_read(void* buff, WORD btr, WORD* br)- функція читає вказану кількість байт із файлу та зберігає їх у буфер. Якщо кількість прочитаних байт менше, ніж зазначено, значить було досягнуто кінець файлу.
#define _USE_READ 1

Параметри:
void * buff- покажчик на буфер, у якому зберігаються прочитані дані
WORD btr- кількість байт, які потрібно прочитати
WORD* br- покажчик змінну, у якій зберігається кількість прочитаних байт.

Значення, що повертаються:
FR_OK (0)- повертається у разі успішного виконання функції
FR_DISK_ERR- помилка диска
FR_NOT_OPENED- файл не був відкритий
FR_NOT_ENABLED- диск не був змонтований

FATFS fs;//оголошуємо об'єкт типу FATFS BYTE buff;//буфер для читання файлу WORD br; //лічильник прочитаних байт //монтуємо диск if (pf_mount(&fs) == FR_OK) ( //відкриваємо файл if(pf_open("hello.txt") == FR_OK) ( //читаємо з нього 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

Параметри:
void * buff- покажчик на буфер, який хочемо записати, нульове значення фіналізує запис
WORD btw- кількість байт, які хочемо записати
WORD* bw- Покажчик на змінну, що зберігає кількість байт, які вдалося записати. Аналізуючи, цю змінну можна дізнатися, чи було досягнуто кінець файлу.

Значення, що повертаються:
FR_OK (0)- повертається у разі успішного виконання функції
FR_DISK_ERR- помилка диска
FR_NOT_OPENED- файл не був відкритий
FR_NOT_ENABLED- диск не був змонтований

Через те, що бібліотека розрахована на мікроконтролери з малим об'ємом пам'яті, ця функція має ряд обмежень:

  • не можна створювати нові файли, а записувати можна лише у існуючі
  • не можна збільшувати розмір файлу
  • не можна оновити тимчасову мітку
  • операцію запису можна розпочати/зупинити лише на межі сектора
  • файловий атрибут "тільки для читання" не може заборонити запис

Щоб зрозуміти передостанній пункт, треба зазначити, що пам'ять картки розбита на блоки(сектора) по 512 байт і запис можна розпочати лише з початку сектора. Таким чином якщо ми хочемо записати 1000 байт, то перший сектор запишеться повністю, а в другий запишеться тільки 488 байт, а 24 байти, що залишилися, заповняться нулями.

Для запису у відкритий файл слід виконати такі дії:

  • встановити покажчик на кордон сектора, якщо встановити не на кордон, то покажчик буде округлений до нижньої межі сектора
  • викликати функцію запису потрібну кількість разів
  • фіналізувати запис, викликавши функцію з нульовим покажчиком

Для того, щоб навести приклад роботи функції запису, необхідно розглянути ще одну функцію.

FRESULT pf_lseek(DWORD offset)- Встановлює покажчик читання/запису у відкритому файлі. Встановлювати покажчик можна абсолютним або відносним зміщенням, для абсолютного усунення необхідно передати в функцію число
pf_lseek(5000);
для відносного, передати значення покажчика на поточну позицію fs.fptrта величину зміщення
pf_lseek(fs.fptr + 3000);
Для того, щоб функція працювала у файлі pffconf.h треба записати
#define _USE_LSEEK 1

Параметри:
DWORD offset- кількість байт, куди потрібно змістити покажчик.

Значення, що повертаються:
FR_OK (0)- повертається у разі успішного виконання функції
FR_DISK_ERR- помилка диска
FR_NOT_OPENED- файл не був відкритий

Записати дані у файл можна в такий спосіб.
FATFS fs;//оголошуємо об'єкт типу FATFS BYTE buff;//буфер для читання файлу WORD br; //лічильник прочитаних байт //монтуємо диск if (pf_mount(&fs) == FR_OK) ( //відкриваємо файл if(pf_open("hello.txt") == FR_OK) ( //встановлюємо покажчик на перший сектор) pf_lseek(0); //записуємо pf_write(buff, 10, &br); //фіналізуємо запис pf_write(0, 0, &br);

Також залишаю тут шматок реального коду, в якому використовуються всі вище описані функції.
#define F_CPU 8000000UL #define buff_size 10 #include #include #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) ( //монтуємо диск if (pf_mount(&fs) == FR_OK) ( //відкриваємо файл, що лежить у папці new 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); //читаємо то , що записали pf_read(read_buff, buff_size, &br); ( ) )

FRESULT pf_opendir (DIR * dp, const char * path)- функція відкриває існуючу директорію та створює покажчик на об'єкт типу DIR, який використовуватиметься для отримання списку файлів відкритої директорії.
Для того, щоб функція працювала у файлі pffconf.h треба записати
#define _USE_DIR 1

Параметри:
DIR *dp- Покажчик на змінну типу DIR.

const char * path- покажчик на рядок, що містить шлях до директорії, директорії поділяються слешем

Значення, що повертаються:
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 треба записати
#define _USE_DIR 1

Параметри:
DIR *dp- покажчик на змінну типу DIR, яка має бути попередньо оголошена

FILINFO *fno- покажчик на змінну типу FILINFO, яка має бути попередньо оголошена.

Значення, що повертаються:
FR_OK- Успішне завершення функції
FR_DISK_ERR- помилка диска
FR_NOT_OPENED- не відкрито директорію

FATFS fs; FRESULT res; FILINFO fno; DIR dir; //Монтуємо диск pf_mount(&fs); //відкриваємо директорію res = pf_opendir(&dir, MY_FOLDER); //читаємо вміст директорії for(;;)( res = pf_readdir(&dir, &fno); //перевіряємо чи не виникло помилок при читанні // і чи є ще файли у зазначеній директорії if ((res != FR_OK) || ( fno.fname == 0))( break; ) //виводимо зручним способом fno.fname usart_sendStr(fno.name);

Ну і насамкінець залишу тут робочий проект

  • AndReas каже:

    Зібрати адаптер Memory Stick своїми руками не складає особливих труднощів при знанні призначення функціональних висновків тієї чи іншої карти пам'яті. Зазвичай звуть розпинання картки пам'яті або, наприклад, мікросхеми, чіпа і т.п. Загалом технологія проста. Вирізається макет картки пам'яті MMC (MultiMedia Card) із текстоліту. На макеті вирізають 7 доріжок (MMC має 7 висновків). Потім, відповідно до наведеної на малюнку нижче розпинування, доріжки припаюються до висновків картки пам'яті SD (має 9 висновків, з яких 2 не використовуються), microSD (має 8 висновків, з яких теж не використовуються 2, але зверніть увагу, що картка пам'яті microSD немає виводу Vcc або microM2 (розпинання microM2 у суміжній темі Адаптер Memory Stick Micro M2). От і все. Адаптер Memory Stick готовий.

    P.S. У нас є карти пам'яті MMC на 1 і 2 Гб. Вартість, відповідно, 285 та 360 руб. Доставка включена у вказану ціну.

    Також можна дешево купити наступні типорозміри карток пам'яті:
    - Memory Stick та Memory Stick M2;
    - Secure Digital (SD);
    - Mini SD;
    - Micro SD (TF);
    - Compact Flash;
    - XD;
    - USB Flash Drives різних виконань та ємності.
    Наприклад, такі:

  • slava каже:

    та до речі я не дуже селений у цих написах. Неможби ти на тому ресунку провісті доріжки від MicroCD До MMC буду дуже вдячний.

  • AndReas каже:

    Ось так виглядатиме адаптер miсroSD to MMC:

  • slava каже:
  • Нове на сайті

    >

    Найпопулярніше