Заново: Работа с картой SD

Друзья и товарищи, помогите! подскажите! научите!
Снова пытаюсь заниматься с SD картой после долгого перерыва. Раньше экспериментировал с записью данных с датчика на карточку, все работало..
Занялся отладкой других функций (барометр, альтиметр.. и некая логика летательного аппарата). Подошла очередь до записи протоколов на SD-карту - и тупик какой-то.. (скетч 1).

/*
Подключение SD-модуля
MOSI - D11
MISO - D12
SCK - D13
CS - D4
VCC - 5в
GND - общий
*/
#include "SPI.h"
#include "SD.h"
File myF;

void setup()
{
    Serial.begin(9600);  // запускаем монитор порта
    //pinMode(4, OUTPUT);
    if (SD.begin(4)) //Активация SD карты
    {
        Serial.println("Ok SD");//доклад
        myF=SD.open("TSD.TXT",FILE_WRITE);
        Serial.println(myF);
        if(myF)
        { 
            Serial.println("Open file");
            myF.println(millis());
            myF.println("Начало");
            delay(2000);
            myF.println(millis());
            myF.println("Конец");
            myF.close();
            Serial.println("Close file");
        }
        else
        {
            Serial.println("Err file");//Ошибка
        }

    }
    else
    {
        Serial.println("Err SD");//Ошибка
    }
}
void loop() 
{
}

Суть: не определяется карта на начальном этапе … SD.begin().., не говоря уже о записи файла.
Пробовал на 3х разных картах (0.5, 2 и 8 гб), на двух экземплярах модуля SD; порт для «CS» 4 или 10.. - ничего не помогает.
Пробовал и скетч 2. - тоже проблема на самом начальном этапе .. card.init().

#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 4;

