Друзья и товарищи, помогите! подскажите! научите!
Снова пытаюсь заниматься с 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). Пробовал так и эдак – никакой разницы не увидел. И думаю, что этот совет ошибочный? Наверняка в драйвере предусмотрено корректное управление назначенным пином… (разбираться в библиотеке не пытался..).