SD-Karte lesen

Hans_Wurst

Neues Mitglied
26. Sep. 2007
1
0
0
Sprachen
Hallo,

ich versuche mich gerade durch den von Amel bereit gestellten Framework durch zu kämpfen. Leider hat Atmel diese bereitgestellten Funktionen (wenn überhaupt) nur sehr dürftig beschrieben/erklärt und es ist somit schwierig diese zu nutzen.

Ich versuche lediglich eine SD-Karte zu lesen. Hat damit jemand schon Erfahrung sammeln können?
 
Hallo,

ich habe SD- und MMC auf ATtiny programmiert und dazu die SPI-Schnittstelle verwendet.
Die Funktionen der SD-Karten sind in den SanDisk-Datenblättern recht gut erklärt:

http://www.sandisk.com/OEM/Default.aspx?CatID=1416

Wenn du mehr zur Initialisierung und Verwendung des SPI-Modus von SD-Karten wissen möchtest, kann ich dir noch weitere Links heraussuchen, die mir hilfreich waren.

Grüße,
Peter
 
hallo peter,

wäre sehr interessiert an spi-anbindung für attiny. kannst du mir deinen code schicken?

hg
 
SD-Karten, Framework und EVK1100

Hallo,

wenn Du aus dem Framwork lediglich die Routinen aus der Datei sd_mmc.c verwendest, hats Du einen guten Satz lowlevel-Routinen.
Bei dem evk1100 gibt es irgendwie ein Problem mit der Kombination von SD-Cards und LCD. Beide hängen am gleichen SPI. Allerdings kann die Demo Applikation (Control-Panel) mit beiden arbeiten. Habe leider noch nicht herausgefunden wie.
Wenn jemand einen Hinweis oder weitere Informationen dazu hat, würde ich mich freuen
Peter
 
Hallo Peter,

dieser Thread ist schon ein bisschen älter, aber trotzdem Danke für den Hinweis auf die Lowlevel-Routinen, wir hatten ja das Thema SD/MMC letztens gerade wieder.

Bei dem evk1100 gibt es irgendwie ein Problem mit der Kombination von SD-Cards und LCD. Beide hängen am gleichen SPI. Allerdings kann die Demo Applikation (Control-Panel) mit beiden arbeiten. Habe leider noch nicht herausgefunden wie.
Wenn jemand einen Hinweis oder weitere Informationen dazu hat, würde ich mich freuen
Peter

Bei dem EVK1100 ist neben Display und SD-Card auch das DataFlash am selben SPI angeschlossen. Zuständig ist hier SPI1. Für die Adressierung werden drei der vier Chipselect-Signale genutzt. Ich habe einmal nachgesehen, die Zuordnung sieht folgendermaßen aus:
  • SPI1 CS0 (PA14) -> DataFlash
  • SPI1 CS1 (PA18) -> SD Card
  • SPI1 CS2 (PA19) -> LCD
Vielleicht hilft dir das weiter.

Grüße,
Dirk
 
Hallo Dirk,
das der Thread etwas älter war muss ich wohl übersehen haben :)
Das Problem ist nicht die Hardware. Ich hatte zu Evaluationszwecken eine kleine Applikation geschrieben mit einem simplen Userinterface auf Display und Tastatur. Ebenso habe ich TCPIP mittels uIP (ohne freertos) in diese miniapplikation implementiert
Ausgangspunkt war das macbexample und das display-Beispiel aus dem Framework. Soweit lief alles prima. Dann habe ich ein neues Projekt mit dem SDmmc-Treiber aufgesetzt und ein bischen mit SD-Cards 'rumgespielt' - weiterhin alles super (übrigens, 4GB-Karten werden von den Framework-Routinen nicht erkannt!).
Jetzt wollte ich die kleinen Routinen zum Lesen und Schreiben in das TCP/IP-Display Projekt einbauen und siehe da:
wenn ich zurerst das Display initialisiere und dann den SD-Treiber, funktioniert das Display nicht mehr und das gleiche passiert auch andersherum.
SPI ist für mich relativ neu, und ich hege den Verdacht, dass die verschiedenen Geschwindigkeiten das Problem sind.
Weisst Du etwas darüber ?
Schönes Wochenende noch
Peter
 
Hallo Peter,

...wenn ich zurerst das Display initialisiere und dann den SD-Treiber, funktioniert das Display nicht mehr und das gleiche passiert auch andersherum.
SPI ist für mich relativ neu, und ich hege den Verdacht, dass die verschiedenen Geschwindigkeiten das Problem sind.

das könnte schon sein, aber ich vermute, es hat irgendetwas mit der Adressierung von Display und SD-Card zu tun. Hast du die Möglichkeit, mit einem Oszilloskop zu überprüfen, ob sich beim Chipselect Signal für das Display noch etwas tut, nachdem du zuerst das Display und danach die SD-Card initialisiert hast.

