www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik xmega. Programmabbruch beim SD/MMC Kartenzugriff


Autor: Dome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: GG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dome (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps..
Sorry, Quellcode wurde doppelt angehängt.

Autor: GG (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"?

Autor: Dome (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Thomas schrieb:
> War genau bedeutet "beim Programmieren"?

ich meine das Flashen vom Programm auf xmega

Autor: Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo noch mal

welche SD Karten verwendet Ihr?

SD oder SDHC


Gruß Wolf

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...
> 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Ethernet-fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Finde deinen Code sehr schlecht; Schieb ... Schieb .... Schieb ...

Warum sind da nicht die Device-Driver von atmel enthalten?

Autor: milan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.