void setup() {
    //pinMode(chipSelect, OUTPUT);
    Serial.begin(9600);
    Serial.print("Init...");

    if (!card.init(SPI_HALF_SPEED, chipSelect)) {
        // неверное подключение или карта неисправна
        Serial.println("failed");
        return;
    } else {
        // карта ок!
        Serial.println("correct");
    }

    // считываем тип карты и выводим его в COM-порт
    Serial.print("type: ");
    switch (card.type()) {
        case SD_CARD_TYPE_SD1:
            Serial.println("SD1");
            break;
        case SD_CARD_TYPE_SD2:
            Serial.println("SD2");
            break;
        case SD_CARD_TYPE_SDHC:
            Serial.println("SDHC");
            break;
        default:
            Serial.println("Unknown");
    }

    // инициализация файловой системы
    if (!volume.init(card)) {
        // неверная файловая система
        Serial.println("not FAT16/FAT32");
        return;
    }

    // считываем тип и вычисляем размер первого раздела
    uint32_t volumesize;
    Serial.print("Volume  ");
    Serial.println(volume.fatType(), DEC);
    Serial.println();

    volumesize = volume.blocksPerCluster(); // блоков на кластер
    volumesize *= volume.clusterCount(); // кластеров
    volumesize *= 512; // 512 байтов в блоке, итого байт.. 
    volumesize /= 1024;
    volumesize /= 1024;
    Serial.print("Volume size (Mbytes): ");
    Serial.println(volumesize);

    Serial.println("Files ");
    root.openRoot(volume);
    // выводим список файлов
    root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop() {
}

НО!!

ИНОГДА в скетче 2 карта определяется! Но тогда застревает на определении файловой системы.. Пишет:

Init…correct

type: SD1

not FAT16/FAT32

НО! И это не предел. Очень иногда файловая система определяется и список существующих файлов печатает! Было такое раза 2, к сожалению сохранить протокол не догадался..

Возвращаясь к скетчу 1 – там был раз (или два..) случай, когда SD.begin() прошел, но дальше опять ступор – файл на карточке не создался..

Больше всего озадачивает нестабильность работы (хотя какая «нестабильность»? 95% попыток неуспешны в зародыше). Вот что-то делаю «не так»…

Экспериментирую с Nano Atmega328P
Может кто подскажет куда рыть?

И еще вопрос: в некоторых примерах из web пишут, что «нужно обязательно определять пин для «CS» как «выход» (pinMode(4, OUTPUT). Пробовал так и эдак – никакой разницы не увидел. И думаю, что этот совет ошибочный? Наверняка в драйвере предусмотрено корректное управление назначенным пином… (разбираться в библиотеке не пытался..).

Оно работает только до 2Гб и ещё есть разница FAT16 и FAT32. Имена файлов должны быть 8.3, с длинными именами беда. Вы ничего про это не пишете.

Если хотите реальной помощи, то сделайте следующее:

Забудьте про "Пробовал на 3х разных " … “Пробовал так и эдак” … и напишите ОДИН скетч для ОДНОЙ карты небольшого размера и приведите заодно точно содержимое самой карты.

Тогда кто-то сможет запустить это у себя и посмотреть, а там и, может быть, что-то подсказать.

Спасибо что откликнулись. Выше - это история. Конкретно без “пробовал так и этак”:

Да, не все (про карточку) написал, исправляюсь
Карточка 512 мб, пустая (отформатирована заново)
FAT16
(раньше именно с этой карточкой все работало)
Скетч из поста выше - (первый) - он реальный
Имя файла который пытаюсь создать - 3.3 (см скетч)

Имя файла 8.3 ведь подразумевает, что имя 3.3 допустимо?

А какой длины провода от карточки до процессора? У меня такое было поведение с длинными проводами (15 см).

Попробуйте понизить частоту шины SPI, до минимально возможных значений - 400 кгц, например. Посмотреть, поменяется ли поведение.

фото модуля покажите

почему “ошибочный”? В любом случае хуже не будет

Запустите примеры из библиотеки для проверки, чтобы не гадать, а быть уверенным в коде. Если не заработают - ищите проблемы в железе

А на SPI больше ничего нет? Типа зернета?

Всем спасибо за участие. Отлучался, но сейчас всем отвечу:
-провода - типовые перемычки для макетирования. ~18 см. Попробую сделать короткий комплект для “попробовать” но чуть позже
-с “понижением частоты SPI” мысль понял, но пока это для меня недоступно. Надо почитать где и как.. наверное разберусь. Тоже взял на заметку “на попозже”
-фото модуля. Счас сделаю и дошлю (еще вспомнить надо как фото вставлять). У меня два типа: один для микро SD, второй для SD. Модулей для микро у меня два экз, пробовал с обоими. Модуль “для не микро” пробовал только один экземпляр (хотя есть еще).
-насчет “ошибочного” pinMode(4, OUTPUT): я не говорю что этот оператор ошибочный, но то что он в одних примерах есть, в других нет - по моему мнению говорит о том, что он бесполезный (возможно и не вредный, но..). Год назад, когда я впервые осваивал работу с SD (и все заработало) - у меня такой оператор отсутствовал. Нынче я пробовал с ним и без, разницы не увидел
-Примеры из библиотеки запускал “как есть” - и с ними собственно все также и происходит: в основном никак но иногда (очень иногда) есть частичное продвижение
-Проблемы в железе: модули, как уже написал, пробовал разные (3 шт), карточки тоже разные экземпляры (512 мб у меня единственная, но есть 2 гб). Сама Nano прекрасно работает (в других скетчах) с датчиком давления/температуры, с rtc-часами, с дисплеем 2х16 строк - вроде нет оснований на нее ругаться. Но да, вдург у нее проблема именно с теми выводами, которые в других проектах не используются? D-11,12,13. ? Для очистки совести попробую другой экземпляр. Распаяная с ножками на данный момент у меня есть только 168-я, но есть UNO. Попробую, но тоже не совсем сейчас..
-на SPI ничего другого нет. Конечно потом будет юзать не сама по себе, а с часами, датчиками и т.п., но сейчас экспериментирую исключительно только с кодом для SD.
Заключение: на вопросы я ответил(?), а проверку рекомендация сделаю постепенно - результаты доложу в любом случае. Увы, наверное в ближайшие пару дней у меня будут ограничены возможности заниматься…

У этого модуля уровень логических сигналов 3.3в. А вы его напрямую к 5в плате подключили. Итогом может быть что угодно, от просто глюков вплоть до поджаривания чипа. Так что я бы не удивлялся, что модуль иногда работает, а чаще нет.

Для проверки возьмите новый модуль и подключите управляющие сигналы через двух-сторонний преобразователь уровней 5в - 3в3.
Или, еще лучше, сразу взять Ардуино с напряженем 3в3.

Учитывайте, что питание модуля должно остаться 5в.

“у этого” - у которого из двух? А если питать Nano от аккумулятора 3,7 в?
Вот на плате для “не микро” есть вход на 5в и 3,3 в - я понимал так, что можно питать его вариантно.. (и я пробовал в том числе питать от 3,3, но при этом сама Nano конечно висела на USB)

Не надо. Такой должен работать. Даже если короткий заработает - причину надо искать и устранять.

А чего тут недоступного? SPI.setClockDivider() | Аппаратная платформа Arduino

Ну.. “недоступно” в том смысле что я с такими тонкостями пока не знакомился. Вообще хотел бы (мечтать не вредно) заниматься чисто конечными функциями/логикой, а не настройками аппаратуры/протоколов. Но куда ж денешься - буду вникать по мере необходимости. Почитаю.. - что бы делать с каким-то пониманием

скорее всего для обоих. Для того чтобы сказать четко - нужно видеть описание модуля, желательно со схемой.

Питать - да, можно. Проблема в том, что преобразование 5в >> 3.3 сделано только для питания, а для логических выводов нет. То есть микросхема всегда работает от 3.3вольт, а вот логические сигналы вы подаете на нее 5в. Это плохо и может привести к повреждению.
Кроме того, обратный сигнал от СД к ардуине получается всегда 3.3в. А Ардуина у вас на 5в - то есть сигнал может не распознаваться как высокий уровень и связи не будет.

В целом правильное соединение возможно только либо при использовании преобразователя уровня, либо если микроконтроллер имеет напряжение 3.3в

Впрочем, зачем я вам это пишу??? Я вижу что старая тема именно на этом и заглохла - вам было сказано, что на модуле проблемы с уровнем сигналов, а вы начали спорить.

Похоже, за год так и не дошло.
Каждый сам кузнец своего счасться… в том числе и идиоты.

Верхний, к которому подключены дюпоны, без преобразователя уровней.