Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega8 и SD карта
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Alex31
Здравствуйте.
Имеется проблема:
Atmega8L, к ней подключена SD карточка (Uпит 3,3В).
Инициализация проходит успешно, сектора читаются, но после записи сектора приходит Data Response 0хF2, хотя по описанию такого быть не может в принципе. И после этого карточка перестает читаться и писаться. Если затем сделать инициализацию, то она начинает читаться и тот сектор оказывается записанным правильно. Частоту SPI менял, не помогает. sad.gif
В чем может быть проблема?
Исходиники библиотек работы с катрой брал где-то здесь на форуме, проверял с двумя карточками SD TOSHIBA 16Mb и Kingston 1Gb.

п/п записи сектора:
Код
unsigned char MMC_WriteSector(unsigned long int sector,unsigned char *buffer)
{
char r1;
int i;

PORTC.2=0;//Активировать карту

r1=MMC_Command( CMD24 , sector<<9);//Установить номер сектора
if(r1!=0)//Если комманда не выполнена сообщить код ошибки
{
PORTC.2=1;//Освобождаем карту
return r1;
}


// пЕРЕДАТЬ ПУСТОЙ БАЙТ
spi(0xFF);
spi(0xFF);
//Передать стартовый байт
spi(0xFE);
//Записываем в карту данные
for(i=0; i<512; i++)
{
spi(buffer[i]);
}
//Читаем 2 байта CRC  
spi(0xFF);
spi(0xFF);

//Читаем ответ карты
r1 = spi(0xFF);            //---- вот здесь приходит F2 вместо 05

/*if( (r1&MMC_DR_MASK)!= MMC_DR_ACCEPT)
{
PORTC.2=1;//Освобождаем карту
return r1;
} */

// wait until card not busy
while(!spi(0xFF));
PORTC.2=1;//Освобождаем карту
spi(0xFF);

return r1;//0;
}
AHTOXA
Вроде всё нормально.

Попробуй вместо
Цитата(Alex31 @ Feb 14 2008, 11:50) *
Код
    // пЕРЕДАТЬ ПУСТОЙ БАЙТ
    spi(0xFF);
    spi(0xFF);


что-нибудь типа
Код
    spi(0xFF);
    do
        r1 = spi(0xFF);
    while (r1 != 0xFF);


Ну и r1 я бы всё же объявил как unsigned char, для определённости.
MiklPolikov
Мучался с похожей проблемой. Нерегулярно и в разных местах кода
происходили ошибки при чтении/записи блока.
Оказалось нужно перед началом передачи (или чтения) проверять готовность карты

while(1)
{
if(SPI_TRANSMIT(0xFF)==0xff) //передаём 0xFF до тех пор , пока карта не начнёт отвечать 0xFF
break;
}

И после этого можно слать CMD24
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.