The short of it:
I'm using a Teensy 3.6 and a (slightly) modified TwoCards.ino routine from the SdFat library setup for the Teensy SdCard slot and an SPI SdCard. CardInfo for both the cards runs fine, but when I run TwoCards, the Teensy SdCard gives an error on mkdir.
I have no idea how to debug this, so any thoughts are most welcome. SdInfo.ino works for both (by changing USE_SDIO) and TeensySdioDemo.ino works for the Teensy. I also swapped the SD cards and the issue stayed with the Teensy. I also used the Formatting.ino routine to format bot cards and nothing changed. When I run TwoCards I get "error: sd2.mkdir". Based on all of this I assume that wiring, SdCard formatting and all of the hardware issues are all good.
My modified TwoCards routine:
I just changed:
- CS pin for Sd1 (Sd1 is the SPI Sd Card)
- commented out all SC stuff for Sd2 (Sd2 is the Teensy Sd Card)
- Changed class for sd2 from SdFat to SdFatSdioEx
- changed line sd2.begin(SD2_CS) command to sd2.cardBegin()
I'm using a Teensy 3.6 and a (slightly) modified TwoCards.ino routine from the SdFat library setup for the Teensy SdCard slot and an SPI SdCard. CardInfo for both the cards runs fine, but when I run TwoCards, the Teensy SdCard gives an error on mkdir.
I have no idea how to debug this, so any thoughts are most welcome. SdInfo.ino works for both (by changing USE_SDIO) and TeensySdioDemo.ino works for the Teensy. I also swapped the SD cards and the issue stayed with the Teensy. I also used the Formatting.ino routine to format bot cards and nothing changed. When I run TwoCards I get "error: sd2.mkdir". Based on all of this I assume that wiring, SdCard formatting and all of the hardware issues are all good.
My modified TwoCards routine:
I just changed:
- CS pin for Sd1 (Sd1 is the SPI Sd Card)
- commented out all SC stuff for Sd2 (Sd2 is the Teensy Sd Card)
- Changed class for sd2 from SdFat to SdFatSdioEx
- changed line sd2.begin(SD2_CS) command to sd2.cardBegin()
Code:
/*
* Warning This example requires extra RAM and may crash on Uno.
* Example use of two SD cards.
*/
#include <SPI.h>
#include "SdFat.h"
#include "FreeStack.h"
//#include "sdios.h"
SdFat sd1; // SD card on PCB
const uint8_t SD1_CS = 10; // chip select for sd1
SdFatSdioEX sd2; // Sd card on Teensy
//const uint8_t SD2_CS = 9; // bogus chip select for sd2, not needed for SDIO
const uint8_t BUF_DIM = 100;
uint8_t buf[BUF_DIM];
const uint32_t FILE_SIZE = 1000000;
const uint16_t NWRITE = FILE_SIZE/BUF_DIM;
//------------------------------------------------------------------------------
// print error msg, any SD error codes, and halt.
// store messages in flash
#define errorExit(msg) errorHalt(F(msg))
#define initError(msg) initErrorHalt(F(msg))
//------------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
// Wait for USB Serial
while (!Serial) {
SysCall::yield();
}
Serial.print(F("FreeStack: "));
Serial.println(FreeStack());
// fill buffer with known data
for (size_t i = 0; i < sizeof(buf); i++) {
buf[i] = i;
}
Serial.println(F("type any character to start"));
while (!Serial.available()) {
SysCall::yield();
}
// disable sd2 while initializing sd1
//pinMode(SD2_CS, OUTPUT);
//digitalWrite(SD2_CS, HIGH);
// initialize the first card
if (!sd1.begin(SD1_CS)) {
sd1.initError("sd1:");
}
// create Dir1 on sd1 if it does not exist
if (!sd1.exists("/Dir1")) {
if (!sd1.mkdir("/Dir1")) {
sd1.errorExit("sd1.mkdir");
}
}
// initialize the second card
if (!sd2.cardBegin()) {
sd2.initError("sd2:");
}
// create Dir2 on sd2 if it does not exist
if (!sd2.exists("/Dir2")) {
if (!sd2.mkdir("/Dir2")) {
sd2.errorExit("sd2.mkdir");
}
}
// list root directory on both cards
Serial.println(F("------sd1 root-------"));
sd1.ls();
Serial.println(F("------sd2 root-------"));
sd2.ls();
// make /Dir1 the default directory for sd1
if (!sd1.chdir("/Dir1")) {
sd1.errorExit("sd1.chdir");
}
// make /Dir2 the default directory for sd2
if (!sd2.chdir("/Dir2")) {
sd2.errorExit("sd2.chdir");
}
// list current directory on both cards
Serial.println(F("------sd1 Dir1-------"));
sd1.ls();
Serial.println(F("------sd2 Dir2-------"));
sd2.ls();
Serial.println(F("---------------------"));
// remove rename.bin from /Dir2 directory of sd2
if (sd2.exists("rename.bin")) {
if (!sd2.remove("rename.bin")) {
sd2.errorExit("remove rename.bin");
}
}
// set the current working directory for open() to sd1
sd1.chvol();
// create or open /Dir1/test.bin and truncate it to zero length
SdFile file1;
if (!file1.open("test.bin", O_RDWR | O_CREAT | O_TRUNC)) {
sd1.errorExit("file1");
}
Serial.println(F("Writing test.bin to sd1"));
// write data to /Dir1/test.bin on sd1
for (uint16_t i = 0; i < NWRITE; i++) {
if (file1.write(buf, sizeof(buf)) != sizeof(buf)) {
sd1.errorExit("sd1.write");
}
}
// set the current working directory for open() to sd2
sd2.chvol();
// create or open /Dir2/copy.bin and truncate it to zero length
SdFile file2;
if (!file2.open("copy.bin", O_WRITE | O_CREAT | O_TRUNC)) {
sd2.errorExit("file2");
}
Serial.println(F("Copying test.bin to copy.bin"));
// copy file1 to file2
file1.rewind();
uint32_t t = millis();
while (1) {
int n = file1.read(buf, sizeof(buf));
if (n < 0) {
sd1.errorExit("read1");
}
if (n == 0) {
break;
}
if ((int)file2.write(buf, n) != n) {
sd2.errorExit("write2");
}
}
t = millis() - t;
Serial.print(F("File size: "));
Serial.println(file2.fileSize());
Serial.print(F("Copy time: "));
Serial.print(t);
Serial.println(F(" millis"));
// close test.bin
file1.close();
file2.close();
// list current directory on both cards
Serial.println(F("------sd1 -------"));
sd1.ls("/", LS_R | LS_DATE | LS_SIZE);
Serial.println(F("------sd2 -------"));
sd2.ls("/", LS_R | LS_DATE | LS_SIZE);
Serial.println(F("---------------------"));
Serial.println(F("Renaming copy.bin"));
// rename the copy
if (!sd2.rename("copy.bin", "rename.bin")) {
sd2.errorExit("sd2.rename");
}
// list current directory on both cards
Serial.println(F("------sd1 -------"));
sd1.ls("/", LS_R | LS_DATE | LS_SIZE);
Serial.println(F("------sd2 -------"));
sd2.ls("/", LS_R | LS_DATE | LS_SIZE);
Serial.println(F("---------------------"));
Serial.println(F("Done"));
}
//------------------------------------------------------------------------------
void loop() {}