Trouble communicating with SD Card [solved]

I’m trying to get communication established between a P1 and an SD Card.

I’m currently using the Seeed Studio SD Card Shield V4.0b on top of the SparkFun Photon RedBoard

I’m running the following SD Card Test program:

// This #include statement was automatically added by the Particle IDE.
#include "sd-card-library-photon-compat/sd-card-library-photon-compat.h"

/*
  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.

// 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
const int chipSelect = 4;

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
  }

  delay(5000);
  
  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?");
    return;
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.print("\nCard 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(card.errorCode());
      Serial.println(card.errorData());
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }

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

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);    

  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) {

}

When I load the software, I get alternating errors of either:

Initializing SD card...Error: CMD8
Error: Sd2Card::init()
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?

or:

Initializing SD card...Wiring is correct and a card is present.

Card type: SD1
Error: Read
Error: Sd2Card::waitStartBlock()
Error: Sd2Card::readData()
Error: SdVolume::init() Cache for read
Error: Read
Error: Sd2Card::waitStartBlock()
Error: Sd2Card::readData()
Error: SdVolume::init() Cache for read2
13
132
Could not find FAT16/FAT32 partition.
Make sure you've formatted the card

To make sure the issue is not with the shield or SD card, I have tried it using an Arduino Uno and the SD library (instead of the photon-compat library) with the same shield/card and the Arduino discovers the SD card and reports its contents with no issues:

Initializing SD card...Wiring is correct and a card is present.

Card type: SD1

Volume type is FAT16

Volume size (bytes): 30841344
Volume size (Kbytes): 30118
Volume size (Mbytes): 29

Files found on the card (name, date and size in bytes): 
SYSTEM~1/     2015-10-20 21:16:14
  INDEXE~1      2015-10-20 21:16:16 76
TESTDATA.TXT  2015-11-03 13:37:46 10

Any thoughts on what would prevent the Photon from being able to communicate with a card? I realize this is a very small card (32MB!) but I wouldn’t think that would prevent it from working. I’m guessing there’s something different going on in the photon-compat library, but haven’t been able to find anything in the forum.
Thanks in advance!

@spoff, which SD library are you using and which SPI pins are you connecting to on the P1?

I’m using this library: SD-CARD-LIBRARY-PHOTON-COMPAT

And from the Seed Studio datasheet, it’s using the following pins:
D4: SD_CS;
D11: SD_DI;
D12: SD_DO;
D13: SD_CLK.

I should also note that I’m running firmware 0.4.5 because I also need the DAC pin and that’s the last version that had functioning DAC pins

@spoff, 0.4.7 should also have those pins. I am not familiar with that SD library. Is it on the web IDE?

Yes, it’s on the Web IDE. As far as I am aware, it’s a modified version of the SD-CARD-LIBRARY in order to get it to work with the Photon.

Regarding the DAC pins, did 0.4.7 fix the issue that was created in 0.4.6? As of 0.4.6, the DAC pins are non-functioning.

Could you try out one of the samples provided along with the library and do the wiring as outlined in there?

While the pin names you refered might work, I’d still recommend using the Particle nomenclature - just for clarity :wink:

Samples:

  • Spark-Card-Info.cpp
  • Spark-Datalogger.cpp
  • Spark-ReadWrite.cpp
  • Spark-SpeedTest.cpp

You’ll have to alter
#include "sd-card-library/sd-card-library-photon-compat.h"
into
#include "sd-card-library-photon-compat/sd-card-library-photon-compat.h"

2 Likes

Thanks @ScruffR, I didn’t see those functions in the library initially.

I got pulled away from the hardware this afternoon, but will try these in the morning.

1 Like

OK, it looks like it was a wiring issue. The spec on the shield was somewhat misleading because although it says it’s using the D4, D11, D12, and D13 pins on the Arduino, it was actually picking up the ICSP header for pins D11-D13, and the actual D11-D13 pins are just pass-through.

Because the Photon Redboard doesn’t have the ICSP header, nothing was being communicated to the shield except the D4 pin. So I just had to connect the D11-13 pins on the shield to the ICSP pins and it looks like it’s working now.

Thanks to @ScruffR & @peekay123 for helping me troubleshoot.

3 Likes