Запись информации на SD карту с помощью микроконтроллера PIC


Карты формата SD (Secure Digital) в настоящее время являются одними из наиболее популярных типов карт, используемых для хранения информации, и находят широкое применение в смартфонах, цифровых камерах и других электронных устройствах. Но, возможно вы не знали, что записывать и считывать информацию с этих карт можно с помощью обычного 8-битного микроконтроллера. В этой статье мы исправим этот недостаток и рассмотрим запись информации на SD карту с помощью микроконтроллера PIC. Для этой цели мы будем подключать к микроконтроллеру PIC модуль работы с SD картами.

Внешний вид проекта записи информации на SD карту с помощью микроконтроллера PIC

Ранее на нашем сайте мы уже рассматривали логгер данных на SD карту на основе платы Arduino, но, к сожалению, на микроконтроллере PIC эти процессы выглядят намного сложнее чем в плате Arduino.

Различные типы SD карт

Карты формата SD (Secure Digital) представляют собой устройства хранения информации с энергонезависимой памятью, разработанные SD Associations (SDA) и предназначенные для применения в портативных устройствах. Всего существует 4 основные разновидности данных карт.

SDSC (Secure Digital Standard Capacity, стандартной емкости)

Наиболее распространенный тип SD карт. Карты этого типа обладают максимальной емкостью 2 Гб и используют файловую систему FAT16. Максимальная скорость передачи информации в этих картах составляет 12,5 Мбит/с.

SDHC (Secure Digital High-Capacity, высокой емкости)

Эти карты обладают максимальной емкостью до 32 Гб и используют файловую систему FAT32. В большинстве случаев данные карты используют скорость передачи данных 12,5 или 25 Мбит/с, но они могут поддерживать скорость до 3938 Мбит/с в зависимости от используемого интерфейса шины (UHS-I, UHS-II, UHS-III, SD-Express).

SDXC (Secure Digital eXtended-Capacity, расширенной емкости)

Эти карты обладают максимальной емкостью до 2 Тб и используют файловые системы FAT32 или exFAT. Скорость передачи данных для этих карт по умолчанию составляет 12,5 или 25 Мбит/с, но они могут поддерживать скорость до 3938 Мбит/с в зависимости от используемого интерфейса шины (UHS-I, UHS-II, UHS-III, SD-Express).

SDUC (Secure Digital Ultra-Capacity)

Эти карты обладают максимальной емкостью до 128 Тб и используют только файловую систему exFAT. Скорость передачи данных для этих карт по умолчанию также составляет 12,5 или 25 Мбит/с, но они могут поддерживать скорость до 3938 Мбит/с в зависимости от используемого интерфейса шины (UHS-I, UHS-II, UHS-III, SD-Express).

SDIO (Secure Digital Input Output)

SDIO – это тип интерфейса для карт формата SD. Он может быть использован в качестве интерфейса ввода или вывода данных.

SD карты также классифицируются с соответствии со скоростью записи на них и физическим размерам.

Основные принципы работы с SD картами

В общем случае SD карта имеет 9 контактов, но только 7 из этих контактов используются для взаимодействия с картой по интерфейсу SPI. Внешний вид SD карты формата MicroSD и модуля для работы с SD картами показан на следующем рисунке.

Внешний вид SD карты формата MicroSD и модуля для работы с ними

Стандартная SD карта может работать в 3 режимах:

1. SPI Mode Pin Configuration

Работа SD карты в режиме SPI Mode Pin Configuration

2. One-bit SD mode Pin Configuration

Работа SD карты в режиме One-bit SD mode Pin Configuration

3. Four-bit SD Mode Pin Configuration

Работа SD карты в режиме Four-bit SD Mode Pin Configuration

В данном проекте мы будем взаимодействовать с SD картой по интерфейсу SPI, более подробно об использовании данного интерфейса в микроконтроллерах PIC вы можете прочитать в этой статье. Рабочая частота обмена данными с SD картой в нашем проекте будет составлять от 100 до 400 кГц.

