Sd card problems and data logging

Hi, I am recently working with a project with arduino uno which includes a data logging, I am using a very common sd card module for the arduino boards. When I started to work with it, first I just uploaded the cardinfo code from the example in the arduino ide and
it shows :
Initializing SD card...initialization failed. Things to check:

  • is a card inserted?
  • is your wiring correct?
  • did you change the chipSelect pin to match your shield or module?

I am sure that the connections are correct, card also inserted correctly and I also tried every possible chipselect and again tried and it again shows the same thing in serial monitor and I also checked a lot of times. but the same results .

and I also formated the sd card (with this : https://www.sdcard.org/downloads/formatter/ ) but nothing changed.

now recently I have managed the Arduino to read the sd card CardInfo but in a weird way, at first if you run it it wont be able to read the sd card but, (take out the sd card)if you press the rerun button on the arduino and then put in the sd card, it will be able to read it, this is the only way to read it, if it manages to read the sd card it will not be able to write to the sd card no matter what, so it is possible to read the card in a very specific way but nothing else.
connections :
VCC = 5v
GND = GND in Arduino NANO
MOSI - pin 11 on Arduino NANO
MISO - pin 12 on Arduino NANO
SCK - pin 13 on Arduino NANO
CS - PIN 4 and I also tried in pin 10 and 8(all of them)

this code is just for me to check if the sd card is working good with a arduino, the project I am using this for is a data logging witch reads an nfc tag and if it is able to read it and the tagid is a match to the one in the system then it will open an electro magnetic lock with a relay, this my seem a bit complicated but it is pretty simple , I have managed to connect all the stuff all that is left is the data logging witch I have problems with. if any one else whants the full code i will post it

/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SD.h>
#include <SPI.h>
// Is card inserted
#define SDmissing 7
long timeStamp;
String timeStampString;
int hours = 0; 
int minutes = 0; 
int seconds =0; 
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = 10;

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


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, 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.");
  }

  // print the type of card
  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);
}

if (!digitalRead(SDmissing)) {

    // Now able to write to file
    File dataLog = SD.open("SDLog.txt", FILE_WRITE);

    // Log data
    timeStamp = millis(); 
    hours = (timeStamp / 1000) / 60 / 60; 
    minutes = (timeStamp / 1000) / 60 % 60; 
    seconds = (timeStamp / 1000) % 60; 
    timeStampString = String(hours) + ":" + String(minutes) + ":" + String(seconds);     
    
    if (dataLog) 
    {
      Serial.println(timeStampString);
      dataLog.println(timeStampString);
      // Close file
      dataLog.close();
    }
    else
     {
      initSDCard();
    }
  }
  else 
  {
    initSDCard();
  }

  // Artificial delay to reduce data written to card!
  delay(1000);
}

void initSDCard()
{
  // Expected configuration for SPI/SD library:
  // MOSI – pin 11
  // MISO – pin 12
  // SCK (CLK) – pin 13
  // CS – pin 10(can be changed)

  while (!SD.begin()) 
  {
    Serial.println("------------------------------");
    Serial.println("SD Card not found / responding");
    Serial.println("Insert a formatted SD card");
    Serial.println("------------------------------");
    SD.end();
    delay(1000);
  }

  return;
}

Blockquote

Blockquote

Blockquote

Does said SD-card module have a 3.3V regulator? SD-cards work at 3.3V
Ref:
Guide to SD Card Module with Arduino | Random Nerd Tutorials

Not all SD-cards work on Arduino, process is hit&miss. Older 4G cards work best for me.

Best SD-card ? - Using Arduino / Storage - Arduino Forum

the sd card module has a 3.3v regulator and I can connect a 3.3v cable straight to it.(didn't know sd cards worked with 3.3v).
I have an old sd card (optima sd 2gb) it was not even able to read it.
and I have an sanDisck 32gb micro sd with an adapter. still the same problem

thank you very much

Ref:
Lab: Data Logging With an SD Card Reader using SPI Communication – ITP Physical Computing (nyu.edu)

The MicroSD card reader/writer shown in Figures 3, 7, and 8 is from Sparkfun, and has level-shifting circuitry built-in to adjust for either 3.3- or 5-volt operation. There are many other models on the market though. Here’s an Adafruit model. Here’s a Pololu model. Here’s a DFRobot model. All of them will communicate with your microcontroller in basically the same way, though, using the SPI pin connections.

I do not know if your card has level-shifting. Do You?
Cheap level shifting uses resistors.
Great level-shifting is active:

Logic Signal Voltage Levels | Logic Gates | Electronics Textbook (allaboutcircuits.com)

I do not know if the card has level shifting, but I bought a new sd card reader, so i will see how it goes. do you think the problem might be in the arduino uno?

Were the Arduino defective, it is my opinion the software would never be able to function; therefore likely wiring, adapter, level-shifting, etc.

  • read attempt failed (the quote above)
  • the wires are right
  • the SDcard is good
  • read/wires/adapter/SDcard intermittently works

Verify the adapter (not the reader, but the plastic housing with metal tabs).

You may have noticed that there is no RESET line to the SD module. This means when the cpu is reset by downloading, the SD card does NOT reset, and the firmware gets confused.
Remedy this by powering down the project instead of just resetting it. Then at power up, all should be good.
Other issues: Max SD card size is limited to 32gb, file names MUST be DOS 8.3 compliant.

so every time I want to use the sd card to write and read I need to power it off and on?

Only after flashing. Once you have downloaded, a hard reset (power cycle) is best. In normal operations it works like a charm.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.