Schönes Wochenende,
Dirk
 
Hallo Dirk,
ich bin erst am Montag wieder im Büro. Hier habe ich keine Hardware.
Mal sehen, was ich herausfinden kann. Danke erst einmal für die Unterstützung.
Peter
 
Hallo Dirk,

das Problem ist gelöst. Die verschiedenen Geschwindigkeiten sind je nach Kanal des SPIs über Vorteiler einstallbar - echt super.

Was mich allerdings enttäuscht ist die Performance :( :

Lesen geht nur mit ca. 220 KByte/Sek.
Schreiben kann man nur mit ca. 100 KByte/Sek.

Mir ist nicht klar, ob es an der SD-Karte liegt, oder ob das EVK1100 damit ein Problem hat. Erwartet hätte ich jedenfalls ca. 1,5 Mbyte Lesegeschwindigkeit ...
Oder kann es am Typ oder der Kapazität der SDCard liegen :confused: ?

Peter
 
Hallo Peter,

ohne Prescaler (SCBR=1) und FDIV=0 erreicht man eine Übertragungsrate von 1,5MB/s bei 12MHz Takt. Die effektive Datenrate wird natürlich kleiner sein. Warum es bei dir nur so um die 220kB/s Lesen bzw. 100kB/s Schreiben sind, weiß ich leider nicht. Hast du denn schonmal eine andere SD-Card ausprobiert? Ich hatte mal für AVR einen Treiber programmiert und da hatte ich das Problem, dass einige SD-Cards nicht oder nicht richtig liefen, andere wiederum ohne Probleme :(.

Beim SPI kann man mehrere Delay-Zeiten für den Wechsel der Chipselect-Signale einstellen, vielleicht hilft das weiter, ich würde aber erst einmal ohne Display testen.

Was hast du denn aktuell für eine Übertragungsrate eingestellt?

Gruß,
Dirk
 
Hallo Dirk,

erst einmal Danke, für Deine geduldige Unterstützung !

Unten findest Du meine Initialisierungsroutinen.
Ich habe sie natürlich mehrfach genau geprüft, kann aber nichts finden. Vielleicht fällt Dir noch etwas auf. Ohne die LCD Initialisierung geht es gar nicht :-(


Danke
Peter


Im Hauptprogramm rufe ich auf:

init_spi_gpio();
init_display(FOSC0);
sdcard_resources_init(FOSC0);

FOSC0 ist 12000000.


Code:
static void init_spi_gpio()
{
	// GPIO map for SPI.
	static const gpio_map_t spi_gpio_map =
	{
	{ AVR32_SPI1_SCK_0_PIN, AVR32_SPI1_SCK_0_FUNCTION }, // SPI Clock.
			{ AVR32_SPI1_MISO_0_PIN, AVR32_SPI1_MISO_0_FUNCTION }, // MISO.
			{ AVR32_SPI1_MOSI_0_PIN, AVR32_SPI1_MOSI_0_FUNCTION }, // MOSI.
			{ AVR32_SPI1_NPCS_1_PIN, AVR32_SPI1_NPCS_1_FUNCTION }, // CS SD
};

gpio_enable_module(spi_gpio_map,sizeof(spi_gpio_map) / sizeof(spi_gpio_map[0]));
}

static void init_display(long hwclk)
{

	static const gpio_map_t spi_gpio_map =
	{
	{ AVR32_SPI1_NPCS_2_PIN, AVR32_SPI1_NPCS_2_FUNCTION } // Display
	};

	gpio_enable_module(spi_gpio_map, sizeof(spi_gpio_map)
			/ sizeof(spi_gpio_map[0]));

	spi_options_t spiOptions =
	{ .reg = DIP204_SPI_NPCS, /*DIP204_SPI_CS, */
	.baudrate = 1000000, .bits = 8, .spck_delay = 0, .trans_delay = 0,
			.stay_act = 1, .spi_mode = 0, .fdiv = 0, .modfdis = 1 };

	spi_initMaster(DIP204_SPI, &spiOptions);
	spi_selectionMode(DIP204_SPI, 0, 0, 0);
	spi_enable(DIP204_SPI);
	spi_setupChipReg(DIP204_SPI, &spiOptions, hwclk);
}

static void sdcard_resources_init(long hwclk)
{
	static const gpio_map_t spi_gpio_map =
	{
	{ AVR32_SPI1_NPCS_1_PIN, AVR32_SPI1_NPCS_1_FUNCTION } // SD Card
	};

	gpio_enable_module(spi_gpio_map, sizeof(spi_gpio_map)
			/ sizeof(spi_gpio_map[0]));

	spi_options_t spiOptions =
	{ .reg = 1, .baudrate = 12000000, .bits = 8, .spck_delay = 0,
			.trans_delay = 0, .stay_act = 1, .spi_mode = 0, .fdiv = 0,
			.modfdis = 1 };

	sd_mmc_init(spiOptions, hwclk);
}
 
Hallo Peter,

... Ohne die LCD Initialisierung geht es gar nicht :-(

ich habe jetzt gerade wenig Zeit, ich schaue mir das heute abend nochmal genauer an.

Nur schonmal kurz vorab: In init_display() initialisierst du spi. Das machst du in der Routine sdcard_resources_init() nicht. Wenn spi nicht in sd_mmc_init() initialisiert wird, funktioniert spi dann nicht, wenn du die Schnittstelle zum Display nicht initialisierst. Also ich schaue mir das später nochmal genauer an.

Gruß,
Dirk
 
Danke Dirk,
dass Du es Dir ansehen wirst, Unten ist ergänzend der Code für sd_mmc_init() aus dem Atmel-Framework.
Peter

Code:
Bool sd_mmc_init(spi_options_t spiOptions, unsigned int pba_hz)
{
  // Setup SPI registers according to spiOptions.
  spi_setupChipReg(SD_MMC_SPI, &spiOptions, pba_hz);

  // Initialize the SD/MMC controller.
  return sd_mmc_internal_init();
}
 
Hallo Dirk,

ich habe mir zwecks Tests noch ein paar andere Karten gekauft. Immerhin scheint es insofern Unterschiede zu geben, als das die SAN-Disk Micro-SDs genauso schnell geschrieben wie gelesen werden können...

Welchen Debugger/Programmer würdest Du für den AVR32 empfehlen und kann man ihn bei Dir kaufen ?

Hattest Du schon Zeit auf den Code zu sehen ?

Bei weiteren Tests konnte ich feststellen, das Karten über 1GB vom Atmel-Framework nicht sicher unterstützt werden. Bei den 2GB-Karten melden die Routinen eine falsche Größe. Offensichtlich kommen sie nicht mit anderen Sektogrößer als 512Bytes klar, obwohl im Code darauf Rücksicht genommen wird. An dieser Stelle scheint er jedenfalls buggy zu sein und ich vertraue nicht darauf, dass die Sektoradressierung bei 2GB-Karten mit den Routinen von Atmel funktioniert. 4GB-Karten werden überhaupt nicht erkannt.

Vielleicht sind diese Informationen für jemanden von Interesse ...

Gruß
Peter
 
Hallo Peter,
Hallo Dirk,

ich habe mir zwecks Tests noch ein paar andere Karten gekauft. Immerhin scheint es insofern Unterschiede zu geben, als das die SAN-Disk Micro-SDs genauso schnell geschrieben wie gelesen werden können...
... ich habe auch die Erfahrung, dass es von Karte zu Karte bzw. Hersteller zu Hersteller Unterschiede gibt. Ich hatte bei meinen (AVR-) Versuchen und einer Kingston 2GByte MicroSD zwar Erfolg, mit einer Sandisk 2GByte MicroSD dann aber wieder Probleme.

Welchen Debugger/Programmer würdest Du für den AVR32 empfehlen und kann man ihn bei Dir kaufen ?
Ich nutze selber den JTAGICE mkII und bin auch zufrieden, wir haben den Debugger/Programmer im Shop und er ist auch auf Lager.

Hattest Du schon Zeit auf den Code zu sehen ?
Jain :rolleyes: Dein Code denke ich, ist soweit in Ordnung. Ich bin mir mit der Initialisierung noch nicht ganz sicher, da schaue ich aber nochmal genauer, muss da in das UC3A-Datenblatt sehen. Man müsste sich einmal auf den Bereich mit der SD-Karte konzentrieren und den Display-Teil weglassen. Bist du sicher, dass du tatsächlich 1,5MByte/s (12MBit/s) mit der SD-Karte überträgst, bzw. ist die SPI-Frequenz so groß?

Wenn du keine Displayausgabe während einer Datenübertragung mit der SD-Karte machst, dürfte es hier auch keine Timingprobleme bezügleich der Chipselect-Signale (Delay-Zeiten) geben. Das heißt, der Display-Bereich könnte hier nur während der Initialisierung der SPI-Schnittstelle die Datenübertagung mit der SD-Karte beeinflussen, also die SPI-Schnittstelle ggf. nicht richtig initialisieren.

Ich versuche am Wochenende ebenfalls die Kommunikation mit der SD-Karte auf dem EVK1100 zu realisieren, das ist für mich nämlich auch interessant, vielleicht finde ich da etwas raus.

Grüße,
Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)