[SD] Работа с SD картой. Подключение к МК. Библиотека fatFS.

Hardware issues, electronic components, schemas, Arduino, STM32, Robots, Sensors
Post Reply
Administrator
Site Admin
Posts: 81
Joined: 26-Feb-2014, 17:54

[SD] Работа с SD картой. Подключение к МК. Библиотека fatFS.

Post by Administrator » 11-Apr-2014, 17:11

Работа с SD картой. Подключение к микроконтроллеру. Часть1

Введение
В устройствах на микроконтроллерах для хранения больших объемов данных используется внешняя память. Если требуется хранить единицы мегабайт, то подойдут микросхемы последовательной флэш памяти. Однако для больших объёмов (десятки и сотни мегабайт) обычно применяются какие-нибудь карты памяти. В настоящий момент наибольшее распространение получили SD и microSD карты, о них я и хотел бы поговорить в серии материалов. В этой статье речь пойдет о подключении SD карт к микроконтроллеру, а в следующих мы будет разбираться как читать или записывать на них данные.

Распиновка SD и microSD карт
SD карты могут работать в двух режимах - SD и SPI. Назначение выводов карт и схема подключения зависит от используемого режима. У 8-и разрядных микроконтроллеров AVR нет аппаратной поддержки SD режима, поэтому карты с ними обычно используются в режиме SPI. В 32-х разрядных микроконтроллерах на ядре ARM, например AT91SAM3, интерфейс для работы с картами в SD режиме есть, поэтому там можно использовать любой режим работы.

Назначение контактов SD карты в SD режиме
sd-pin-description-1w.png
sd-pin-description-1w.png (8.07 KiB) Viewed 29801 times
Назначение контактов SD карты в SPI режиме
sd-pin-description-2w.png
sd-pin-description-2w.png (8.47 KiB) Viewed 29801 times
Подключение SD и microSD карт к микроконтроллеру в SPI режиме
Напряжение питания SD карт составляет 2.7 - 3.3 В. Если используемый микроконтроллер запитывается таким же напряжением, то SD можно подключить к микроконтроллеру напрямую. Расово верная схема, составленная путем изучения спецификаций на SD карты и схем различных отладочных плат, показана на рисунке ниже. По такой схеме подключены карты на отладочных платах фирм Olimex и Atmel.

На схеме обозначены именно выводы SD карты, а не разъема.
sd-card-spi-0.png
sd-card-spi-0.png (8.2 KiB) Viewed 29801 times
Подключение microSD карт аналогичное, только у них немного отличается нумерация контактов.

На схемах я рассматривал подключение SD карт к микроконтроллеру напрямую - без разъемов. На практике, конечно, без них не обойтись. Существует несколько типов разъемов и они друг от друга немного отличаются. Как правило, выводы разъемов повторяют выводы SD карты и также содержат несколько дополнительных - два вывода для обнаружения карты в разъеме и два вывода для определения блокировки записи. Электрически эти выводы с SD картой никак не связаны и их можно не подключать. Однако, если они нужны, их можно подключить как обычную тактовую кнопку - один вывод на землю, другой через резистор к плюсу питания. Или вместо внешнего резистора использовать подтягивающий резистор микроконтроллера.

Administrator
Site Admin
Posts: 81
Joined: 26-Feb-2014, 17:54

Re: [SD] Работа с SD картой. Подключение к МК. Библиотека fa

Post by Administrator » 11-Apr-2014, 17:33

