И снова SD... Не видит флешку (Arduino DUE)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Доброе утро.

Какие еще подводные камни могут ожидать при чтении 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);
}

 

Прошу помощи !!!

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Покопав немного "Sd2PinMap.h", заметил что пины назначаются явно только в AVR архитектурах. В случае с ARM всё выглядит как-то иначе:

#if defined(__arm__) // Arduino Due Board follows

#ifndef Sd2PinMap_h
#define Sd2PinMap_h

#include <Arduino.h>

uint8_t const SS_PIN = SS;
uint8_t const MOSI_PIN = MOSI;
uint8_t const MISO_PIN = MISO;
uint8_t const SCK_PIN = SCK;

#endif // Sd2PinMap_h

 

Это тоже меня немного озадачивает... Кроме того - непонятная ситуация с пином SS...

А вот судя из этой таблицы, подключать SD надо вообще на колодку ICSP:

Однако такое подключение меня не устроит, потому что MOSI, MISO и SCK используются совместно с тачем, а он прекрасно работает и так, как подключен сейчас.

Может всё дело в уровнях?

Шилд, хоть и нестандартный, но явно расчитан на 3.3v. Тогда в чём проблема? Вот фото платы:

Piccy.info - Free Image Hosting

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Поможет?

Serial.println(SS);
Serial.println(MOSI);
Serial.println(MISO);
Serial.println(SCK);

И сразу увидите номера пинов, к которым надо тыкать. Если я правильно понял вопрос.

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

Поможет?

Serial.println(SS);
Serial.println(MOSI);
Serial.println(MISO);
Serial.println(SCK);

И сразу увидите номера пинов, к которым надо тыкать. Если я правильно понял вопрос.

 

Ничего не понял, но сейчас попробую... Результат:

Initializing SD card...
SS: 10
MOSI: 75
MISO: 74
SCK: 76
Card failed, or not present

И что это означает? На DUE и пинов таких нет: 74, 75 и 76...

Это вот эти что ли?

Если эти, то тогда получается что DUE не даёт пользоваться программным SPI, потому что есть аппаратное что ли?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

С DUE не работал, но подозреваю, что можно навесить модуль SD на нужные пины и юзать железный SPI, тогда всё взлетит ;)

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Та блин, я уже подозреваю что так и придётся сделать, потому что шилд хоть и 3-х вольтовый, но явно не под DUE слеплен. Удивляюсь как тач еще заработал. Он ведь тоже MOSI и MISO использует, так еще и совместно с SD. Но подключен к обычным пинам и всё работает... Если всё-таки упереться и переназначить эти пины на нужные, то придётся лезть в "AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.7\cores\arduino/Arduino.h" и ковыряться. Потому что именно там идёт объявление всех этих 4-х лап. А я что-то не уверен в правильности такого действия.

Что-то я не пойму с этим DUE что происходит вообще. Он еще мало изучен что ли? Инфы по нему - кот наплакал!

--------------------

Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Buzzer2010 пишет:

Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.

Это просто дефайны для номера пина CS по умолчанию. Так-то для CS можно использовать любой пин, если он в какой-нибудь библиотеке (типа Ethernet) жёстко не прошит.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Подключил напрямую к SPI - пофиг...

Piccy.info - Free Image Hosting

Я уже не знаю что придумать. Соединял вот так:

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

DIYMan пишет:

Buzzer2010 пишет:

Кстати! SS и CS - это одно и тоже что ли? Я спрашиваю потому что его изменить тоже не удаётся. Он висит тупо на 10-м пине и никуда не двигается.

Это просто дефайны для номера пина CS по умолчанию. Так-то для CS можно использовать любой пин, если он в какой-нибудь библиотеке (типа Ethernet) жёстко не прошит.

Дело в том что как бы я не назначал переменную "const int chipSelect = 4;", пишет всёравно SS: 10

Initializing SD card...
SS: 10
MOSI: 75
MISO: 74
SCK: 76
Card failed, or not present

 

Даже если садиш вторую ногу флешки на 10-й пин - ничего не меняется.

-----------------------------

Ой!

Я только сейчас заметил что схема подключения и рисунок внизу, мягко говоря, не совпадают...

Я соединял как написано, а не как нарисовано. Блин. А правильно-то как?

--------------------

Да, правильно было как нарисовано:

И ты был прав - взлетело ))))) Вот - зацени: заценить

Правда чуть дуньку не спалил - потух светодиод D13. Cтал светиться в треть яркости... Правда сейчас его уже попустило немного.

mikelari
Offline
Зарегистрирован: 14.05.2015

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 работает.

Кто что может подсказать?

mikelari
Offline
Зарегистрирован: 14.05.2015

Разобрался. На зарубежных форумах https://forum.arduino.cc/index.php?topic=354873.msg2510149#msg2510149 #29 прочитал ,что нужно убирать эти R1 R2 R3 и все заработало на  SPI_FULL_SPEED.