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


von Dome (Gast)


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

von GG (Gast)


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

von Dome (Gast)


Angehängte Dateien:

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

von Dome (Gast)


Lesenswert?

Upps..
Sorry, Quellcode wurde doppelt angehängt.

von GG (Gast)


Angehängte Dateien:

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

von Dome (Gast)


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

von Dome (Gast)


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

von Martin T. (mthomas) (Moderator) Benutzerseite


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"?

von Dome (Gast)


Lesenswert?

Martin Thomas schrieb:
> War genau bedeutet "beim Programmieren"?

ich meine das Flashen vom Programm auf xmega

von Wolf (Gast)


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

von Wolf (Gast)


Lesenswert?

Hallo noch mal

welche SD Karten verwendet Ihr?

SD oder SDHC


Gruß Wolf

von Martin T. (mthomas) (Moderator) Benutzerseite


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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?


von Ethernet-fan (Gast)


Lesenswert?

Finde deinen Code sehr schlecht; Schieb ... Schieb .... Schieb ...

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

von milan (Gast)


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

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
Noch kein Account? Hier anmelden.