Mega + Ethernet shield не работает SD карта

Тема в разделе "Arduino & Shields", создана пользователем Вячеслав, 3 сен 2014.

  1. Всем привет.
    Есть у кого нить опыт использования SD карты на Ethernet shield подключенном к Mege?

    Все оказалось не так просто: На UNO все работает отлично, но когда переставляю на Мегу появляется ошибка:
    Initializing SD card...initialization failed!

    Скетч из примера, только поменял пин 10 на 53
    Код (Text):
    /*
      SD card basic file example

    This example shows how to create and destroy an SD card file  
    The circuit:
    * SD card attached to SPI bus as follows:
    ** MOSI - pin 11
    ** MISO - pin 12
    ** CLK - pin 13
    ** CS - pin 4

    created  Nov 2010
    by David A. Mellis
    modified 9 Apr 2012
    by Tom Igoe

    This example code is in the public domain.
       
    */
    #include <SD.h>

    File myFile;

    void setup()
    {
    // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for Leonardo only
      }

    Serial.println(SD_CHIP_SELECT_PIN);
    Serial.println(SPI_MOSI_PIN );
    Serial.println(SPI_MISO_PIN );
    Serial.println(SPI_SCK_PIN );

      Serial.print("Initializing SD card...");
      // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
      // Note that even if it's not used as the CS pin, the hardware SS pin
      // (10 on most Arduino boards, 53 on the Mega) must be left as an output
      // or the SD library functions will not work.
      pinMode(53, OUTPUT);


      if (!SD.begin(53)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");

      if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }

      // open a new file and immediately close it:
      Serial.println("Creating example.txt...");
      myFile = SD.open("example.txt", FILE_WRITE);
      myFile.close();

      // Check to see if the file exists:
      if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }

      // delete the file:
      Serial.println("Removing example.txt...");
      SD.remove("example.txt");

      if (SD.exists("example.txt")){
        Serial.println("example.txt exists.");
      }
      else {
        Serial.println("example.txt doesn't exist.");
      }
    }

    void loop()
    {
      // nothing happens after setup finishes.
    }
     
     
  2. а CS куда воткнут?

    на меге SPI на других контактах, если шилд не подключается к ICSP, то работать на меге он не будет.
     
  3. [​IMG]

    Так подключается
     
  4. geher

    geher Гуру

    ICSP разъем вроде в наличии, но имеется небольшая проблема в коде.
    Если не ошибаюсь, то данный шилд использует для SD карты в качестве CS четвертый пин. А потому все-таки SD.begin(4)
    Для Ethernet части используется десятый пин вне зависимости от того, к какой плате это дело подключено.
    Несмотря на то, что стандартный SS пин (53 на меге) ничего не включает, его трогать нельзя и надо объявить как OUTPUT.
    Тут все это расписано на англицком:
    http://arduino.cc/en/Main/ArduinoEthernetShield
     
  5. Огромное спасибо. Заработало.
     
  6. repon

    repon Нуб

    что сделали ?
     
  7. repon

    repon Нуб

    53 отключить, 4 включить?
     
  8. repon

    repon Нуб

    Код (C++):
    #include <Ethernet.h>
    #include <SPI.h>
    #include <SD.h>

    #define SWITCH_TO_W5100 digitalWrite(4,HIGH); digitalWrite(10,LOW)
    #define SWITCH_TO_SD digitalWrite(10,HIGH); digitalWrite(4,LOW)
    #define ALL_OFF digitalWrite(10,HIGH); digitalWrite(4,HIGH)

    const int W5100_RESET_PIN = 5;
    const int SD_CS = 4;


    File root;
    EthernetClient client;
    byte server[] = { 192, 168, 2, 176 };
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    IPAddress ip ( 192, 168, 2, 21 );


    void setup()
    {
      SWITCH_TO_W5100;
      pinMode(4, OUTPUT);
      pinMode(10, OUTPUT);

      Serial.begin(9600);
      Ethernet.begin(mac, ip);
      Serial.println("Ethernet start");
      Serial.print("Initializing SD card...");
      SWITCH_TO_SD;
      pinMode(53, OUTPUT);
     
      if (!SD.begin(SD_CS)) Serial.println("initialization failed!");
      else Serial.println("initialization done.");
      ALL_OFF;
    }

    void loop()
    {
      delay(2000);
      //readPage();
    ...
    }
    ТА же самая беда...

    mega+w5100. пробовал и родные примеры. и с внешним питанием и с питанием от usb. и у флешек менял ФС. не помогает)

    Initializing SD card...initialization failed!