AtMega2560 SPI SD-Karten

OP #6465464
Lesenswert?

Hallo Zusammen!

ich habe folgendes Problem, ich möchte mit Hilfe der AVR FAT32 
Bibliothek mit dem AtMega2560 über SPI auf eine SD-Karte 
schreiben/Lesen.

Link:
https://www.mikrocontroller.net/articles/AVR_FAT32

Ich habe diese Programm bereits mit dem AtMega328p erfolgreich getestet. 
Ich konnte auf die SD-Karte schreiben und Lesen.

Daher habe ich mir das Programm genommen und den Hardwareabhängigen Teil 
auf den AtMega2560 angepasst.

static uint8_t   mmc_enable(void);
static void   mmc_disable(void);
static uint8_t   mmc_wait_ready (void);
static uint8_t   mmc_send_cmd (  uint8_t cmd,  uint32_t arg);

// beginn -> hardware abhaengiger teil !
#define MMC_CS_LOW     PORTB &= ~(1<<DDB0)  // Set pin B2 to 0
#define MMC_CS_HIGH    PORTB |= (1<<DDB0)  // Set pin B2 to 1

static void       spi_init(void);
static void       spi_maxSpeed(void);
static void       spi_write_byte(uint8_t byte);
static uint8_t       spi_read_byte(void);


//********************************************************************** 
****
static void spi_init(void){

  // port configuration der mmc/sd/sdhc karte
  DDRB &=~(1<<DDB3);        // miso auf input
  DDRB |= (1<<DDB1);        // clock auf output
  DDRB |= (1<<DDB2);        // mosi auf output
  DDRB |= (1<<DDB0);        // chip select auf output

// hardware spi: bus clock = idle low, spi clock / 128 , spi master mode
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);

  PORTB |= (1<<DDB0);       // chip selet auf high, karte anwaehlen
}



#if (MMC_MAX_SPEED==TRUE)
//********************************************************************** 
****
static void spi_maxSpeed(){

  //SPI Bus auf max Geschwindigkeit
  SPCR &= ~((1<<SPR0) | (1<<SPR1));
  SPSR |= (1<<SPI2X);
}
#endif

// 
************************************************************************ 
*****
static void spi_write_byte(uint8_t byte){


  #if (MMC_SOFT_SPI==TRUE)
    uint8_t a;
  #endif

  // mmc/sd in hardware spi
  #if (MMC_SOFT_SPI==FALSE)
    SPDR = byte;                //Sendet ein Byte
          loop_until_bit_is_set(SPSR,SPIF);
  #endif

}


// 
************************************************************************ 
*****
static uint8_t spi_read_byte(void){

  //Datenregister auf 0 setzen
  SPDR = 0xFF;

  //Warten dass Daten Empfangen werden
  while (!(SPSR & (1<<SPIF)));
  //Ausgelesene Daten
  return SPDR;

}



// ende <- hardware abhaengiger teil !


Mit dem AtMega2560 kann ich aber trotz Anpassung des Hardwareabhängigen 
Teils nicht auf die SD-Karte schreiben/ Lesen.

Hat jmd. eine Ahnung woran das liegen kann ?
#6465471
Lesenswert?

Wie sieht deine Hardware aus? Da gibt es diverse, kleine Stolperfallen. 
Ist es der GLEICHE SD-Card Halter mit der GLEICHEN Hardware oder was 
anderes? Ein beliebter Fehler ist das Fehlen einen Pull-Up Widerstands 
an MISO, denn das ist vor der Initialisierung seitens der SD-Karte ein 
Open Drain Ausgang. 2k2 oder so sollten OK sein.

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