Houston we have a problem!
Sto cercando di utilizzare questa SD card per salvarmi dei dati.
Mi sono guardato i vari tutorial e sta funzionando tutto correttamente.
Dov’è il problema?
Mi sono incaponito sul voler rendere il sistema resistente alla rimozione e al reinserimento della card.
Ok che se viene tolta brutalmente la scheda durante la scrittura rischio di compromettere il file system ecc. ecc. ecc.
Ho preso alcune precauzioni visive per permettere di scegliere il momento giusto
Il problema è che non riesco a reinizializzare il tutto per farlo ri-funzionare una volta reinserita la card.
Il problema sta nel “volume”, che non lo riesco più a far funzionare.
Descrivo il problema.
Partiamo dal codice di esempio clasico dell’IDE “CardInfo”
Da me il CS è il 10, è l’unica modifica rispetto al codice standard.
#include <SPI.h>
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 10; //4;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("\nInitializing SD card...");
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card inserted?");
Serial.println("* is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
while (1);
} else {
Serial.println("Wiring is correct and a card is present.");
}
Serial.println();
Serial.print("Card type: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
while (1);
}
Serial.print("Clusters: ");
Serial.println(volume.clusterCount());
Serial.print("Blocks x Cluster: ");
Serial.println(volume.blocksPerCluster());
Serial.print("Total Blocks: ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
uint32_t volumesize;
Serial.print("Volume type is: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize /= 2; // SD card blocks are always 512 bytes (2 blocks are 1KB)
Serial.print("Volume size (Kb): ");
Serial.println(volumesize);
Serial.print("Volume size (Mb): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Gb): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
}
Funziona tutto.
Se tolgo la card e rilancio lo sketch, con nuova pubblicazione, tanto per indicare una modalità che dovrebbe far partire tutto ben pulito.
Ottengo, giustamente, il seguente messaggio di errore sulla seriale:
Initializing SD card...initialization failed. Things to check:
* is a card inserted?
* is your wiring correct?
* did you change the chipSelect pin to match your shield or module?
Tutto OK,
come previsto è fallita la
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Se ora reinserisco la card e ripubblico tutto e riparto, mi aspetto torni tutto a funzionare e invece ottengo:
Initializing SD card...Wiring is correct and a card is present.
Card type: SD2
Could not find FAT16/FAT32 partition.
Make sure you've formatted the card
La:
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
è andata a buon fine, quella che è fallita è la:
if (!volume.init(card)) {
Per far rifunzionare tutto di nuovo devo staccare l’USB.
Se ripubblico il codice o faccio semplicemente il reset della scheda, continua ad uscire questo errore.
Se invece stacco la USB (non essendoci altra alimentazione si spegne tutto) e chiudo il monitor seriale.
Quando la riattacco riparte tutto correttamente.
Per ripartire puliti serve spegnere fisicametne tutto.
Ora, leggendomi mezzo internet non ho mai trovato indicazioni sul fatto che la libreria SD o anche la scheda lettore SD abbiano qualche sorta di cache che richiede uno spegnimento totale.
Questo problema pregiudica ogni mio tentativo software di riprendere dalla rimozione della scheda e quindi mi fa da show stopper.
La scheda che ho postato non può essere il problema, perchè ho provato a scollegarla completamente e a ricollegarla e il problema persiste. E’ solo disalimentando Arduino (nel caso specifico un Nano) che si risolve e si esce dalla situazione sballata.
Qualcuno ha qualche idea?
Probabilmente c’è un qualche valore che viene settato e che non riesco a resettare perchè non sono riuscito a riconoscere le funzioni per farlo.
[pre[/pre]