Полка с «нерабочими» SD-модулями у меня выросла до четырёх штук, пока я не сел и не разобрал историю каждого. Итог смущает своей простотой: ни один не сгорел. Первый питался пятью вольтами напрямую, будучи модулем без стабилизатора. Второй получал питание через полметра тонких перемычек и проседал на первой же записи. Третий честно молчал на карте из новой камеры — 64 гигабайта в exFAT. Четвёртый отказывался работать после горячей замены карты без выгрузки. Код во всех четырёх случаях был один и тот же — пример из библиотеки, который на столе у автора статьи работает идеально.
Разберу четыре ямы в порядке частоты: питание и уровни, формат и объём карты, имена файлов и порядок выключения — end(). Это не замена построчной диагностике: если хочется двигаться по симптомам от begin к файлам, есть урок про диагностику begin и большой чек-лист. Здесь же — те четыре причины, которые закрыли мою полку, с числами и условиями, при которых каждая срабатывает.
Питание: кто должен давать карте 3,3 В
Карта внутри — трёхвольтовое устройство, и вопрос всегда один: кто понижает напряжение. Модули с крупной плоской микросхемой-стабилизатором (AMS1117) и преобразователем уровней едят пять вольт от Uno и сами разбираются с картой. Тонкие модули-«лепестки» с шестью выводами и без заметных микросхем стабилизатора не имеют: пять вольт на VCC убивают карту за секунды, а заявленная совместимость с картинками из интернета заканчивается походом за новой картой. Признак простой: если на плате кроме разъёма ничего нет, питание строго 3,3 В, и не «примерно», а по паспорту.
Диагностика работает только по одному пункту за раз: сменили питание — проверили; сменили карту — проверили; поменяли три вещи сразу, и begin прошёл — так и не узнаете, что именно было виновато, а в следующий раз поиск займёт тот же вечер. Второй арбитр, о котором забывают, — картридер компа или телефона: если и он не видит карту, модуль ни при чём, и проверки проводки можно смело пропускать. Моя полка выросла из-за обратного принципа: я чинил всё сразу, перепаивал, переформатировал, переставлял библиотеки — и каждая новая сборка унаследовала все болячки предыдущей.
Второй слой — пиковый ток: при записи карта тянет скачком до 100-200 миллиампер на десятки миллисекунд, и тонкие длинные перемычки роняют питание именно в этот момент. Классическая картина: begin проходит, первая строка пишется, а на пакетной записи или при быстром темпе карта замолкает до перезапуска. Лечение — короткие толстые провода и электролит 100-470 микрофарад вплотную к модулю; механику просадок и уровней разобрал в уроке про просадки питания и уроке про 3,3 и 5 вольт. Добавлю от себя выбор модуля под плату: для ESP32 с трёхвольтовой логикой модуль с AMS1117 становится хуже — стабилизатору с падением около вольта входные 3,3 В не хватает, и карта недополучает питание; там берут модуль без стабилизатора или с современным малопадающим LDO.
Формат и объём: FAT16, FAT32, exFAT
Библиотека SD понимает FAT16 и FAT32 — и только их. Раскладка по ёмкости жёсткая: карты до 2 ГБ размечены FAT16, SDHC от 2 до 32 ГБ — FAT32, а SDXC больше 32 ГБ приходит из магазина в exFAT и молчит без вариантов: begin false при живой, исправной карте. Отсюда же первое, что советуют в каждой инструкции, — «отформатируйте карту в FAT32 на компьютере»: это не ритуал, а приведение разметки к тому, что библиотека умеет читать. Разметка из телефона и быстрое удаление в камере не всегда совпадают с ожиданиями библиотеки; форматирование на компьютере — одна кнопка и ноль загадок.
Соблазн купить карту на 128 ГБ за цену двух на 8 ГБ я понимаю, но обход — сторонняя утилита, размечающая SDXC в FAT32, — у меня работал нестабильно: карта поднималась и отваливалась на больших записях. Гигабайты логу не нужны: строка в 40 байт при минутном интервале набирает 56 КБ в сутки, и карта на 8 ГБ заполняется за срок, который переживёт и проект, и его автора. Мои логгеры живут на старых картах 2-8 ГБ, оставшихся от телефонов: старые карты предсказуемее по температурному диапазону и по поведению при пиках записи.
Третья ловушка формата — корень FAT16: в корневом каталоге не более 512 записей, и это не про объём записей, а про число файлов. Сотня файлов с длинными именами съедает записи быстрее, чем кажется: каждое длинное имя занимает несколько записей каталога — по одной на каждые 13 символов сверх короткого имени. Лимиты корня и стратегии именования разобраны в уроке про 8.3 и лимиты корня; на практике логгеру хватает одного файла в сутки, и корень пустеет годами.
Имена и end(): два пункта из конца списка
С именами правило короткое: формат 8.3 — надёжный минимум (LOG0724.CSV), современные сборки библиотеки умеют длинные имена, но каждое платит записями каталога, а запрещённые символы — слэш, двоеточие, звёздочка, вопрос, кавычки — дают молчаливый false от open без единого сообщения. Если файл не открывается, первым делом посимвольно проверьте имя: в половине случаев там штамп с двоеточием, скопированный из строки журнала. Русские буквы в имени — отдельный сюжет: скетч пишет их в UTF-8, и на карте имя выглядит кракозябрами, хотя открывается.
end() — операция, о которой вспоминают последней, а зря. SD.end() выгружает карту с шины и освобождает SPI-интерфейс; он нужен в двух сюжетах. Первый — горячая замена: карта вынута, вставлена обратно, и попытка begin поверх старого монтирования — типичный источник молчаливых отказов; правильная последовательность — end, пауза 500-800 миллисекунд, чтобы контроллер карты пришёл в себя, затем begin. Второй — чистое завершение: перед выключением питания close для файла и end для карты, тогда каталог гарантированно обновлён. Что происходит на шине, когда на ней несколько устройств, — в уроке про CS и общую шину.
Пятая яма добавилась к четырём позже — общая шина SPI с экраном. У карты и TFT-дисплея свои ножки CS, и если одна из них висит в воздухе или дублирует чужую, экран ловит байты, адресованные карте: begin false при идеальном питании и каша на половине кадра. Висящий CS — обманчивый гость: проводов вроде хватает, а шина делит одну линию между двумя слейвами. Лечение из скетча: каждому слейву свой CS, а свободные входы выборки подтянуты к плюсу через 10 кОм — инверсная логика SPI держит слейва спящим именно высоким уровнем.
Про такты на шине — одна строка, которой не хватает половине форумных советов. При инициализации карта обязана получать такты не быстрее 400 килогерц, дальше библиотека поднимает частоту сама; на длинных проводах и в соседстве со шлейфом дисплея запас фронта срезается так же, как на I2C, и карта поднимается через раз. Мне дважды помогало ограничение частоты SPI в вызове begin — медленный, зато честный режим вместо перезагрузок.
#include <SPI.h>#include <SD.h> const int CS_PIN = 10;File logFile; void beginCard() { Serial.print("SD.begin: "); if (SD.begin(CS_PIN)) { Serial.println("ок, карта примонтирована"); } else { Serial.println("false: питание -> формат -> проводка, по порядку"); }} void setup() { Serial.begin(9600); beginCard(); Serial.println("команды: 1 - дописать строку, 2 - end(), 3 - begin заново");} void loop() { if (Serial.available() > 0) { int cmd = Serial.parseInt(); if (cmd == 1) { logFile = SD.open("log.csv", FILE_WRITE); if (logFile) { logFile.println("row"); logFile.close(); Serial.println("строка уехала, файл закрыт"); } else { Serial.println("open false: имя живое? карта ещё примонтирована?"); } } if (cmd == 2) { SD.end(); Serial.println("карта выгружена: end() отпустил шину SPI"); } if (cmd == 3) { delay(600); // контроллеру карты нужна пауза beginCard(); } }}На стенде раскрутите все три отказа по очереди. Подведите питание ниже 4,4 вольта и вставьте карту — begin false с формулировкой про стабилизатор; переразметьте Serial-командой 3 — отказ со ссылкой на exFAT при идеально здоровой карте. Выньте карту без end-строки в мониторе и вставьте снова: модель напоминает последовательность end, пауза, begin — именно её в реальном скетче пропускают чаще всего, а потом списывают отказ на сгоревший модуль.
Граница метода: если все четыре ямы проверены — питание под нагрузкой в норме, карта FAT32, имя чистое, begin после end с паузой, — а карта всё равно молчит, это доживающая карта: копируйте архив и меняйте. Дешёвые noname-карты с уценённым контроллером дают отказы вне всяких закономерностей; брендовая карта нижней полки стоит дешевле, чем вечер на полке с четырьмя «нерабочими» модулями, из которых нерабочих ноль.
Последняя мелочь полки — механика контактов. Карта, годами лежащая в слоте дачного логгера, подрастает плёнкой окисла, и begin начинает проходить через раз: ластик по золотым площадкам и продувка слота возвращают контакт за минуту. Деградация та же, что у окислившегося разъёма шины в соседнем разделе, — ползёт неделями, а лечится одним движением, если помнить о ней до покупки нового модуля.
| Симптом | Виновник | Быстрая проверка |
|---|---|---|
| begin false сразу | модуль без стабилизатора на 5 В или просевшая линия | что стоит на плате модуля; VCC под нагрузкой |
| begin false на новой карте | SDXC 32+ ГБ в exFAT | переформатировать в FAT32 на компьютере |
| open false на живой карте | двоеточие или слэш в имени, длинные имена в полном корне | посимвольно проверить имя; сменить на 8.3 |
| молчит после горячей замены | begin поверх старого монтирования | end, пауза 500-800 мс, затем begin |
- 1. Карта SDXC на 64 ГБ из магазина в Uno не поднимается. Что с ней не так?
- 2. На модуле кроме разъёма карты нет ни одной микросхемы. Чем его питать?
- 3. Карту вынули и вставили обратно, begin возвращает false. Первое действие?
- 4. Сколько записей вмещает корневой каталог FAT16?
- 5. open("12:30.csv") на FAT-карте вернёт...
- Порядок диагноза begin false: питание, формат, проводка — закрыли мою полку из четырёх «нерабочих» модулей, среди которых сгоревших ноль.
- Модуль без стабилизатора ест строго 3,3 В; с AMS1117 — 5 В; на ESP32 стабилизатор с падением около вольта не вытягивает из 3,3 В входа.
- Библиотека SD понимает только FAT16/FAT32: SDXC в exFAT молчит; логгеру хватает карт 2-8 ГБ, корень FAT16 — до 512 записей.
- Имена в формате 8.3 проходят везде; двоеточие и слэш дают молчаливый false от open — имя проверяется посимвольно.
- SD.end() отпускает шину: горячая замена — end, пауза 500-800 мс, begin; перед выключением — close и end.
Частые вопросы по теме урока
- Карта SDXC на 64 ГБ из магазина в Uno не поднимается. Что с ней не так?
- SDXC больше 32 ГБ приходит в exFAT, который библиотека SD не читает. Переформатирование в FAT32 возвращает карту в строй; сторонняя утилита для такой разметки у меня работала нестабильно. Размечена в exFAT: нужна переформатировка в FAT32
- На модуле кроме разъёма карты нет ни одной микросхемы. Чем его питать?
- Модули без стабилизатора отдают картине ровно то, что на VCC: карта трёхвольтовая, и пять вольт выводят её из строя за секунды. Модуль с AMS1117 и преобразователем уровней ест пять вольт. Строго 3,3 В: пять вольт убьют карту
- Карту вынули и вставили обратно, begin возвращает false. Первое действие?
- Повторный begin поверх старого монтирования — классический источник молчаливых отказов. Правильная последовательность: end отпускает шину, пауза даёт контроллеру карты прийти в себя, begin монтирует заново. SD.end(), пауза 500-800 мс, затем begin
- Сколько записей вмещает корневой каталог FAT16?
- Корень FAT16 — фиксированные 512 записей, и длинные имена съедают по несколько на файл. Для логгера с одним суточным файлом запаса хватает на годы. До 512 записей
- open("12:30.csv") на FAT-карте вернёт...
- Двоеточие — запрещённый символ FAT, и open возвращает false без единого сообщения. Имена собираются из цифр, букв и дефиса — после посимвольной проверки. false молча, без сообщений в мониторе