Найти тему
Электроника, ESP32, Arduino

Зачем колхозить Micro SD-MMC кардридер для ESP32

Оглавление

Не.... ну конечно можно к ESP-шке прикрутить и обычный "арудуиновский картридер" по протоколу SPI типа такого:

а то и самому спаять из адаптера для карт Micro_SD-SD:

ESP32 SD SPI
ESP32 SD SPI

Однако на платах ESP32 и ESP32-S3 для работы с SD картами есть специальная аппаратная шина.

В чем разница между библиотеками SD и SD_MMC?

SD работает на SPI, а SD_MMC использует аппаратную шину SDMMC на ESP32. SPI использует 4 коммуникационных контакта + 2 соединения питания и работает на частоте до 80 МГц. Интерфейс SPI обеспечивает гибкость при подключении контактов, поскольку соединения данных могут быть направлены через матрицу GPIO на любой контакт данных. Скорость SD-SPI составляет примерно половину скорости SD-MMC даже при использовании на 1-битной линии.

SD_MMC поддерживается только ESP32 и ESP32-S3. SD_MMC позволяет использовать 1, 4 или 8 контактов данных + 2 дополнительных контакта связи и 2 контакта питания. Контакты данных необходимо подтянуть извне.

  • 1-бит: скорость SD_MMC_ примерно в два раза выше, чем в режиме SPI;
  • 4-бит: скорость SD_MMC примерно в три раза выше, чем в режиме SPI.

Назначение контактов для ESP32-S3

На ESP32-S3 периферия SDMMC подключается к контактам GPIO с помощью матрицы GPIO. Это позволяет использовать произвольные GPIO для подключения карты SD или MMC. GPIO можно настроить с помощью следующих команд:

setPins(int clk, int cmd, int d0))
setPins(int clk, int cmd, int d0, int d1, int d2, int d3))

Назначение контактов для ESP32

На ESP32 периферийное устройство SD_MMC подключено к определенным контактам GPIO и не может быть изменено (перенаправлено).

-3

Схема переходника SD-µSD

Самодельный µSD картридер проще всего сделать из адаптера карт SD-µSD ( он частенько продается в комплекте с самой картой памяти). В Интернет нашлась его фотография в разобранном состоянии.

-4

На фотографии видно, что один из контактов (который обычно рекомендуют подключать к GND) вообще никуда не подключен - а значит его можно не распаивать.

Схема подключения для режима 4-bit

Схема подключения карты µSD к ESP32-WROVER через SD адаптер к шине SDMMC будет следующая:

ESP32 SDMMC 4-bit
ESP32 SDMMC 4-bit

Внешнюю "подтяжку" рекомендует использовать производитель. Если погуглить схему той-же ESP32-CAM, там тоже можно найти подтягивающие к 3.3V резисторы.

Для сборки потребуется кусок макетной платы, 6 резисторов номиналом 10кОм и штыревая планка 9-PIN

-6

Паять нужно быстро - адаптер пластиковый.

-7

Подключено все к плате ESP32_devkitC на которой установлен ESP32-WROVER-B (на отладочной плате ESP-WROOM-32 DevKit v1 есть встроенный светодиод, который возможно будет мешать работе шины SDMMC)

Для работы с SDMMC есть библиотека, которая подключается командой:

#include "SD_MMC.h"

4-битный режим передачи данных активируется командой:

SD_MMC.begin();

Получившийся "колхоз" взлетел сразу:

-8

но касательно платы ESP32 есть нюанс который все портит:

4-битная шина SDMMC использует 2 "установочных порта" ввода/вывода. Перед стартом плата измеряет уровни на этих GPIO и что-то там внутри себя конфигурирует. Что именно я описывать здесь не буду тема слишком обширная - лучше обратиться к документации, но на простой язык это переводится как:
до того как подано питание - лучше к этим GPIO ничего не подключать!

Еще раз смотрим схему:

-9
  • GPIO2(GPIO2) must be left floating or LOW to enter flashing mode
  • GPIO12(MTDI) boot fails if pulled high

Что из этого следует?

Чтобы залить прошивку:

  • GPIO2 необходимо соединить перемычкой с GPIO0 (в момент загрузки GPIO0 утащит за собой "вниз" и GPIO2);
  • GPIO12 - необходимо оставить болтаться в воздухе (на плате есть внутренняя подтяжка к GND).

Чтобы стартовать:

  • скинуть перемычку с GPIO2 и GPIO0;
  • GPIO12 подтянуть к 3.3V только после старта платы. (сначала подаем питание и только потом GPIO12 нужно будет подтянуть к питанию).

В сети Интернет еще попадалось какое-то такое решение:

-10

Подтяжка некоторых портов осуществляется не напрямую с питания, а с отдельного порта/ввода вывода в нужный момент, но на мой взгляд это уже перебор. Если уж так хочется именно 4-bit, то проще взять ESP32-S3, где можно воспользоваться встроенным коммутаторам и переназначить шину SDMMC на другие порты ввода/вывода.

p.s: Именно из встроенного картридера работающего на 4-bit шине ESP32-CAM прошивается таким странным образом: (отключи питание/нажми и держи кнопку/включи питание/отпусти кнопку/залей прошивку/отключи питание/включи питание - пользуйся)

Мне 4-bit режим не зашел совсем - слишком много "танцев с бубном".

Схема подключения для режима 1-bit

Компромиссное решение - используемых GPIO потребуется меньше чем для подключения по SPI, а скорость в 2 раза выше.

-11

Потребуется всего 3 порта ввода вывода - D3 на самой карте должен быть подтянут к 3.3V иначе карта будет работать в режиме SPI.

ESP32 SDMMC 1-bit
ESP32 SDMMC 1-bit

Для удобства ставим кнопочку между GPIO0 и GPIO2 (её нужно будет нажать в момент заливки скетча)

-13

SD карту на компьютере форматируем в файловую систему FAT32.

-14

Для инициализации шины SDMMC для работы в 1-bit режиме необходимо выполнить команду:

SD_MMC.begin("/cdcard", true);

Заливаем простенький скетч, который создаст на карте файлик "test.txt" и запишет в него одну строчку текста:

Вставляем карту в наш самодельный ESP32 картридер и отправляем плату в перезагрузку.

-15

Достаем карточку и вставляем в компьютер:

-16

Самодельный картридер работает как нужно. Скетч прикреплю к статье - вдруг на досуге кому-нибудь захочется по развлекаться с паяльником. Покупать готовый картридер для ESP32 совсем не обязательно - можно за час собрать его из подручных средств (причем варианта №2 и №3 в магазинах я не видел).

Режим работы SDMMC (1-bit) мне понравился - ведь у нас остается свободный интерфейс SPI. Как решить проблему с GPIO2) - вы можете прочитать в этой статье.

Тестовый скетч тут:

Test_SD_MMC_1_bit.zip

Оглавление канала тут: