Рубрики
Схемы на PIC

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

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

Ранее на нашем сайте мы уже рассматривали логгер данных на 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 карта может работать в 3 режимах:

1. SPI Mode Pin Configuration

2. One-bit SD mode Pin Configuration

3. 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 карт мы используем микроконтроллер 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.

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

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

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

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

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

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

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

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

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

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

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