Четверг, 01.10.2020, 03:29
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Форум » Микроконтроллеры » Вопросы по статьям » ATmega8 + SD с поддержкой FAT
ATmega8 + SD с поддержкой FAT
HiSERДата: Суббота, 26.11.2011, 17:22 | Сообщение # 31
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Замени в _sd.c
Code

byte sd_init() {
byte i,n;
DDRB|=0x2c;
SPCR=0x52;
SPSR=0;
CS=1;
delay_ms(10);
for (i=0;i<10;i++) sd_write(0xff);
CS=0;
delay_ms(10);
sd_write(0x40);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0x95);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
if (i!=1) return 1;
n=0;
do{
sd_write(0x41);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
n++;
delay_ms(10);
}while(i!=0&&n!=0);
if (n==0) return 4;
if (i!=0) return 2;
SPCR=0x50;
SPSR=0;
sd_write(0x50);
sd_write(0);sd_write(0);sd_write(2);sd_write(0);
sd_write(0xff);
sd_write(0xff);
sd_write(0xff);
return 0;
}
 
Dominik21Дата: Суббота, 26.11.2011, 17:32 | Сообщение # 32
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Отредактировал библиотеку, а толку нет. Объясните пожалуйста, в чем моя ошибка - в отсутствии загрузочной записи или в чем?

Сообщение отредактировал Dominik21 - Суббота, 26.11.2011, 17:39
 
HiSERДата: Воскресенье, 27.11.2011, 02:10 | Сообщение # 33
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
дело в карточке, инициализация не проходит.
Code

do{
sd_write(0x41);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
n++;
delay_ms(10);
}while(i!=0&&n!=0);

Вот здесь надо узнать что находится в N

if (n==0) return 4;
if (i!=0) return 2
 
Dominik21Дата: Воскресенье, 27.11.2011, 20:41 | Сообщение # 34
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Выяснил я чему равно N=0.
Вот таким вот способом.
Code

do{
sd_write(0x41);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
n++;
delay_ms(10);
}while(i!=0&&n!=0);
if (n==0){PORTD.0=1;}
if (n==1){PORTD.1=1;}
if (n==2){PORTD.2=1;}
if (n==3){PORTD.3=1;}
if (n==4){PORTD.4=1;}
if (n==5){PORTD.5=1;}
if (n==6){PORTD.6=1;}
if (n==7){PORTD.7=1;}

if (n==0) return 4;
if (i!=0) return 2;
 
HiSERДата: Воскресенье, 27.11.2011, 21:20 | Сообщение # 35
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
о тупанул не N, а I надо.

И зачем такие сложности, напиши просто: PORTD=i; //и получишь на порте 8и битное число


Сообщение отредактировал HiSER - Воскресенье, 27.11.2011, 21:21
 
Dominik21Дата: Воскресенье, 27.11.2011, 23:13 | Сообщение # 36
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
I=0x00000101;
 
HiSERДата: Понедельник, 28.11.2011, 08:22 | Сообщение # 37
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Если с этим не заработает, меняй карточку.
Code

byte sd_init() {
byte i,n;
DDRB|=0x2c;
SPCR=0x52;
SPSR=0;
CS=1;
delay_ms(10);
for (i=0;i<10;i++) sd_write(0xff);
CS=0;
delay_ms(10);
sd_write(0x40);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0x95);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
if (i!=1) return 1;
sd_write(0x48);
sd_write(0);sd_write(0);sd_write(1);sd_write(0xaa);
sd_write(0x87);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
if (i==0x05) {
n=0;
do{
sd_write(0x41);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
n++;
delay_ms(10);
}while(i!=0&&n!=0);
if (n==0) return 4;
if (i!=0) return 2;
}else{
if (i!=1) return 2;
sd_write(0xff);
sd_write(0xff);
if(sd_byte()!=1) return 3;
if(sd_byte()!=0xaa) return 3;
n=0;
do{
sd_write(0x77);
sd_write(0);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
if (i!=1) return 2;
sd_write(0x69);
sd_write(0x40);sd_write(0);sd_write(0);sd_write(0);
sd_write(0xff);
sd_write(0xff);
do {
i=sd_byte();
}while(i==0xff);
n++;
delay_ms(10);
}while(i!=0&&n!=0);
if (n==0) return 4;
if (i!=0) return 2;
}
SPCR=0x50;
SPSR=0;
sd_write(0x50);
sd_write(0);sd_write(0);sd_write(2);sd_write(0);
sd_write(0xff);
sd_write(0xff);
sd_write(0xff);
return 0;
}
 
Dominik21Дата: Суббота, 10.12.2011, 11:56 | Сообщение # 38
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Заменил карту, все заработало, косячная флешка angry
Спасибо Вам огромное за помощь!!! smile

