ATmega8 + SD с поддержкой FAT
|
|
HiSER | Дата: Суббота, 26.11.2011, 17:22 | Сообщение # 31 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Отредактировал библиотеку, а толку нет. Объясните пожалуйста, в чем моя ошибка - в отсутствии загрузочной записи или в чем?
Сообщение отредактировал Dominik21 - Суббота, 26.11.2011, 17:39 |
|
| |
HiSER | Дата: Воскресенье, 27.11.2011, 02:10 | Сообщение # 33 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: 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
Статус: Offline
| о тупанул не N, а I надо.
И зачем такие сложности, напиши просто: PORTD=i; //и получишь на порте 8и битное число
Сообщение отредактировал HiSER - Воскресенье, 27.11.2011, 21:21 |
|
| |
Dominik21 | Дата: Воскресенье, 27.11.2011, 23:13 | Сообщение # 36 |
Рядовой
Группа: Пользователи
Сообщений: 14
Статус: Offline
| I=0x00000101;
|
|
| |
HiSER | Дата: Понедельник, 28.11.2011, 08:22 | Сообщение # 37 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Заменил карту, все заработало, косячная флешка Спасибо Вам огромное за помощь!!!
Добавлено (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
Статус: Offline
| Переделывать функции надо...
|
|
| |
Dominik21 | Дата: Воскресенье, 11.12.2011, 17:41 | Сообщение # 40 |
Рядовой
Группа: Пользователи
Сообщений: 14
Статус: Offline
| А нельзя просто обнулить переменную в fat.c!?? Уточняю вопрос, изначально мы открываем файл, а когда датчик срабатывает, читаем из файла байты, записывая их в массив, после прочтения всего файла не закрываем его, а обнуляем некую переменную, которая отвечает за подсчет прочитанных байт в fat.c и ждем следующего срабатывания датчика, начитаем читать с самого начала. Избегая открытие и закрытие файла!
Сообщение отредактировал Dominik21 - Воскресенье, 11.12.2011, 17:44 |
|
| |
HiSER | Дата: Воскресенье, 11.12.2011, 22:10 | Сообщение # 41 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Там надо сохранять номер первого кластера открытого файла и другие мелочи. Что бы правильно понимать о чем идет речь, в архиве лежал документ по описанию FAT.
|
|
| |
Dominik21 | Дата: Понедельник, 12.12.2011, 11:38 | Сообщение # 42 |
Рядовой
Группа: Пользователи
Сообщений: 14
Статус: Offline
| Я уверен что с FAT мне не под силу будет разобраться , а вот с 23K256 статическое последовательное ОЗУ думаю справлюсь. Смысл в чем- сначала с флешки загоняем файл в ОЗУ, ну а потом просто считываем с него, скорость должна быть больше... вроде несложно, должно получиться.
|
|
| |
genium | Дата: Четверг, 02.02.2012, 18:25 | Сообщение # 43 |
Рядовой
Группа: Пользователи
Сообщений: 2
Статус: Offline
| Да с sd_init разобрался!
зависаю на sd_read в цикле ожидания! Никто не столкнулся?Добавлено (02.02.2012, 18:25) --------------------------------------------- прочитал в ЕЕПРОМ ответы карты
она выдает 64 байта FF потом F05F и продолжает выдавать FF!
что это значит? кто может сказать?
|
|
| |
HiSER | Дата: Пятница, 03.02.2012, 22:25 | Сообщение # 44 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: 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
Статус: Offline
| Отложил пока 2ГБ карту в сторонку и работаю с 64МБ ММС. Просто надо срочно запустить проект.
Сегодня закончил код под станок на ММС, завтра приступаю к платам и по ходу посмотрю опять что с 2ГБ SD.
На днях уже отпишусь по поводу результатов.
По инициализации sd_init() проходит. Застревает в sd_read().
По поводу приведенного(нижний приведенный не хватает еще sd_write() перед первым прочтением) кода ответа 0xFE не получал. Я 200 ответов писал в ЕЕПРОМ потом считывал но 0xFE не получал.
Попробую послать другие команды и смотреть ответы а то не понятно что там. Может что-то еще надо для инициализации. На днях отпишусь по этому поводу!Добавлено (04.02.2012, 00:31) --------------------------------------------- попробую форматировать другой утилитой и включить режим принудительный сектор на 512 байт.
|
|
| |