SD на TFT (ili 9341) + mega 2560 r3 wifi esp8266

Добрый день. Почитал здесь всё что нашёл по этой теме. Не могу понять почему у меня не работает SD карта на TFT

Сам TFT работает, Touch тоже. Претензий нет. А SD не хочет инициализироваться.
Открыл Sd2Card.h

#else  // SOFTWARE_SPI
 // define software SPI pins so Mega can use unmodified GPS Shield
 /** SPI chip select pin */
 uint8_t const SD_CHIP_SELECT_PIN = 10;
 /** SPI Master Out Slave In pin */
 uint8_t const SPI_MOSI_PIN = 11;
 /** SPI Master In Slave Out pin */
 uint8_t const SPI_MISO_PIN = 12;
 /** SPI Clock pin */
 uint8_t const SPI_SCK_PIN = 13;
#endif  // SOFTWARE_SPI

Всё верно.
Далее загрузил тестовый скетч

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

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() 
{
  Serial.begin(9600);
  Serial.print("\nInitializing SD card...");
 
  pinMode(chipSelect, OUTPUT);
  if (!card.init(chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }
......
......

Далее скетч приводить нет смысла. Дальше инициализации дело не идёт.

Далее пытаться разбираться в Вашей проблеме нет смысла.

Если уж Вам она настолько не нужна, что лень код выложить, то нам-то и подавно.

и что тут верно? SPI пины на меге другие.
Если же вы хотите использовать СофтSpi - в библиотеке это надо включать отдельно, вы это сделали?

1 лайк
#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

const int chipSelect = 10;

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    ; 
  }

  Serial.print("\nInitializing SD card...");
  pinMode (chipSelect, OUTPUT);

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }


  Serial.println();
  Serial.print("Card 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");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

ЕвгенийП, пожалуйста. Это стандартный скетч из Примеров. Но дело не в нём, а в библиотеках.

b707, можно пожалуйста, пояснить поконкретнее. Вчера весь вечер провёл в инете.
Сегодня пол дня.
Не могу понять как и где мне в библиотеках “Sd2Card.h”, “Sd2Card.cpp”. “Sd2PinMap.h” определить что теперь SPI у меня на 11, 12, 13 пинах?
Несколько раз изменял значения в разных местах библиотеки. Не получается - откатывался или восстанавливал SD библиотеку со всеми связанными файлами.
Никакие мои изменения (по примерам из интерента) не дали результата.
…failed… и всё тут.

а зачем вам использовать SPI на этих пинах? Что мешает посмотреть, какие пины на Меге отведены под аппаратное SPI и использовать их?

Так SD на TFT


Но физически они включены не в 50-53, а в 10-13

Тогда поднимайте SoftSPI на нужных пинах.
Или соединяйте di do sck с аппартаным SPI, а ноги 10 11 12 оставьте как входы и не используйте в скетче.

А… дошло…
Вы имете в виду что пины на шилде и втыкаются только в 11 12 13?

Начните с того, что подключите СД к пинам 50-53 проводками и убедитесь, что СД-карта работает на аппаратном SPI

всё верно. Это всё на одном шилде. Щас попробую только SD часть подключить.

Подключите СД пины к 50-53 и попробуйте со стандартной библиотекой. Если заработает - тогда я вам помогу перестроить пины на 11 12 13


Вот так - работает.


Так то же работает


Это пример работы SD модуля как раз на TFT

Тогда цепляйте перемычки и управляя CS или SS общайтесь по очереди с ними.

не понял, чем отличается первое от второго

Я сначала думал что действительно проблема с SD который на TFT. Подключил отдельный модуль SD. работает. Потом снова TFT. И там заработало. Мне не нужно две SD. :)))) Мне достаточно той которая на TFT.

то есть проблема решена?

Да не хотелось бы TFT на шлейфах подключать. Как можно настроить SPI на 11-13 пины в данном случае?

В файле библиотеки Sd2Card.h в строке 47

#define MEGA_SOFT_SPI 0

поставьте единичку вместо нуля, чтобы включить SoftSPI.
Ничего больше править не надо, пины в библиотеке уже настроены на 10 11 12 13 как вы сами писали в первом сообщении

Только про скорость SOFTSPI не забывайте ! Разница минимум на порядок !