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 ?