Необходимые компоненты

  1. Микроконтроллер PIC18F46K22 (купить на AliExpress).
  2. Модуль работы с SD картами (с регулятором напряжения 3.3 В и переключателем логических уровней) (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. Кварцевый генератор 20 МГц (купить на AliExpress).
  5. Конденсаторы 33 пФ (2шт.) (купить на AliExpress).
  6. Резисторы 4,7 кОм и 100 Ом (купить на AliExpress).
  7. Резисторы 3,3 кОм (3 шт.) и 2,2 кОм (3 шт.) для понижения уровня напряжения (если будете работать с SD картой напрямую) (купить на AliExpress).
  8. Светодиод (купить на AliExpress).
  9. Кнопка.
  10. Адаптер 12V для питания микроконтроллера PIC и модуля SD карт.
  11. Макетная плата.
  12. Соединительные провода.

Схема проекта

Схема логгера на SD карту на основе микроконтроллера PIC представлена на следующем рисунке.

Схема логгера на SD карту на основе микроконтроллера PICДля работы с модулем SD карт мы используем микроконтроллер PIC18F46K22, работающий от напряжения 5V, которое является неприемлемым для SD карт. Поскольку SD карты работают с напряжением 3.3v, то мы используем делитель напряжения для понижения напряжения с 5V до 3.3v. В данном делителе напряжения мы используем резисторы 2,2 кОм и 3,3 кОм.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

В данном проекте мы будем использовать для работы с модулем SD карт библиотеку Chan’s FatFs Generic FAT File System Module library. Для написания программы для микроконтроллера PIC18F46K22 мы будем использовать Microchip Code Configurator(MCC).

Первым делом в программе подключим используемые библиотеки.

Далее объявим две переменные fatFs и file, необходимые для работы с SD картой.

Затем запрограммируем функцию для мигания светодиода. Периодичность мигания светодиода будет задаваться с помощью Timer0. Число, загружаемое в Timer0, мы подберем таким образом чтобы период мигания светодиода составлял 1 секунду.

В основной функции программы main() мы будем вызывать функцию SYSTEM_Initialize() для инициализации периферийных устройств (прерывания, контакты, Timer0, Uart, SPI1). Также в ней мы установим глобальное разрешение прерываний и разрешим прерывания от периферийных устройств.

После этого мы будем вызывать функцию TMR0_SetInterruptHandler() чтобы задать функцию обработки прерывания от таймера, и затем мы запустим в работу Timer0.

После выполнения всех этих предварительных инициализаций мы начнем основной процесс работы с SD картой. Сначала нам необходимо будет смонтировать SD карту при помощи вызова функции f_mount() и сохранить возвращаемое ею значение в переменную под названием FRESULT. Проверив содержимое этой переменной мы можем двигаться дальше. Если ее значение равно FR_OK – это будет означать что SD карта успешно смонтирована, в противном случае эта операция не удалась. После успешного монтирования SD карты мы будем вызывать функцию call f_open() для создания файла с именем “test.txt” и затем использовать функцию f_lseek() для перемещения курсора в конец этого файла. После этого мы будем вызывать функцию f_write() для записи информации в созданный нами файл и в конце этого процесса мы будем вызывать функцию f_close() для закрытия файла на SD карте.

Тестирование работы проекта

После того как аппаратная и программная части нашего проекта будут готовы мы протестируем его работу с помощью лога, присутствующего в коде нашей программы. Как вы можете видеть, мы использовали конвертер USB в UART чтобы выводить лог отладки в окно монитора последовательной связи, в качестве которого мы использовали программу PuTTY.

Использование программы PuTTY в качестве монитора последовательной связи

После того как мы увидим сообщение 'Create a file successful' мы вытащим нашу SD карту из модуля для работы с SD картами и поместим SD карту в компьютер чтобы проверить успешно ли записался на нее наш файл.

Проверка наличия созданного файла на SD карте

После этого можно открыть файл и проверить его содержимое – так мы проверим успешность нашей операции записи в этот файл.

Проверка содержимого файла на SD карте

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
903 просмотров

Комментарии

Запись информации на SD карту с помощью микроконтроллера PIC — 2 комментария

  1. хотелось бы поподробнее узнать, каким образом для работы с 2ТБ используется FAT32 на картах SDHC

    • Ну может быть небольшая опечатка в статье. Но не в этом же основной смысл статьи. ))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *