Форум РадиоКот https://radiokot.ru/forum/ |
|
Работа с SD/MMC флеш картой Mega128+Code Vision AVR https://radiokot.ru/forum/viewtopic.php?f=61&t=58118 |
Страница 1 из 2 |
Автор: | servo [ Чт ноя 10, 2011 19:25:59 ] | ||
Заголовок сообщения: | Работа с SD/MMC флеш картой Mega128+Code Vision AVR | ||
Тут для разнообразия задумал сделать MP3 плеер на ATMega128 и внешнем кодеке. Для начала решил покорить Sd карту.. Долго мучался с встроенной в CVAVR библиотекой в итоге чуть погуглив наткнулся http://my-avr.at.ua/forum/3-74-2 на библиотеку для SD написанную под cvavr (исходники там тоже есть). Чуток помучавшись все заработало, но остался один момент, как считать имеющиеся в корне флешки файлы в массив, чтобы занать какие файлы присутвуют на флешке. В Hex редакторе открываю образ флешки и вижу все имена файлов хранятся в одном месте оно начинается с метки тома TEST_FAT искать файлы например по расширению до конца записи.. , по идее все можно считать, но как указать что читать надо с N -ного адреса непойму.. Может кто-то имел уже дело с флешками Исходник + схему в Proteus для симуляции прилагаю. Еще момент, если кому-то захочется закинуть в образ флешки свои файлы или вытащить уже имеющиеся на ней файлы то понадобится прога WinImage. Просто перетягиваете файлы в окно программы с открытым образом флешки
|
Автор: | uk8amk [ Пт ноя 11, 2011 08:38:18 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
servo писал(а): как считать имеющиеся в корне флешки файлы в массив, чтобы занать какие файлы присутвуют на флешке. Судя по ответу с вышекуказанного форума - никак, нет функции поиска файлов в той библиотеке. Надо ее ручками дописывать. servo писал(а): по идее все можно считать, но как указать что читать надо с N -ного адреса непойму.. FAT16, если я не ошибаюсь, позволяет иметь всего 512 записей(файлов и каталогов) в каждой дирректории. При использовании только корневой дирректории задача упрощается т.к. не надо при поиске заглядывать в подкаталоги. Так вот, стартовый адрес корневой дирректории всегда известен, длина одной записи фиксирована(для имени формата 8.3), максимальное кол-во записей = 512. Поэтому вам надо считать аттрибут файла/каталога, затем, если файл нас не устроил, увеличить адрес следующего чтения на размер записи. Обратите внимание на функцию: Код: byte fat_findfile(flash byte *name,byte mattrib,fff *info) { //Поиск записи в корневой директории Там есть все необходимые элементы для реализации вашей задачи(нужно только чуток переписать:). В одном из своих проектов я тоже писал ФАТ с поиском фалов по маске в имени и/или расширении. Выглядело примерно так: Код: flash char all_files[11]={'?','?','?','?','?','?','?','?','I','L','D'};//искать все файлы с маской ILD
entry_number=0; while(entry_number<512)//play all *.ILD files on SDC { open_result=open_file(all_files,entry_number);//пытаемся открыть файл с начальным номером текущей записи [i]entry_number[/i] и указанным именем [i]all_files[/i] entry_number=(open_result->entry_number)+1;//увеличим счетчик записи if(open_result->file_status)//если файл успешно открыт, то приступим к его чтению { //здесь работаем с самим файлом }; }; |
Автор: | servo [ Пт ноя 11, 2011 19:42:37 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Я вообще подумал что можно например напрямую читать флешку без Fat размещения, просто побайтно и тупо найти название тома а за ним по расширению найти файлы и скопировать их имена. |
Автор: | Coolish [ Сб ноя 12, 2011 00:03:09 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Что-то я не понял, как это возможно корректно без разбора записей FAT сделать. Если речь о том, что не надо вычитывать адреса файлов, то да. Ещё надо помнить, что удалённые файлы там отмечаются какой-то меткой в первом символе - их выводить не надо. |
Автор: | servo [ Сб ноя 12, 2011 01:20:46 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Coolish писал(а): Что-то я не понял, как это возможно корректно без разбора записей FAT сделать. Если речь о том, что не надо вычитывать адреса файлов, то да. Ещё надо помнить, что удалённые файлы там отмечаются какой-то меткой в первом символе - их выводить не надо. Да я уже поэксперементировал с hex редактором , получается когда файл удаляеш то первый байт его имени метится байтом 0xE5, этот файл весит в списке до тех пор пока на флешку не будет записан новый файл, после этого я как понял происходит обновление списка и то что было помечено 0xE5 удаляется из списка. Ну утром займусь, может и получится чего сделать |
Автор: | uk8amk [ Сб ноя 12, 2011 08:09:11 ] | ||
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR | ||
servo писал(а): Да я уже поэксперементировал с hex редактором , получается когда файл удаляеш то первый байт его имени метится байтом 0xE5, этот файл весит в списке до тех пор пока на Лучше бы почитали спецификацию на FAT. Помойму на электрониксе ( electronix.ru ) была даж переведенная на русский язык версия. Все или по крйней мере большинство вопросов сами отпадут. Конкретно в вашем случае надо посчитать всего-то 5 - 6 смещений. Up: вот спецификация, правда на английском. Всего 30 страниц...
|
Автор: | servo [ Вт ноя 15, 2011 12:41:14 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
uk8amk писал(а): вот спецификация, правда на английском. Всего 30 страниц... Спасибо , почитал ! но пока не получается считать имена файлов.. Можете навести на истенный путь куском кода |
Автор: | uk8amk [ Ср ноя 16, 2011 09:35:48 ] | ||
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR | ||
Честно говоря я сам не реализовывал вывод имен файлов, мне нужно было просто подряд читать данные из существующих файлов на флешке. Поэтому в здесь готовый код показать не могу. См. стр.23 из спецификации. Там показана структура одной записи. Памяти в М128 достаточно поэтому можно не парится и сразу организовать структуру в ОЗУ и заполнять ее байтами из дирректории. Вот мой исходник, может чем поможет. См. ф-цию Код: struct FILE_PARAM *find_file(flash unsigned char *name,unsigned int entry_number) Она ищет файл в корневой дирректории по имени и возвращает номер записи и параметры файла. А вот здесь происходит сравнение текущего имени файла с искомым: Код: search_result=fstrcmp(tmp,name,0,11); Код немного корявый - вылизывался под М48.
|
Автор: | servo [ Пт ноя 18, 2011 12:11:42 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
uk8amk - спасибо ! буду изучать.. вообще думаю нужна просто функция типа char sd_readbyte(адрес){ ..... return ch; }; Далее несложно уже будет найти метку тома и считать имена файлов, но пока правильно не получается сделать. |
Автор: | uk8amk [ Сб ноя 19, 2011 07:51:11 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
servo писал(а): вообще думаю нужна просто функция типаchar sd_readbyte(адрес){ Это не совсем правильная позиция. Наверное вы уже слышали, что SD(MMC, SDHC?) имеют внутреннюю организацию сектора 512 байт(или 1024, 2048). Так вот, вы можете только начать чтение с нулевого смещения байта внутри одного сектора и закончить либо перечитав все 512 байт, либо использовать инструкции чтения блока неопределенной длины. Допустим желаемые байты находятся по смещению +100, надо прочитать 10 байт. Тогда: 1.Выставляем адрес сектора(+0, +512, +1024 и т.д.). 2.Считываем 100 байт, но на них внимание не обращаем т.к. они не нужны. 3.Считываем нужный +101-й байт. 4.Заверщаем операцию чтения. 5.Повторяем все почти тоже самое но для смещения +102. Чувствуете разницу? Вместо 10+100 байт вам придется прочитать примерно 1 килобайт. Т.к. нужные поля данных почти всегда имеют длину >1 и <256 байт, то либо сразу буферизуют весь сектор в ОЗУ контроллера, либо считывают всю цепочку. Дам, посмотрел сейчас в тот код , конкретнее файл _sd.c. Нет четкого разделения уровня драйвера ввода-вывода карты памяти и уровня фат... Вот функция, кот я когда-то писал для доступа к данным по опр. адресу: Код: // Read number bytes from sector // void read_partial_sector( unsigned long adress, //sector adress unsigned char *destination,//destination object - char array unsigned int offset,//offset in bytes from current sector position; 0=no offset unsigned char len)//for faster perfomance size reduced to 'char' { unsigned int i; end_read();//stop read if required send_CMD(CMD18,adress);//send adress of new sector for multiple read wait_data_ready(); _SRF=1;//serial read opened while(offset) { --offset; //spi(0xFF);//go to the required byte position in sector spi_tx_ff; }; for(i=0;i<len;i++) { /////Read byte from SPI///// SPDR = 0xFF;//start while(!(SPSR & (1<<SPIF)));//wait until byte will be read destination[i]=SPDR; //destination[i]=spi(0xFF);//fill destination object } } Она получает адрес сектора и смещение байтов от начала сектора. Затем она заполняет массив указанной длины. |
Автор: | servo [ Сб ноя 19, 2011 10:39:47 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
uk8amk спасибо ! уже начинаю понимать суть работы с sd\mmc картой.. вроде получается. как будет все разлизано.. выложу исходник. |
Автор: | servo [ Сб ноя 26, 2011 06:32:42 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Наткнулся на проект MP3 плееара.. удивило то чно сделан на 8-ой меге. |
Автор: | спящий [ Ср окт 03, 2012 21:20:29 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Подскажите,вот задумал попробывать читать ММС и выводить на динамик.Поскольку с ФАТ ксожалению еще неразобрался(думаю PETIT или FS изучить библеотеки что лучше?),поэтому читаю непрерывными блоками.Скинул на флеху .wav файл начал выводить с MMC на ШИМ и динамик- тупо трещание,иногда смена тонов( Как подсчитать задержку между выводом звука на ШИМ? Частота 8МГц,и при разных качествах музыки нужно другую задержку(красным цветом в коде)? 30 Кбит в сек задежка равна = 3750(пиревод в байты) /8000000 =468 микро сек. так? считываем с mmc; цикл(1) выводим цифру в ШИМ ; задержка; возвращаемся в ЦИКЛ; Спойлер#include <stdio.h>#include <mega48.h> #include <delay.h> #include <string.h> #include <io.h> #define data(x) SPDR=x; while (!( SPSR&(1<<7))); int i,temp; char array[200] ; void main(void) { DDRB=0b11101111; //настройка ШИМ TCCR1A=0b10000001; TCCR1B=0b00001001; TIMSK1=0b01000000; // 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous UCSR0A=0x00; UCSR0B=0x18; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x33; //настройка SPI SPCR=0b01010011; SPSR=1; //подаем 74 импульса PORTB.2=1; delay_ms(10); for(i=0;i<10;i++) { data(0xff) } PORTB.2=0; printf(" ---------- \r\n"); //CMD0 data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x01) { data(0xff); temp= SPDR; if (i>10) {data(0x40); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD0 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); //CMD1 data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); while (temp!=0x00) {data(0xff); temp= SPDR; if (i>20) {data(0x41); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); i=0; } i++; } printf("CMD1 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); delay_ms(20); printf("CID chitaet \r\n"); //CID регистр чтение байтов data(0x4A); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); for (i=0;i<16;i++) { data(0xff); array[i]=SPDR ; } for (i=0;i<16;i++) { printf(" %d",array[i]," ") ; } printf("\r\n") ; printf("CSD chitaet \r\n"); //CID регистр чтение байтов data(0x4A); data(0x00); data(0x00); data(0x00); data(0x00); data(0x95); for (i=0;i<16;i++) { data(0xff); array[i]=SPDR ; } for (i=0;i<16;i++) { printf(" %d",array[i]," ") ; } printf("\r\n") ; //CMD17 чтение байтов data(0x52); data(0x00); data(0x04); data(0xfa); data(0x00); data(0x95); i=0; while (temp!=0xfe) { data(0xff); temp= SPDR; } printf("CMD17 proshlo uspeshno temp=%d\n\r",temp,"\r\n"); while(1){ for (i=0;i<200;i++) //чтение 512 кб { data(0xff); array[i]=SPDR ; } for (i=0;i<200;i++) { if (array[i]!=0x00) { OCR1AL=(array[i]); delay_us(29); } } } } |
Автор: | vitalik_1984 [ Чт окт 04, 2012 00:04:06 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Что за глупости?Нужно сделать задержку таймером и менять значение шим в прерывании по переполнению таймера. Задержка считается очень просто- смотрим частоту дискретизации звука например "20кГц ,стерео, 128кбит/сек " Тут 20кГц это и есть частота дискретизации так вот нужно каждую секунду выводить 20тыс чисел.Соответственно шим должен успевать менять свое значение и как следствие как минимум на величину разрядности звука нужно умножить частоту дискретизации.Пусть это будет 8 бит, значит 256 ступеней.Нужно умножить 256 на 20кГц и вот с такой скоростью нужно чтобы были прерывания по переполнению. Звук в общем то можно с любым качеством записать.Даже стандартный инструмент Хр звукозапись позволяет изменять качество. Ну или в других редакторах можно изменить готовые звуки. Разрядность определяется 128000бит/сек качества делим на 20000 Гц дискретизации получаем где то 6,4 бит. Цифры взяты из головы, в конкретном случае звуков самостоятельно можно посчитать. |
Автор: | спящий [ Чт окт 04, 2012 09:35:26 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
vitalik_1984 писал(а): Что за глупости?Нужно сделать задержку таймером и менять значение шим в прерывании по переполнению таймера. Задержка считается очень просто- смотрим частоту дискретизации звука например "20кГц ,стерео, 128кбит/сек " Тут 20кГц это и есть частота дискретизации так вот нужно каждую секунду выводить 20тыс чисел. ну это я имел виду vitalik_1984 писал(а): Соответственно шим должен успевать менять свое значение и как следствие как минимум на величину разрядности звука нужно умножить частоту дискретизации.Пусть это будет 8 бит, значит 256 ступеней.Нужно умножить 256 на 20кГц и вот с такой скоростью нужно чтобы были прерывания по переполнению. вот тут я вообще непонял. Разрядность это изменение звука с 0 до 256,тоесть может быть любым числом,зачем умножать разряд на частоту?Я еще пойму чтобы сделать типа синусойды,сравнивать это значение со слудующим чтобы сделать плавный переход i++ если больше или i-- если меньше. |
Автор: | zero648 [ Чт окт 04, 2012 10:58:33 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
спящий писал(а): вот тут я вообще непонял. Разрядность это изменение звука с 0 до 256,тоесть может быть любым числом,зачем умножать разряд на частоту?Я еще пойму чтобы сделать типа синусойды,сравнивать это значение со слудующим чтобы сделать плавный переход i++ если больше или i-- если меньше. В коде не надо ничего умножать, это нужно чтобы выяснить какое значение установить в OCRn таймера задающего дискретность и этот же таймер по прерыванию совпадения будет обновлять значение OCRa ШИМ таймера, шаг таймера задающего дискретность не должен быть меньше 256-ти машинных циклов, чтобы успевал обновляться OCR ШИМ таймера. По-этому максимальная частота дискретизации для 8МГц при 8 бит качества звука будет: 8000000/2**8=31250Гц, в принципе для звука 22050Гц 8 бит вполне приемлемо. |
Автор: | спящий [ Чт окт 04, 2012 13:50:27 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
А воту меня непрограммируется контроллер с флехой микроСД,надо добавлять сопротивления последовательно с картой? на счет воспроизведения звука сейчас осмыслю(почитаю и задам фопрос))),а качество звука и дискетизация не зависят друг от друга? чет мне кажется одно и тоже) |
Автор: | спящий [ Чт окт 04, 2012 17:58:00 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
прочитав я понял,что дискретизация X(зависит с какой скоростью мы передаем на ШИМ),БИТ это цифра величина ЩИМа?) тоесть цикл: читаем с флехи OCR1AL=(array[i]); моя величина на ШИМ с флехи delay_ms(1); моя дискретизация назад в цикл так же? при: Частота дискретизации 8 Качество звука 32кБ/сек размер 4бит = 2^4= 16(на шим число от 0 до 16) |
Автор: | vitalik_1984 [ Чт окт 04, 2012 20:05:44 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
Делэй это для того,чтобы светодиодами моргать, а тут лучше использовать уже используемый таймер! |
Автор: | спящий [ Чт окт 04, 2012 20:35:22 ] |
Заголовок сообщения: | Re: Работа с SD/MMC флеш картой Mega128+Code Vision AVR |
заменим delay на таймер,но смысл првильный? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |