Forum: Mikrocontroller und Digitale Elektronik AtMega2560 SPI SD-Karten


von Master T. (master_t)


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 ?

von Falk B. (falk)


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.

von Andras H. (kyrk)


Lesenswert?

Gibt es am SPI noch andere Slaves? Wenn ja dann dürfen die leider bis 
die SD Karte nicht in SPI mode ist nicht angesprochen werden.

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.