SD and SPI conflict

Hi all,

I followed this topic Problem using both SPI library and SD library in Arduino UNO program - Networking, Protocols, and Devices - Arduino Forum and found that I have the similar problem like the previous thread. I have an adafruit bluefruit le and a sparkfun microsd shield. Both of them are using SPI. I couldn't get them working together.

I saw the last post on that thread about that solution. I jumped from SD library to SDFat libary but still I couldn't get them working. I have tried testing each SPI peripheral separately and each worked fine. The bluefruit le worked fine with other SPI peripherals as well. Help me please?

/*
  SD card read/write

 This example shows how to read and write data to and from 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.

 */
#define SD_CS_PIN 53
//#include <SD.h>
#include <SdFat.h>
SdFat sd;

File myFile;

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


  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(SD_CS_PIN, OUTPUT);

  if (!sd.begin(SD_CS_PIN)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  pinMode(SD_CS_PIN, OUTPUT);
  digitalWrite(SD_CS_PIN, HIGH);

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  /*
  myFile = sd.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = sd.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  */
}

void sd_loop()
{
  // nothing happens after setup
}

Jialee

First thing in setup set all SPI device slave selects as OUTPUT and HIGH.

Hi SurferTim,

I changed my code to pull all the SS high in setup(). The Sd was initialized successfully but the Bluetooth device still couldn't start advertising.

pinMode(SD_CS_PIN, OUTPUT);
  digitalWrite(SD_CS_PIN, HIGH);
  pinMode(ADAFRUITBLE_REQ, OUTPUT);
  digitalWrite(ADAFRUITBLE_REQ, HIGH);
  if (!sd.begin(SD_CS_PIN)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

Have you tried it the other way around? Disable both slave selects, but initialize the bluetooth first, then the SD. Does the bluetooth start and the SD fail?

You didn't post your entire sketch, so i don't know what library you are using for the bluetooth device. There may be a SPI mode, speed, or bit order challenge.