I am trying to run a demo program that came with the Adafruit_SPIFlash library. I get this error:
C:\Users\jjuni.platformio\lib\Adafruit SPIFlash_ID1643\src/Adafruit_SPIFlash.h:35:10: fatal error: SdFat.h: No such file or directory
I already #include <SD.h>. If I look in .platformio\lib\SD_ID161\utility the SdFat.h is right there.
Interestingly, if i right-click on #include “SdFat.h” in Adafruit_SPIFlash.h and select GoTo Definition, I am taken right to the desired file. So, Intellisense can find it.
Note that SdFat is not shown as a dependency of Adafruit_SPIFlash. I have even tried putting LDF in deep+ mode with no success.
I have tried putting a copy of SdFat.h in the lib folder of the project without success. I have also tried listing it in platformio.ini as lib_deps = SdFat with no success.
How can I get the compiler to find this dependent file?
I’ve noticed you’ve installed it in the global repository. Could you uninstall it from there again and add Adafruit SPIFlash into the lib_deps (comma-seperated)
Uninstall the library from PIO Home library manager, put a copy of the entire library in the project’s “lib” folder and reference it in lib_deps in platformio.ini? Is that correct?
#include <Arduino.h>
#include <SPI.h>
#include <SdFat.h>
#include <Adafruit_SPIFlash.h>
#if defined(__SAMD51__) || defined(NRF52840_XXAA)
Adafruit_FlashTransport_QSPI flashTransport(PIN_QSPI_SCK, PIN_QSPI_CS, PIN_QSPI_IO0, PIN_QSPI_IO1, PIN_QSPI_IO2, PIN_QSPI_IO3);
#else
#if (SPI_INTERFACES_COUNT == 1)
Adafruit_FlashTransport_SPI flashTransport(SS, &SPI);
#else
Adafruit_FlashTransport_SPI flashTransport(SS1, &SPI1);
#endif
#endif
Adafruit_SPIFlash flash(&flashTransport);
// file system object from SdFat
FatFileSystem fatfs;
void setup() {
// Initialize serial port and wait for it to open before continuing.
Serial.begin(115200);
while (!Serial) {
delay(100);
}
Serial.println("Adafruit SPI Flash FatFs Format Example");
// Initialize flash library and check its chip ID.
if (!flash.begin()) {
Serial.println("Error, failed to initialize flash chip!");
while(1);
}
Serial.print("Flash chip JEDEC ID: 0x"); Serial.println(flash.getJEDECID(), HEX);
// Wait for user to send OK to continue.
Serial.setTimeout(30000); // Increase timeout to print message less frequently.
do {
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
Serial.println("This sketch will ERASE ALL DATA on the flash chip and format it with a new filesystem!");
Serial.println("Type OK (all caps) and press enter to continue.");
Serial.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
while (!Serial.find("OK"));
// Call fatfs begin and passed flash object to initialize file system
fatfs.begin(&flash);
// Use wipe() for no dot progress indicator.
if ( !fatfs.wipe(&Serial) )
{
Serial.println("Failed to wipe");
while(1) delay(1);
}
// Must reinitialize after wipe.
if (!fatfs.begin(&flash)) {
Serial.println("Error, failed to mount newly formatted filesystem!");
while(1) delay(1);
}
// Done!
Serial.println("Flash chip successfully formatted with new empty filesystem!");
}
void loop() {
// Nothing to be done in the main loop.
delay(100);
}
Is the wrong library. Needs SdFat_ID322 installed. This is really hard to distinguish since they are all using the same headernames, but with the SD_ID161 lib you don’t have the SdFatConfig.h which it later needs.
Adafruit_SPIFlash.h
// implement SdFat Block Driver
#include "SdFat.h"
#include "SdFatConfig.h"
#if ENABLE_EXTENDED_TRANSFER_CLASS == 0
#error ENABLE_EXTENDED_TRANSFER_CLASS must be set to 1 in SdFat SdFatConfig.h
#endif
#if FAT12_SUPPORT == 0
#error FAT12_SUPPORT must be set to 1 in SdFat SdFatConfig.h
#endif
However, just using SdFat isn’t enough because it has hardcoded values in its config for exactly these two macros. We could try build_flags = -DFAT12_SUPPORT=1 -DENABLE_EXTENDED_TRANSFER_CLASS=1 for overriding but that gives redifinition warnings and is thus ugly. So we must download a local copy into lib/, fix the settings and then recompile. I.e.,
Through all this experimentation, I have ended up with two versions of SD library already, SD_ID161 and SD_ID868, both installed using the PIO library manager. Is the ver version you are pointing to, which I will try immediately, the same as the SDFat library available through the PIO Library manager?
Yes, the current github version of the SDFat library is exactly what PIO points to, see PlatformIO Registry, “1.1.0 released 4 months ago Mar 9, 2019 5:09:38 PM”, which matches current version in github.
Yes, both SD_ID161 and SD_ID686 are the wrong libraries (Adafruit and Sparkfun Libraries), since they do not have the "SdFatConfig.h" the Adafruit_SPIFlash.h references (compare PlatformIO Registry). Should be deleted.
This did not yet work, sadly. I get several compiler errors. Don’t I still need the Adafruit SD library to define these types?
src\fatfs_format.cpp:27:3: error: ‘Adafruit_FlashTransport_QSPI’ does not name a type
Adafruit_FlashTransport_QSPI flashTransport(PIN_QSPI_SCK, PIN_QSPI_CS, PIN_QSPI_IO0, PIN_QSPI_IO1, PIN_QSPI_IO2, PIN_QSPI_IO3);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
src\fatfs_format.cpp:36:26: error: ‘flashTransport’ was not declared in this scope
Adafruit_SPIFlash flash(&flashTransport);
^~~~~~~~~~~~~~
src\fatfs_format.cpp:39:1: error: ‘FatFileSystem’ does not name a type
FatFileSystem fatfs;
^~~~~~~~~~~~~
src\fatfs_format.cpp: In function ‘void setup()’:
src\fatfs_format.cpp:51:20: error: no matching function for call to ‘Adafruit_SPIFlash::begin()’
if (!flash.begin()) {
^
In file included from src\fatfs_format.cpp:24:0:
C:\Users\jjuni.platformio\lib\Adafruit SPIFlash_ID1643/Adafruit_SPIFlash.h:98:8: note: candidate: bool Adafruit_SPIFlash::begin(spiflash_type_t)
bool begin(spiflash_type_t t);
^~~~~
C:\Users\jjuni.platformio\lib\Adafruit SPIFlash_ID1643/Adafruit_SPIFlash.h:98:8: note: candidate expects 1 argument, 0 provided
src\fatfs_format.cpp:55:65: error: ‘class Adafruit_SPIFlash’ has no member named ‘getJEDECID’; did you mean ‘GetJEDECID’?
Serial.print(“Flash chip JEDEC ID: 0x”); Serial.println(flash.getJEDECID(), HEX);
^~~~~~~~~~
GetJEDECID
src\fatfs_format.cpp:65:27: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
while (!Serial.find(“OK”));
^
src\fatfs_format.cpp:68:3: error: ‘fatfs’ was not declared in this scope
fatfs.begin(&flash);
^~~~~
src\fatfs_format.cpp:68:3: note: suggested alternative: ‘ffs’
fatfs.begin(&flash);
^~~~~
ffs
Compiling .pio\build\adafruit_feather_m4\liba76\SdFat_ID322\SdCard\SdioTeensy.cpp.o
*** [.pio\build\adafruit_feather_m4\src\fatfs_format.cpp.o] Error 1
Are you sure you have lib_deps = SdFat, Adafruit SPIFlash in your platformio.ini? Adafruit_FlashTransport_SPI is defined within \Adafruit SPIFlash_ID1643\src\qspi\Adafruit_FlashTransport_QSPI.h. Analog to the FatFileSystem.