Last active
September 21, 2017 19:55
-
-
Save CelliesProjects/82e7d9cc96e3182813a2bb1799b8b90f to your computer and use it in GitHub Desktop.
QuickStartSD from Espressif adapted to HW SPI - ( for 320x240 ebay/aliexpress breakout with SD, TFT and touch )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Quick hardware test for SPI card access. | |
// | |
#include <SPI.h> | |
#include "SdFat.h" | |
#define _dc 27 // Goes to TFT DC | |
#define _sclk 25 // Goes to TFT SCK/CLK | |
#define _mosi 32 // Goes to TFT MOSI | |
#define _miso 14 // Goes to TFT MISO | |
#define _cs 4 // Goes to TFT CS | |
#define SD_CS 0 // Goes to SD CS | |
// | |
// Set DISABLE_CHIP_SELECT to disable a second SPI device. | |
// For example, with the Ethernet shield, set DISABLE_CHIP_SELECT | |
// to 10 to disable the Ethernet controller. | |
const int8_t DISABLE_CHIP_SELECT = -1; | |
// | |
// Test with reduced SPI speed for breadboards. SD_SCK_MHZ(4) will select | |
// the highest speed supported by the board that is not over 4 MHz. | |
// Change SPI_SPEED to SD_SCK_MHZ(50) for best performance. | |
#define SPI_SPEED SD_SCK_MHZ(2) | |
//------------------------------------------------------------------------------ | |
// File system object. | |
SdFat sd; | |
// Serial streams | |
ArduinoOutStream cout(Serial); | |
// input buffer for line | |
char cinBuf[40]; | |
ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); | |
// SD card chip select | |
int chipSelect; | |
void cardOrSpeed() { | |
cout << F("Try another SD card or reduce the SPI bus speed.\n"); | |
cout << F("Edit SPI_SPEED in this program to change it.\n"); | |
} | |
void reformatMsg() { | |
cout << F("Try reformatting the card. For best results use\n"); | |
cout << F("the SdFormatter program in SdFat/examples or download\n"); | |
cout << F("and use SDFormatter from www.sdcard.org/downloads.\n"); | |
} | |
void setup() { | |
SPI.begin( _sclk, _miso, _mosi ); | |
SPI.setFrequency( 40000000 ); | |
Serial.begin(115200); | |
// Wait for USB Serial | |
while (!Serial) { | |
SysCall::yield(); | |
} | |
cout << F("\nSPI pins:\n"); | |
cout << F("MISO: ") << int(_miso) << endl; | |
cout << F("MOSI: ") << int(_mosi) << endl; | |
cout << F("SCK: ") << int(_sclk) << endl; | |
cout << F("SS: ") << int(SD_CS) << endl; | |
if (DISABLE_CHIP_SELECT < 0) { | |
cout << F( | |
"\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" | |
"a second SPI device. For example, with the Ethernet\n" | |
"shield, DISABLE_CHIP_SELECT should be set to 10\n" | |
"to disable the Ethernet controller.\n"); | |
} | |
cout << F( | |
"\nSD chip select is the key hardware option.\n" | |
"Common values are:\n" | |
"Arduino Ethernet shield, pin 4\n" | |
"Sparkfun SD shield, pin 8\n" | |
"Adafruit SD shields and modules, pin 10\n"); | |
} | |
bool firstTry = true; | |
void loop() { | |
// Read any existing Serial data. | |
do { | |
delay(10); | |
} while (Serial.available() && Serial.read() >= 0); | |
if (!firstTry) { | |
cout << F("\nRestarting\n"); | |
} | |
firstTry = false; | |
cout << F("\nEnter the chip select pin number: "); | |
while (!Serial.available()) { | |
SysCall::yield(); | |
} | |
cin.readline(); | |
if (cin >> chipSelect) { | |
cout << chipSelect << endl; | |
} else { | |
cout << F("\nInvalid pin number\n"); | |
return; | |
} | |
if (DISABLE_CHIP_SELECT < 0) { | |
cout << F( | |
"\nAssuming the SD is the only SPI device.\n" | |
"Edit DISABLE_CHIP_SELECT to disable another device.\n"); | |
} else { | |
cout << F("\nDisabling SPI device on pin "); | |
cout << int(DISABLE_CHIP_SELECT) << endl; | |
pinMode(DISABLE_CHIP_SELECT, OUTPUT); | |
digitalWrite(DISABLE_CHIP_SELECT, HIGH); | |
} | |
if (!sd.begin(chipSelect, SPI_SPEED)) { | |
if (sd.card()->errorCode()) { | |
cout << F( | |
"\nSD initialization failed.\n" | |
"Do not reformat the card!\n" | |
"Is the card correctly inserted?\n" | |
"Is chipSelect set to the correct value?\n" | |
"Does another SPI device need to be disabled?\n" | |
"Is there a wiring/soldering problem?\n"); | |
cout << F("\nerrorCode: ") << hex << showbase; | |
cout << int(sd.card()->errorCode()); | |
cout << F(", errorData: ") << int(sd.card()->errorData()); | |
cout << dec << noshowbase << endl; | |
return; | |
} | |
cout << F("\nCard successfully initialized.\n"); | |
if (sd.vol()->fatType() == 0) { | |
cout << F("Can't find a valid FAT16/FAT32 partition.\n"); | |
reformatMsg(); | |
return; | |
} | |
if (!sd.vwd()->isOpen()) { | |
cout << F("Can't open root directory.\n"); | |
reformatMsg(); | |
return; | |
} | |
cout << F("Can't determine error type\n"); | |
return; | |
} | |
cout << F("\nCard successfully initialized.\n"); | |
cout << endl; | |
uint32_t size = sd.card()->cardSize(); | |
if (size == 0) { | |
cout << F("Can't determine the card size.\n"); | |
cardOrSpeed(); | |
return; | |
} | |
uint32_t sizeMB = 0.000512 * size + 0.5; | |
cout << F("Card size: ") << sizeMB; | |
cout << F(" MB (MB = 1,000,000 bytes)\n"); | |
cout << endl; | |
cout << F("Volume is FAT") << int(sd.vol()->fatType()); | |
cout << F(", Cluster size (bytes): ") << 512L * sd.vol()->blocksPerCluster(); | |
cout << endl << endl; | |
cout << F("Files found (date time size name):\n"); | |
sd.ls(LS_R | LS_DATE | LS_SIZE); | |
if ((sizeMB > 1100 && sd.vol()->blocksPerCluster() < 64) | |
|| (sizeMB < 2200 && sd.vol()->fatType() == 32)) { | |
cout << F("\nThis card should be reformatted for best performance.\n"); | |
cout << F("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); | |
cout << F("Only cards larger than 2 GB should be formatted FAT32.\n"); | |
reformatMsg(); | |
return; | |
} | |
// Read any extra Serial data. | |
do { | |
delay(10); | |
} while (Serial.available() && Serial.read() >= 0); | |
cout << F("\nSuccess! Type any character to restart.\n"); | |
while (!Serial.available()) { | |
SysCall::yield(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment