xmega. Programmabbruch beim SD/MMC Kartenzugriff

Gast #1710210
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
Gast #1710233
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
Gast #1710812
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
Angehängte Dateien:
Gast #1712254
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
Angehängte Dateien:
Gast #1713775
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
Gast #1717079
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
Moderator Persönliche Seite #1718421
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren