Не.... ну конечно можно к ESP-шке прикрутить и обычный "арудуиновский картридер" по протоколу SPI типа такого:
а то и самому спаять из адаптера для карт Micro_SD-SD:
Однако на платах 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 и не может быть изменено (перенаправлено).
Схема переходника SD-µSD
Самодельный µSD картридер проще всего сделать из адаптера карт SD-µSD ( он частенько продается в комплекте с самой картой памяти). В Интернет нашлась его фотография в разобранном состоянии.
На фотографии видно, что один из контактов (который обычно рекомендуют подключать к GND) вообще никуда не подключен - а значит его можно не распаивать.
Схема подключения для режима 4-bit
Схема подключения карты µSD к ESP32-WROVER через SD адаптер к шине SDMMC будет следующая:
Внешнюю "подтяжку" рекомендует использовать производитель. Если погуглить схему той-же ESP32-CAM, там тоже можно найти подтягивающие к 3.3V резисторы.
Для сборки потребуется кусок макетной платы, 6 резисторов номиналом 10кОм и штыревая планка 9-PIN
Паять нужно быстро - адаптер пластиковый.
Подключено все к плате ESP32_devkitC на которой установлен ESP32-WROVER-B (на отладочной плате ESP-WROOM-32 DevKit v1 есть встроенный светодиод, который возможно будет мешать работе шины SDMMC)
Для работы с SDMMC есть библиотека, которая подключается командой:
#include "SD_MMC.h"
4-битный режим передачи данных активируется командой:
SD_MMC.begin();
Получившийся "колхоз" взлетел сразу:
но касательно платы ESP32 есть нюанс который все портит:
4-битная шина SDMMC использует 2 "установочных порта" ввода/вывода. Перед стартом плата измеряет уровни на этих GPIO и что-то там внутри себя конфигурирует. Что именно я описывать здесь не буду тема слишком обширная - лучше обратиться к документации, но на простой язык это переводится как:
до того как подано питание - лучше к этим GPIO ничего не подключать!
Еще раз смотрим схему:
- 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 нужно будет подтянуть к питанию).
В сети Интернет еще попадалось какое-то такое решение:
Подтяжка некоторых портов осуществляется не напрямую с питания, а с отдельного порта/ввода вывода в нужный момент, но на мой взгляд это уже перебор. Если уж так хочется именно 4-bit, то проще взять ESP32-S3, где можно воспользоваться встроенным коммутаторам и переназначить шину SDMMC на другие порты ввода/вывода.
p.s: Именно из встроенного картридера работающего на 4-bit шине ESP32-CAM прошивается таким странным образом: (отключи питание/нажми и держи кнопку/включи питание/отпусти кнопку/залей прошивку/отключи питание/включи питание - пользуйся)
Мне 4-bit режим не зашел совсем - слишком много "танцев с бубном".
Схема подключения для режима 1-bit
Компромиссное решение - используемых GPIO потребуется меньше чем для подключения по SPI, а скорость в 2 раза выше.
Потребуется всего 3 порта ввода вывода - D3 на самой карте должен быть подтянут к 3.3V иначе карта будет работать в режиме SPI.
Для удобства ставим кнопочку между GPIO0 и GPIO2 (её нужно будет нажать в момент заливки скетча)
SD карту на компьютере форматируем в файловую систему FAT32.
Для инициализации шины SDMMC для работы в 1-bit режиме необходимо выполнить команду:
SD_MMC.begin("/cdcard", true);
Заливаем простенький скетч, который создаст на карте файлик "test.txt" и запишет в него одну строчку текста:
Вставляем карту в наш самодельный ESP32 картридер и отправляем плату в перезагрузку.
Достаем карточку и вставляем в компьютер:
Самодельный картридер работает как нужно. Скетч прикреплю к статье - вдруг на досуге кому-нибудь захочется по развлекаться с паяльником. Покупать готовый картридер для ESP32 совсем не обязательно - можно за час собрать его из подручных средств (причем варианта №2 и №3 в магазинах я не видел).
Режим работы SDMMC (1-bit) мне понравился - ведь у нас остается свободный интерфейс SPI. Как решить проблему с GPIO2) - вы можете прочитать в этой статье.
Тестовый скетч тут:
Оглавление канала тут: