SD kaart op DUE

Al zeker super dat ik een Nederlandstalig gedeelte hier tegen kom.
Even zeer kort voorstellen, ben Peter uit Belgïe en programmeer al sinds 1982 in basic…
Sinds vorige maand ben ik overgestapt naar C om met de DUE te werken…
Elke lijn code doet wel wat pijn maar uiteindelijk raak ik er wel :stuck_out_tongue:
Wie werkt er hier nog met de DUE?
Wie kan nog volgen aan al die verschillende libraries voor de SD kaart?

Ik heb het volgende probleem, ik gebruik de SD library van Adafruit op een win7 pro PC

De aparte voorbeelden werken perfect.
maar bij “CardInfo” gebruiken ze “card.init(SPI_HALF_SPEED, chipSelect)” om de SD routine te initialiseren.
bij het “ReadWrite” voorbeeld werken ze met “SD.begin(chipSelect)” om te initialiseren.
als ik bij de “CardInfo” routines bijschrijf (copy/paste) van het “ReadWrite” programma dan werken die lijnen niet
omgekeerd als ik bij het “ReadWrite” routines bijschrijf van het “CardInfo” programma dan werken deze lijnen weer niet…
De fout zit zeker in de initialisatie, maar ik zie het probleem niet, vandaar ik hier even kom polsen :slight_smile:

Het aangepaste ReadWrite programma , letop ik gebruik pin 2 als CS en 115200 Baud!

/*
  SD card read/write
 
 This example shows how to read and write data to and from an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** UNO:  MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed)
  and pin #10 (SS) must be an output
 ** Mega:  MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed)
  and pin #52 (SS) must be an output
 ** Leonardo: Connect to hardware SPI via the ICSP header

 
 created   Nov 2010  by David A. Mellis
 modified 9 Apr 2012  by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
 
#include <SPI.h>
#include <SD.h>

Sd2Card card;
SdVolume volume;
SdFile root;

File myFile;

// change this to match your SD shield or module;
//     Arduino Ethernet shield: pin 4
//     Adafruit SD shields and modules: pin 10
//     Sparkfun SD shield: pin 8
const int chipSelect = 2;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(115200);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(SS, OUTPUT);
   
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  
  
  
    // print the type of card
  Serial.print("\nCard 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");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
  
}

void loop()
{
	// nothing happens after setup
}

Deel II ivm limiet van 9500 char per bericht :~

Hier het aangepaste CardInfo programma met CS=2 en 115000 Baud

/*
  SD card test 
   
 This example shows how use the utility libraries on which the'
 SD library is based in order to get info about your SD card.
 Very useful for testing a card when you're not sure whether its working or not.
 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** UNO:  MOSI - pin 11, MISO - pin 12, CLK - pin 13, CS - pin 4 (CS pin can be changed)
  and pin #10 (SS) must be an output
 ** Mega:  MOSI - pin 51, MISO - pin 50, CLK - pin 52, CS - pin 4 (CS pin can be changed)
  and pin #52 (SS) must be an output
 ** Leonardo: Connect to hardware SPI via the ICSP header
 		Pin 4 used here for consistency with other Arduino examples

 
 created  28 Mar 2011  by Limor Fried 
 modified 9 Apr 2012   by Tom Igoe
 */
 // include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 2;    
File myFile;


void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(115200);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("\nInitializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(SS, OUTPUT);


  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  while (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card is inserted?");
    Serial.println("* Is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
  } 
  
  // print the type of card
  Serial.print("\nCard 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");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    return;
  }


  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
  
    myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
	// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
    	Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
  	// if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}


void loop(void) {
  
  
}

Hoi Peter, en welkom op dit forum.

Wij kennen elkaar uit het verleden van het werk dat wij beiden doen of hebben gedaan (me == Swiss importeur), leuk je hier te zien. Ik ben nog met de Uno en aanverwanten aan het rommelen, en ben nog lang niet aan de Due en SD kaarten toe.

Maar ik heb het vermoeden dat je voorbeelden gebruik maken van verschillende libraries, heb je dat al eens nader bekeken ? Je geeft zelf al aan dat de een SPI aanspreekt voor initialisatie, en de ander SD, en volgens mij betekent dat dus twee verschillende libraries, met ook zeer waarschijnlijk 2 heel verschillende manieren van aanspreken.

Swiss ja hoor, zalige tijd: MRF1421C+TL368+(2X1N415)+2N6308=JFS32R. :)

Ondertussen ben ik een heel stuk verder geraakt met dit probleem hier. De librarie is voor beide instructies gelijk. Het verschil zit hem in de achterliggende code van de librarie van Ada. De CardInfo werkt op een 'Lower Level' dan alle andere programma's Nu wat blijkt, je mag gewoon die initialisatie na elkaar gebruiken. Dus eerst die van de info, dan info uithalen, dan weer init voor de rest. Was er deze nacht om 2u achter gekomen maar had geen zin meer om dit nog te posten.

Nu moet ik nog een probleem met de snelheid vanuit de GPS oplossen. VTG en RMC komen binnen, kan ze tonen maar om een of andere reden krijg ik ze zelden via de lib eruit. De DUE krijgt het wel heel erg zwaar met mijn programma.... 2 x RS232 komt binnen aan 115200 en moet verwerkt worden 1 X GPS aan 115200 1 X PC verbinding aan 115200 1 X TFT display 2 X thermometer I2C 1 X XYZ accelleros I2C 12X analoge input 12 bit 2 X CANbus op 250K met ongeveer 200 waardes die ik moet cappen. En nog wat digitale IO.... Och ja en een SD kaart waar elke seconde 876 bytes op weg geschreven moeten worden...

Denk dat hij heeeeel erg gaat zweten 8)