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