W związku z często zgłaszanym problemem polegającym na tym, że czytelnikom nie zawsze udaje się zainicjalizować kartę, szczególnie po restarcie, w lekcji związanej z PetitFS, postanowiłem przygotować małą modyfikację kodu, która pozwala na wyeliminowanie tego problemu. Przy okazji, poprawimy delikatnie inicjalizację SPI, tak jak to miało miejsce w opisanym wyżej artykule dotyczącym FatFS.
#define SCK PB7
#define MOSI PB5
#define CS PB4
DDRB |= (1<<CS)|(1<<MOSI)|(1<<SCK)|(1<<CS);
PORTB |= (1<<CS);
SPCR |= (1<<SPE)|(1<<MSTR);
// .... pozostała część kodu
res = disk_initialize();
|
Taka inicjalizacja SPI oraz jednorazowa próba inicjalizacji karty w PetitFS często prowadzą do błędu "disk init error", który ukazuje się na LCD z przykładowego programu.
#define SCK PB7
#define MISO PB6
#define MOSI PB5
#define CS PB4
DDRB |= (1<<CS)|(1<<MOSI)|(1<<SCK)|(1<<CS);
PORTB |= (1<<CS)|(1<<MISO);
SPCR |= (1<<SPE)|(1<<MSTR);
// .... pozostała część kodu
uint8_t i=255; // zmienna odpowiedzialna za timeout
// dokonujemy wielokrotnej próby inicjalizacji karty
while( i-- && (res = disk_initialize()) );
|
dzięki takiej inicjalizacji program powinien działać poprawnie na na prawdę przeróżnych rodzajach kart pamięci, zarówno tych starszych jak i najnowszych.