Hallo, ich habe noch nicht allzuviel Erfahrung mit Mikrocontroller, deswegen möchte hier um einen Rat bitten. Beim Testen Ulrich Radig MMC Bibliothek mit SPI-Treiber von Atmel auf einem ATxmega128A1 Board von Alvidi.de bin ich auf einen Effekt gestoßen. Nach erfolgreicher USART und MMC Initialisierung, beim ersten Zugriff auf SD Karte bricht das Programm ab, bzw. starten neu. Alle Initialisierungen bleiben dabei erhalten. Habe leider keinen Debugger, benutze einen AVRISP MKII Programmer. Durch Textausgaben wurde die kritische Stelle gefunden. Beim Schreiben in SPID.DATA Register bricht das Programm ab. Das merkwürdige für mich, das der Register während Initialisierung, mehrere Male ohne Probleme beschrieben wird. Beim zweiten Durchlauf des Programms läuft alles auch ganz normal. int main( void ) { uint8_t i= 0; uint8_t w[512]; rprintfInit(usart_E0_putc); rprintfProgStrM("Programmanfang\r\n"); //******************************************************* //System Clock Konfiguration //******************************************************* * * * //Jetzt läuft das System auf 32 MHz //########################################################## //********************************************************** // usart_init(uint8_t usart,uint8_t bsel,uint16_t bscale, uint8_t clk2x, bool interrupt) //********************************************************** cli(); usart_init(USART_E0,1047,-6,0, true); // 115200@32MHz /* Enable PMIC interrupt level low. */ PMIC.CTRL |= PMIC_LOLVLEX_bm; /* Enable global interrupts. */ sei(); _delay_ms(1000); usart_E0_puts("USART Initialisation..........OK!\n\r"); //########################################################## //********************************************************** //MMC Init //********************************************************** cli(); i=mmc_init (); _delay_ms(1000); //i=mmc_init (); // Initialisation of MicroSD card slot // - return 0 if the card was detected // - return 1 if the card slot is empty sei(); usart_E0_puts("for spid.data\r\n"); // an der Stelle springt das Programm auf den Anfang von main() SPID.DATA = 0; // durch direkten Zugriff auf den Register oder durch Zugriff auf den Register aus den read/write Funktionen kommt es zum Restart //mmc_read_sector(1504, (uint8_t*)(&w)); //mmc_write_sector(777, (uint8_t*)(&w)); usart_E0_puts("nach spid.data\r\n"); mmc_write_sector(777, (uint8_t*)(&w)); usart_E0_puts("Programmende\n\r"); while(1){asm volatile("nop"); } } Ausgabe sieht dann so aus: USART Initialisation..........OK! for spid.data Programmstart USART Initialisation..........OK! for spid.data nach spid.data Programmende Wäre jedem Rat dankbar. Gruß Dome
Servus, Dome schrieb: > Beim Schreiben in SPID.DATA Register bricht das Programm ab. > > Das merkwürdige für mich, das der Register während Initialisierung, > > mehrere Male ohne Probleme beschrieben wird. Beim zweiten Durchlauf des > > Programms läuft alles auch ganz normal. ohne den Quellcode zu kennen, vermute ich ein SPI Geschwindigkeitsproblem. Schau dir mal deine SPI-Initialisierung an. Ändere mal SPIX.CTRL = SPI_PRESCALER_DIV4_gc... zu SPI_PRESCALER_DIV16_gc oder noch höher. Ein Problem könnte auch SPI_MODE_xx_gc sein. Bei mir funktionierte es mit SPI_MODE_3_gc oder SPI_MODE_0_gc. Gruß GG
Hallo,
GG schrieb:
>Schau dir mal deine SPI-Initialisierung an.
Habe verschiedene SPI-Einstellungen ausprobiert, hat leider nichts
gebracht.
Anbei Quellcode.
Falls jemand den Code ausprobieren möchte, USART auf dem PORT E, SDC
PORT D.
Gruß
Dome
Upps.. Sorry, Quellcode wurde doppelt angehängt.
Servus, ich habe die Karte ordentlich auslesen können. verwende mal den SPI-Code in der mmc.c //###################################################################### ###### //Routine zum Empfangen eines Bytes von der MMC-Karte unsigned char mmc_read_byte (void) //###################################################################### ###### { unsigned char Byte = 0; SPID.DATA = 0xff; while(!(SPID.STATUS & (1<<SPI_IF_bp))){}; Byte = SPID.DATA; return (Byte); } //###################################################################### ###### //Routine zum Senden eines Bytes zur MMC-Karte void mmc_write_byte (unsigned char Byte) //###################################################################### ###### { SPID.DATA = Byte; //Sendet ein Byte while(!(SPID.STATUS & (1<<SPI_IF_bp))) //Wartet { } } Sollte es nicht funktionieren, Code liegt bei! Gruß GG
Hallo, Der Fehler schein gefunden zu sein. Die Zeile fehlte mir bei MMC Initialisierung. SPID.INTCTRL = SPI_INTLVL_OFF_gc; GG, vielen Dank. Gruß Dome
Hallo, es war doch nicht die Lösung des Problems. Beim ausgeschaltetem Interrupt, das Programm startet zwar nicht neu, aber Schreiben/Lesen von SD Karte geht nur beim Programmieren. Hat jemand eine Idee? Gruß Dome
Dome schrieb: > Hallo, > > es war doch nicht die Lösung des Problems. > Beim ausgeschaltetem Interrupt, das Programm startet zwar nicht neu, > aber Schreiben/Lesen von SD Karte geht nur beim Programmieren. War genau bedeutet "beim Programmieren"?
Martin Thomas schrieb:
> War genau bedeutet "beim Programmieren"?
ich meine das Flashen vom Programm auf xmega
Hallo an alle, habe die Radig_card.zip mal getestet. funktioniert bei mir leider nicht. :-( ** Keine MMC/SD Karte gefunden!! ** wie kann ich das Makefile auf einen 128A3 ändern? wie groß darf die SD karte sein ( meine ist von Transcend und 4GB groß ) Gruß Wolf
Hallo noch mal welche SD Karten verwendet Ihr? SD oder SDHC Gruß Wolf
>... > meine ist von Transcend und 4GB groß >... SDHC? Wenn ja, nachsehen, ob der Code für SDHC geeeignet ist. Ansonsten: http://elm-chan.org/fsw/ff/00index_e.html, FatFs sample projects. Zwar ebenfalls nichts fertig vorgekautes für Xmega aber die notwendige Anpassungen auf Basis des Beispiels für AVR sollten nicht allzu kompliziert sein. SDHC-Support ist enthalten und funktioniert.
Du kannst Dir auch mal das hier ansehen: http://viewvc.coremelt.net/viewvc/atxmega128a1_board/trunk/sources/proto_tests/006_sdcard/ Komplett herunterladen mit http://viewvc.coremelt.net/viewvc/atxmega128a1_board/trunk/sources/proto_tests/006_sdcard/?view=tar Gruss, Michael
Finde deinen Code sehr schlecht; Schieb ... Schieb .... Schieb ... Warum sind da nicht die Device-Driver von atmel enthalten?
Michael G. schrieb: > Du kannst Dir auch mal das hier ansehen: > http://viewvc.coremelt.net/viewvc/atxmega128a1_boa... > > Komplett herunterladen mit > http://viewvc.coremelt.net/viewvc/atxmega128a1_boa... > > Gruss, > Michael Hallo Michael ich habe den Code ausprobiert aber funktioniert nicht. kannst du mir bitte sagen wie du die Karte angeschlossen hast?? Danke und Gruss Milan
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.