Недавно разобрался с флешкой miniSD kingston 1GB.
Может кому поможет.
Если всё в порядке функция возвращает значение 0x00
Карты нет - значение 0xFF
Карта не инициализировалась (например если это SDHC) - значение 0xFD
код для АТмеги128
unsigned char SD_init (void)
{
ClearError;
unsigned int i=0;
unsigned char b=0;
SPI_low(); //Низкая скорость на шине (250кГц)
init:
SD_UNCS;
while (i<74) //Что-то вроде синхронизации - нужно при высоком уровне на CS
{
write_SPI(0xFF); //Послать 74 раз 0xFF
i++;
};
SD_CS;
i=0;
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0xFF);
write_SPI(0x40); //далее шлём команду сброса - CMD0
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
b=write_SPI(0x95);
while (b==0xFF) //Пока карта не ответит
{
b=write_SPI(0xFF);
if (i==1000) {SD_UNCS; return 0xFF;}; //Или не кончатся попытки - это значит что карты нету
i++;
};
SD_err=b;
if (b!=0x01) {goto init;}; //Карта не ответила верно
SD_UNCS;
_delay_ms(1);
SD_CS;
_delay_ms(500);
_delay_ms(500);
_delay_ms(500);
write_SPI(0xFF);
b=0xFF;
while (b!=0x00) //Пока карта не ответит
{
write_SPI(0xFF); //без этого не пашет...
write_SPI(0x41); //Команда инициализации стандартная, для ММС
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
b=write_SPI(0x01);
while (b==0xFF) b=write_SPI(0xFF);//Вот тут может возникнуть вечный цикл, что нехорошо
};
SD_err=b;
if (b!=0x00) {write_SPI(0xFF); SD_UNCS; return 0xFD;}; //SD Карта не инициализировалась
//Далее настраиваем скорость на шине
SPI_high(); //4МГц
SD_UNCS; //Готово!!
ClearError;
return 0x00;
}
Собственно, после разбирательства с картой пошли разбирательства с файловой системой...
Прочёл нулевой сектор, посчитал размер, вычислил расположение таблиц FAT и корневого каталога. И вдруг возник вопрос: А всё ли так как надо? вот прилагаю небольшой дампик http://ifolder.ru/10303260
Первые 513байт (значений 0х55 0хАА) - нулевой сектор диска
вторые 513байт (тоже до значений 0х55 0хАА) - Загрузочный сектор
третьи 512байт - самое начало корневого каталога.
Меня немного смутило расположение длинных имён файлов - начинаются с середины. а так вроде похоже на правду...
Подскажите пожалста, так ли оно?
У тебя косяк. Сектор ровно 512 байт. Если выкинуть 1 байт в самом начале и один байт посередние среди 00 во втором секторе, то все просто идеально. Разъясняю:
1. Флешки форматируются как жесткие диски, поэтому 0 сектор это MBR. Только вот программы загрузчика там нет, одна таблица разделов (что и видно). Сигнатура 55АА должна быть в последних 2х байтах сектора (510 и 511, если считать от 0).
2. Второй сектор - стандартный boot сектор. Опять же, без самого загрузчика - только параметры FS.
3. Если сделать коррекцию, то директория выглядит нормально.
4. Что касается LFN, курите доки. Я вижу здесь, что они нормальные.
Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком. Загрузчики при желании можно положить, для этого просто форматируем карты под DOSом в USB картридере с включенной эмуляцией в BIOSе системы. (или тупо винхексом туда положить). Еще бывает форматирование карты без MBR. Это скорее исключение, т.к. сама винда все флешки форматирует с MBR записью. Но иногда я напарывался (видимокакие-то автономные девайсы делали так). В этом случае флешка как дискета, начинается с MBR. Добавить поддержку несложно, но можно тупо залупиться и выдать "Форматируйте нах". %)
насчёт косяка, эт я знаю но ничё поделать не могу
именно с этой флешкой некоторые сектора получаются по 513байт... попробовал другую, на два гига - прекрасно работает и 512байт возвращает.
А насчёт загрузчика - интересно... можно заставить мегу грузиться с флешки. занятно получится
HardWareMan wrote:
Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком.
чем кодишь на м68к? я уже который год мечтаю компик замутить на нём
Искал долго нормальный ASM для М68К. Остановился на IDE:
У одник глюки, чторые требуют какой-то свой синтаксис - не осилил. До этого IDE Юзал какой-то заточенный под Сегу ASM, но он глючный страшно. А в этом IDE есть симулятор (он мне не нужен в принципе). И единственный его глюк - это неправильная компиляция команды MOVEM (делаю через DB ручками). Ну и отсуствие инклуды для бинарника. Т.е. бинарник приходиться переводить в текстик с DBшками и инклюдить. Эээх...
HardWareMan wrote:
Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком.
чем кодишь на м68к? я уже который год мечтаю компик замутить на нём
Искал долго нормальный ASM для М68К. Остановился на IDE:
У одник глюки, чторые требуют какой-то свой синтаксис - не осилил. До этого IDE Юзал какой-то заточенный под Сегу ASM, но он глючный страшно. А в этом IDE есть симулятор (он мне не нужен в принципе). И единственный его глюк - это неправильная компиляция команды MOVEM (делаю через DB ручками). Ну и отсуствие инклуды для бинарника. Т.е. бинарник приходиться переводить в текстик с DBшками и инклюдить. Эээх...
А исходные коды своих наработок не публикуешь, мистер Gates?
Может кому пригодятся
Я тут за главного - если что шлите мыло на me собака shaos точка net
Shaos wrote:А исходные коды своих наработок не публикуешь, мистер Gates?
Может кому пригодятся
Хыхы. Они еще далеки до завершения. К тому же подтормаживают нехило... Закончу все - выложу вместе с проектом.
Договорились. Ещё я знаю, что на ассемблере m68k можно кодить по разному - типа какие регистры для чего обычно использовать и т д. Интересно было бы услышать от тех кто до сих пор кодит о подобных предпочтениях. Можно топик отдельный создать на эту тему...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Удалось прочитать файл и отправить его в VS1002D
Причём судя по всему ещё и ресурсы остаются... для решения простеньких задач
Потребляет 40-60мА (mp3, 320kbps, 44100, громкость средняя) - многовато, но пока оптимизацией по питанию не занимался