93 lines
3.2 KiB
C++
93 lines
3.2 KiB
C++
// RP2040 PIO SDIO setup and test.
|
|
/*
|
|
This example requires a SDIO Card socket with the following six lines.
|
|
|
|
CLK - A clock signal sent to the card by the MCU.
|
|
CMD - A bidirectional line for for commands and responses.
|
|
DAT[0:3] - Four bidirectional lines for data transfer.
|
|
|
|
CLK and CMD can be connected to any GPIO pins. DAT[0:3] can be connected
|
|
to any four consecutive GPIO pins in the order DAT0, DAT1, DAT2, DAT3.
|
|
|
|
For testing, I use several RP2040/RP3350 boards.
|
|
The Adafruit Metro RP2040 which has a builtin SDIO socket.
|
|
|
|
https://learn.adafruit.com/adafruit-metro-rp2040
|
|
|
|
I use this SD socket breakout board for other boards.
|
|
|
|
https://learn.adafruit.com/adafruit-microsd-spi-sdio
|
|
|
|
Wires should be short since signals can be as faster than 50 MHz.
|
|
*/
|
|
#define DISABLE_FS_H_WARNING // Disable warning for type File not defined.
|
|
#include "SdFat.h"
|
|
//------------------------------------------------------------------------------
|
|
// Example GPIO definitions I use for debug. Edit for your setup.
|
|
// Run this example as is to print the symbol for your variant.
|
|
//
|
|
#if defined(ARDUINO_ADAFRUIT_METRO_RP2040)
|
|
#define RP_CLK_GPIO 18
|
|
#define RP_CMD_GPIO 19
|
|
#define RP_DAT0_GPIO 20 // DAT1: GPIO21, DAT2: GPIO22, DAT3: GPIO23.
|
|
#elif defined(ARDUINO_RASPBERRY_PI_PICO) || defined(ARDUINO_RASPBERRY_PI_PICO_2)
|
|
#define RP_CLK_GPIO 16
|
|
#define RP_CMD_GPIO 17
|
|
#define RP_DAT0_GPIO 18 // DAT1: GPIO19, DAT2: GPIO20, DAT3: GPIO21.
|
|
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2350_HSTX)
|
|
#define RP_CLK_GPIO 11
|
|
#define RP_CMD_GPIO 10
|
|
#define RP_DAT0_GPIO 22 // DAT1: GPIO23, DAT2: GPIO24, DAT3: GPIO25.
|
|
#endif // defined(ARDUINO_ADAFRUIT_METRO_RP2040))
|
|
|
|
#if defined(RP_CLK_GPIO) && defined(RP_CMD_GPIO) && defined(RP_DAT0_GPIO)
|
|
#define SD_CONFIG SdioConfig(RP_CLK_GPIO, RP_CMD_GPIO, RP_DAT0_GPIO)
|
|
#else // defined(RP_CLK_GPIO) && defined(RP_CMD_GPIO) && defined(RP_DAT0_GPIO)
|
|
#warning "Undefined SD_CONFIG. Run this program for the Variant Symbol."
|
|
#endif // defined(RP_CLK_GPIO) && defined(RP_CMD_GPIO) && defined(RP_DAT0_GPIO)
|
|
//------------------------------------------------------------------------------
|
|
// Class File is not defined by SdFat since the RP2040 system defines it.
|
|
// 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.
|
|
#define SD_FAT_TYPE 3
|
|
|
|
#if SD_FAT_TYPE == 1
|
|
SdFat32 sd;
|
|
File32 file;
|
|
#elif SD_FAT_TYPE == 2
|
|
SdExFat sd;
|
|
ExFile file;
|
|
#elif SD_FAT_TYPE == 3
|
|
SdFs sd;
|
|
FsFile file;
|
|
#else // SD_FAT_TYPE
|
|
#error Invalid SD_FAT_TYPE
|
|
#endif // SD_FAT_TYPE
|
|
|
|
void setup() {
|
|
Serial.begin(9600);
|
|
while (!Serial) {
|
|
yield();
|
|
}
|
|
Serial.println("Type any character to start\n");
|
|
while (!Serial.available()) {
|
|
yield();
|
|
}
|
|
Serial.print("Variant Symbol: ");
|
|
Serial.print("ARDUINO_");
|
|
Serial.println(BOARD_NAME);
|
|
Serial.println();
|
|
#if defined(SD_CONFIG)
|
|
if (!sd.begin(SD_CONFIG)) {
|
|
sd.initErrorHalt(&Serial);
|
|
}
|
|
Serial.println("Card successfully initialized.");
|
|
Serial.println("\nls:");
|
|
sd.ls(LS_A | LS_DATE | LS_SIZE); // Add LS_R for recursive list.
|
|
Serial.println("\nDone! Try the bench example next.");
|
|
#else // #if defined(SD_CONFIG)
|
|
Serial.println("Error: SD_CONFIG undefined for your board.");
|
|
Serial.println("Define RP_CLK_GPIO, RP_CMD_GPIO, and RP_DAT0_GPIO above.");
|
|
#endif
|
|
}
|
|
|
|
void loop() {}
|