Введение
В этой части мы рассмотрим библиотеку для работы с дисками, имеющими файловую систему FAT. Это всем известная библиотека Elm Chan`a - Petit FatFs. Она представляет собой облегченную версия библиотеки FatFs и предназначена для микроконтроллеров с небольшим объёмом оперативной памяти. Конечно, функционал Petit FatFs сильно ограничен, но имеет смысл начать знакомство с неё, потому что в ней проще разобраться.
Chan-FatFS.png
Chan-FatFS.png (2.32 KiB) Viewed 29800 times
В этой части изложена информация справочного характера, которую я почерпнул из документации на библиотеку, а в следующей части будет уже практический материал.

Состав библиотеки
Библиотека Petit FatFs состоит из 5 файлов. Изначально она не заточена под какой-т о конкретный носитель памяти с файловой системой FAT и может использоваться с любым из них. Для этого к библиотеке нужно добавить реализацию трех низкоуровневых функций для работы с диском - функцию инициализации, записи и чтения.

integer.h - здесь объявлены целочисленные типы данных, используемые в библиотеке
diskio.h - описаны прототипы низкоуровневых функций для работы с диском и статусные коды, возвращаемые функциями.
diskio.c - файл реализации низкоуровневых функций для работы с диском. Изначально содержит "пустышки".
pff.h - здесь задается конфигурация библиотеки, объявлены типы данных и прототипы функций для взаимодействия с файловой системой диска
pff.c - файл реализации функций для взаимодействия с файловой системой диска

mmc.c - здесь основные низкоуровненвые функции для работы с вашим устройством
rtc.c (.h) - дата/время
Для Milandr'a библиотеку ищите MDR_Library\MDR32F9Qx_Demo\Project\src_fatfs\

Особенности библиотеки
• Крохотные требования к ОЗУ (44 bytes + стек).
• Малый размер кода (2K-4K bytes).
• Поддерживает FAT32.
• Поддерживается один том и один файл.
• Ограничения на запись файла.

Низкоуровневая работа с SD картой
Как вы понимаете из описания выше, для работы с SD картой библиотеку Petit FatFs нужно "допиливать". А именно, писать реализацию низкоуровневых функций в файле diskio.c (или в mmc.c). На сайте автора есть архив с примерами использования библиотеки Petit FatFs с различными дисками и микроконтроллерами. Есть там и пример использования SD карт с AVR. В принципе, можно не разбираться с низкоуровневой работой с SD картой, а взять уже готовый код, что я и сделаю в следующий части.

Подключение библиотеки и настройка
1. Копируем файлы библиотеки Petit FatFs в папку проекта
2. Подключаем сишные файлы (diskio.c, pff.c)к проекту внутри среды разработки
3. Задаем конфигурацию библиотеки Petit FatFs в файле pff.h
4. Включаем (инклюдим) заголовочные файлы библиотеки (integer.h, pff.h и diskio.h) в сишный файл, где будут использоваться ее функции.
5. Реализуем низкоуровневые функции для работы с диском или подставляем вместо diskio.c (mmc.c) какой-нибудь "готовый" файл, например из примеров Elm Chan`a.

Ну а дальше используем функции библиотеки.
• pf_mount - Mount/Unmount a Volume
• pf_open - Open a File
• pf_read - Read File
• pf_write - Write File
• pf_lseek - Move read/write Pointer
• pf_opendir - Open a Directory
• pf_readdir - Read a Directory Item

FRESULT pf_mount (FATFS* fs) - смонтировать/демонтировать диск. Эта функция должна вызываться перед началом работы с диском. Она получает данные о структуре файловой системы диска и позволяет продолжить работу с его содержимым. Также функция демонтирует или виртуально отключает диск, если ее вызывать с нулевым указателем. Когда диск демонтирован, все остальные функции библиотеки возвращают FR_NOT_ENABLED (диск не смонтирован). Функция pf_mount() доступна всегда.

Параметры
FATFS *fs - указатель на объект типа FATFS. Это объект библиотеки, в котором описана структура файловой системы. На него можно взглянуть в файле pff.h. Ну а по сути, это просто переменная определенного типа, которая должна быть предварительно объявлена.

Возвращаемые значения
FR_OK - успешное завершение функции
FR_NOT_READY - не удалось инициализировать диск
FR_DISK_ERR - ошибка диска
FR_NO_FILESYSTEM - на диске нет правильного FAT раздела

Пример воспроизведения WAV-файла на ATMega16, записанного на SD-карточке

Post Reply