Добавлено (10.12.2011, 11:56)
---------------------------------------------
HiSER подскажите пожалуйста как начать заново читать файл не закрывая его!!!???? На закрытие слишком много времени уходит, дорога каждая миллисекунда!!!

Code

sd_init(); //Инициализируем карточку
delay_ms(50);
fat_init(); //Инициализируем FAT
delay_ms(50);
//Открываем 1 файл на флешке
file_open("1          ");

while (1){

if (PIND.3==0){    
/*при сробатывании датчика холла, читаем 2048 байт из файла*/

for (read=0; read<32; read++){
i=0;
file_read(map,128);
registr();  /*выполняем подпрограмму*/                        

}
}



Сообщение отредактировал Dominik21 - Суббота, 10.12.2011, 11:56
 
HiSERДата: Суббота, 10.12.2011, 18:27 | Сообщение # 39
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Переделывать функции надо...
 
Dominik21Дата: Воскресенье, 11.12.2011, 17:41 | Сообщение # 40
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
А нельзя просто обнулить переменную в fat.c!?? Уточняю вопрос, изначально мы открываем файл, а когда датчик срабатывает, читаем из файла байты, записывая их в массив, после прочтения всего файла не закрываем его, а обнуляем некую переменную, которая отвечает за подсчет прочитанных байт в fat.c и ждем следующего срабатывания датчика, начитаем читать с самого начала. Избегая открытие и закрытие файла!

Сообщение отредактировал Dominik21 - Воскресенье, 11.12.2011, 17:44
 
HiSERДата: Воскресенье, 11.12.2011, 22:10 | Сообщение # 41
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Там надо сохранять номер первого кластера открытого файла и другие мелочи.
Что бы правильно понимать о чем идет речь, в архиве лежал документ по описанию FAT.
 
Dominik21Дата: Понедельник, 12.12.2011, 11:38 | Сообщение # 42
Рядовой
Группа: Пользователи
Сообщений: 14
Репутация: 0
Статус: Offline
Я уверен что с FAT мне не под силу будет разобраться sad , а вот с 23K256 статическое последовательное ОЗУ думаю справлюсь. Смысл в чем- сначала с флешки загоняем файл в ОЗУ, ну а потом просто считываем с него, скорость должна быть больше... вроде несложно, должно получиться.
 
geniumДата: Четверг, 02.02.2012, 18:25 | Сообщение # 43
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Да с sd_init разобрался!

зависаю на sd_read в цикле ожидания! Никто не столкнулся?

Добавлено (02.02.2012, 18:25)
---------------------------------------------
прочитал в ЕЕПРОМ ответы карты

она выдает 64 байта FF потом F05F и продолжает выдавать FF!

что это значит? кто может сказать?

 
HiSERДата: Пятница, 03.02.2012, 22:25 | Сообщение # 44
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Инициализация точно прошла удачно?
Должна вернуть сначала 0xfe.
насколько я помню там:
Code

sd_write(0x51);
sd_write(addr.s.a24);
sd_write(addr.s.a16);
sd_write(addr.s.a8);
sd_write(addr.s.a0);
sd_write(0xff);
sd_write(0xff);
while (sd_byte()!=0xfe);


получи ответ команды:
Code

sd_write(0x51);
sd_write(addr.s.a24);
sd_write(addr.s.a16);
sd_write(addr.s.a8);
sd_write(addr.s.a0);
sd_write(0xff);
resp=sd_byte();
while (sd_byte()!=0xfe);


в resp будет ответ.


Сообщение отредактировал HiSER - Пятница, 03.02.2012, 22:26
 
geniumДата: Суббота, 04.02.2012, 00:31 | Сообщение # 45
Рядовой
Группа: Пользователи
Сообщений: 2
Репутация: 0
Статус: Offline
Отложил пока 2ГБ карту в сторонку и работаю с 64МБ ММС. Просто надо срочно запустить проект.

Сегодня закончил код под станок на ММС, завтра приступаю к платам и по ходу посмотрю опять что с 2ГБ SD.

На днях уже отпишусь по поводу результатов.

По инициализации sd_init() проходит. Застревает в sd_read().

По поводу приведенного(нижний приведенный не хватает еще sd_write() перед первым прочтением) кода ответа 0xFE не получал. Я 200 ответов писал в ЕЕПРОМ потом считывал но 0xFE не получал.

Попробую послать другие команды и смотреть ответы а то не понятно что там. Может что-то еще надо для инициализации. На днях отпишусь по этому поводу!

Добавлено (04.02.2012, 00:31)
---------------------------------------------
попробую форматировать другой утилитой и включить режим принудительный сектор на 512 байт.

 
Форум » Микроконтроллеры » Вопросы по статьям » ATmega8 + SD с поддержкой FAT
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск:

Хостинг от uCoz