реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Atmega8 и SD карта, не пишется сектор
Alex31
сообщение Feb 14 2008, 06:50
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 19-10-06
Пользователь №: 21 463



Здравствуйте.
Имеется проблема:
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;
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 14 2008, 18:38
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вроде всё нормально.

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


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


Ну и r1 я бы всё же объявил как unsigned char, для определённости.

Сообщение отредактировал AHTOXA - Feb 14 2008, 18:40


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Mar 6 2012, 06:17
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



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

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

И после этого можно слать CMD24


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 12:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016