И снова SD... Не видит флешку (Arduino DUE)
- Войдите на сайт для отправки комментариев
Доброе утро.
Какие еще подводные камни могут ожидать при чтении SD-карты при подключении к Arduino DUE?
Насколько я понял из прочитанного здесь, DUE и MEGA мало чем отличаются в смысле распиновки.
Что же касается подключения SD-ридера, то мнения как-то расходятся вокруг 52 и 53 пина. У меня сейчас подключено вот так:
SCK(pin34) ---> pin D52 SD_CS(pin22)---> pin D53 MISO(pin29) ---> pin D50 MOSI(pin30) ---> pin D51
Не работает. Однако вот здесь пишут что в случае с DUE, CS надо подключать к 52-му пину. Где истина?
Есть примеры, когда дело было либо в нечитаемой файловой системе либо в неисправной флешке. Моя SD читается в фотоаппарате и картридере без проблем. Отформатирована в FAT. С паяльником лезть начну в последнюю очередь. Мне хочется разобраться с распиновкой.
Что касается самого скетча, то учитывая прочитанное всё выглядит вот так:
#include <SPI.h> #include <SD.h> // On the Ethernet Shield, CS is pin 4. Note that even if it's not // used as the CS pin, the hardware CS pin (10 on most Arduino boards, // 53 on the Mega) must be left as an output or the SD library // functions will not work. const int chipSelect = 53; File dataFile; void setup() { // Open serial communications and wait for port to open: SPI.begin(53); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.print("Initializing SD card..."); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(SS, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: while (1) ; } Serial.println("card initialized."); // Open up the file we're going to log to! dataFile = SD.open("datalog.txt", FILE_WRITE); if (! dataFile) { Serial.println("error opening datalog.txt"); // Wait forever since we cant write data while (1) ; } } void loop() { // make a string for assembling the data to log: String dataString = ""; // read three sensors and append to the string: for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += ","; } } dataFile.println(dataString); // print to the serial port too: Serial.println(dataString); // The following line will 'save' the file to the SD card after every // line of data - this will use more power and slow down how much data // you can read but it's safer! // If you want to speed up the system, remove the call to flush() and it // will save the file only every 512 bytes - every time a sector on the // SD card is filled with data. dataFile.flush(); // Take 1 measurement every 500 milliseconds delay(500); }
Прошу помощи !!!
Покопав немного "Sd2PinMap.h", заметил что пины назначаются явно только в AVR архитектурах. В случае с ARM всё выглядит как-то иначе:
Это тоже меня немного озадачивает... Кроме того - непонятная ситуация с пином SS...
А вот судя из этой таблицы, подключать SD надо вообще на колодку ICSP:
Однако такое подключение меня не устроит, потому что MOSI, MISO и SCK используются совместно с тачем, а он прекрасно работает и так, как подключен сейчас.
Может всё дело в уровнях?
Шилд, хоть и нестандартный, но явно расчитан на 3.3v. Тогда в чём проблема? Вот фото платы:
Поможет?
И сразу увидите номера пинов, к которым надо тыкать. Если я правильно понял вопрос.
Поможет?
И сразу увидите номера пинов, к которым надо тыкать. Если я правильно понял вопрос.
Ничего не понял, но сейчас попробую... Результат:
И что это означает? На DUE и пинов таких нет: 74, 75 и 76...
Это вот эти что ли?
Если эти, то тогда получается что DUE не даёт пользоваться программным SPI, потому что есть аппаратное что ли?
С DUE не работал, но подозреваю, что можно навесить модуль SD на нужные пины и юзать железный SPI, тогда всё взлетит ;)
Та блин, я уже подозреваю что так и придётся сделать, потому что шилд хоть и 3-х вольтовый, но явно не под DUE слеплен. Удивляюсь как тач еще заработал. Он ведь тоже MOSI и MISO использует, так еще и совместно с SD. Но подключен к обычным пинам и всё работает... Если всё-таки упереться и переназначить эти пины на нужные, то придётся лезть в "AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.7\cores\arduino/Arduino.h" и ковыряться. Потому что именно там идёт объявление всех этих 4-х лап. А я что-то не уверен в правильности такого действия.
Что-то я не пойму с этим DUE что происходит вообще. Он еще мало изучен что ли? Инфы по нему - кот наплакал!
--------------------
Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.
Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.
Это просто дефайны для номера пина CS по умолчанию. Так-то для CS можно использовать любой пин, если он в какой-нибудь библиотеке (типа Ethernet) жёстко не прошит.
Подключил напрямую к SPI - пофиг...
Я уже не знаю что придумать. Соединял вот так:
Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.
Это просто дефайны для номера пина CS по умолчанию. Так-то для CS можно использовать любой пин, если он в какой-нибудь библиотеке (типа Ethernet) жёстко не прошит.
Даже если садиш вторую ногу флешки на 10-й пин - ничего не меняется.
-----------------------------
Ой!
Я только сейчас заметил что схема подключения и рисунок внизу, мягко говоря, не совпадают...
Я соединял как написано, а не как нарисовано. Блин. А правильно-то как?
--------------------
Да, правильно было как нарисовано:
И ты был прав - взлетело ))))) Вот - зацени: заценить
Правда чуть дуньку не спалил - потух светодиод D13. Cтал светиться в треть яркости... Правда сейчас его уже попустило немного.
DUE плюс ili9341 c touch и с SD выглядет так
Графика работает, тачскрин работает, SD нормально работает с библтотекой SD.h но никак не запущу с библиотекой SdFat.
Все примеры из библиотеки marekburiak-ILI9341_due-c42e801 работают кроме работы с SdFat (ili9341 CS 10, touch CS 28, SD CS 4, перемычка J1 запаяна) . Примеры из SD.h работают , из SdFat всегда ошибка инициализации. Нашел на форуме по проблеме IDE 6.11 https://github.com/greiman/SdFat-beta но у меня и более ранних версиях IDE 1.6.5 или 1.6.8 не работает. Есть обсуждение необходимости сопротивлений R1 R2 R2 на фото, но смущает что SD.h работает.
Кто что может подсказать?
Разобрался. На зарубежных форумах https://forum.arduino.cc/index.php?topic=354873.msg2510149#msg2510149 #29 прочитал ,что нужно убирать эти R1 R2 R3 и все заработало на SPI_FULL_SPEED.