|
Помогите подобрать файловую систему для microsd |
|
|
|
Nov 20 2008, 15:45
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Зверюга @ Nov 20 2008, 15:17)  Вопросы. efsl у меня на ARM7 дала 250 кб/c. Может, файловая система и не нужна? Разве что очень упрощенная. SD режим - это 4 бита? Только потеряете в быстродействии на AVR по сравнению с SPI.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 20 2008, 17:07
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Зверюга @ Nov 20 2008, 20:27)  или как-то по другому? Угу. 1) Выбрать более подходящий контроллер. 2) записывать данные во FLASH или EEPROM от компьютера по какому-нибудь интерфейсу. Да и задача непонятно - что потом с этими данными делается?
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 20 2008, 17:35
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Зверюга @ Nov 20 2008, 18:36)  Свою? Я наверное не сделал акцент, но с этой флешкой нужнго будет полноценно работать под Windows, А свой софт на Windows предусматривается? Или флэшка с вашей FS должна выглядеть как сменный накопитель на голой винде? Если первое, то своя FS не проблема, так как ее можно поддержать специальной программой на Windows, а если второе, то ищите контролер потолще, стандартные FS, которые понимает Винда, требуют ощутимого количества RAM'а для работы.
|
|
|
|
|
Nov 20 2008, 18:45
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Цитата А свой софт на Windows предусматривается? Ну если от своего не денешься, то конечно легче сделать свой софт на виндовс. Хотя идея скачать файлик, закинуть его на флешку, короче, чтобы мог сделать любой дурак - так заманчива... Цитата то ищите контролер потолще, АT91SAM7 подойдет для этих задач? И скажите, по своему опыту прыжок с Mega на ARM7 сильно тернистый?
|
|
|
|
|
Nov 20 2008, 20:36
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Зверюга @ Nov 20 2008, 21:45)  Ну если от своего не денешься, то конечно легче сделать свой софт на виндовс. Хотя идея скачать файлик, закинуть его на флешку, короче, чтобы мог сделать любой дурак - так заманчива... Тогда только FAT. И как минимум 512 байт для обработки (а может и больше, зависит от библиотеки) Цитата АT91SAM7 подойдет для этих задач? Да, скорее всего Цитата И скажите, по своему опыту прыжок с Mega на ARM7 сильно тернистый? Сказать не могу - не прыгал  Но в принципе особых трудностей быть не должно (и по большей части это будет зависеть от 'прыгуна'  )
|
|
|
|
|
Nov 21 2008, 11:38
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Зверюга @ Nov 21 2008, 08:00)  Там даже разъем под SD есть и пример проекта. Прыгал LPC-2478STK и на STM32 STK от Olimex. По вопросу NXP/Atmel почитайте раздел ARM. Прыжок не гарантирует требуемой скорости считывания карты, это комплексная задача.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 21 2008, 16:41
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Зверюга @ Nov 21 2008, 18:32)  Ну, продолжите. Я так понимаю, скорость чтения зависит от частоты SPI и от скорости обработки данных контроллером. Поменяв контроллер мы частично решим обе задачи. Дальше оптимизация программы, читающей файловую систему. Что еще входит в упомянутый Вами комплекс? Какой скорости считывания можно добиться на ARM7? возьмите скорость SPI в 1/4 скорости контроллера, получите битрейт 5 мбит/с. При чтении данных блоками (скажем, секторами по 512 байт, если будете использовать FAT16) потери на служебную информацию невелики, и скорости 600кбайт/с теоретически можно достигнуть (если нет, можно попробовать разогнать SPI до 10 МГц). А поддержка FAT реализуется достаточно просто (делала на меге8), особенно если не нужно учитывать фрагментацию и длинные имена файлов.
Сообщение отредактировал Paulina - Nov 21 2008, 16:58
|
|
|
|
|
Nov 21 2008, 17:25
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Зверюга @ Nov 21 2008, 20:23)  Ну у на ARM7 - где 60 МГц?. Можно ведь разогнеать SPI до 30 МГц? Ведь на PC - как-то читается до 8 МБ в секунду? ИЛи выход - SD режим? В библиотеке EFSL есть папки atmega_spi и atmega_sd - так вот последняя почему-то пуста... Зачем забивать гвозди микроскопом? Вам ведь просто нужно читать файлы? AVR хватит с головой для этого.
Сообщение отредактировал Paulina - Nov 21 2008, 17:32
|
|
|
|
|
Nov 21 2008, 17:55
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Зверюга @ Nov 21 2008, 20:50)  Я просто пытаюсь понять, от чего зависит скорость чтения.
Мне нужно (я пересчитал) - 1,5 Мбайт в секунду. Да и еще по ходу их наверное обрабатывать. а, ну тогда понятно. либо с ARM в SPI либо попробовать на AVR в режиме SD.
|
|
|
|
|
Nov 21 2008, 17:58
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
но ведь пишут же Цитата SD режим - это 4 бита? Только потеряете в быстродействии на AVR по сравнению с SPI.
|
|
|
|
|
Nov 24 2008, 15:10
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Зверюга @ Nov 24 2008, 14:34)  Хм... а если содержимое файла перед работой переписывать на ту же флешку куда-нибудь в конец и потом читать просто как поток информации - будет быстрее? я правильно поняла, что вам еще надо по этому же каналу spi отправлять данные дальше? как вариант можно дождаться начала блока данных и выставить сигнал #CS для принимающего устройства, чтобы оно уже принимало только эти данные (после окончания блока, естественно, снять #CS). но при данной скорости контроллера получите в лучшем случае чуть меньше 10 МБит/с.
Сообщение отредактировал Paulina - Nov 24 2008, 15:14
|
|
|
|
|
Nov 24 2008, 15:35
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
только этот момент подачи #CS надо хорошенько продумать. скорость spi будет равна половине скорости контроллера, а обновление портов происходит через 1 такт после записи в порт, можно и не успеть до прихода следующего фронта CLK. поиграйтесь с настройками CPOL, CPHA, авось получится. код для работы с FAT16 могу выложить, если надо.
Сообщение отредактировал Paulina - Nov 24 2008, 15:37
|
|
|
|
|
Nov 24 2008, 17:21
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Dog Pawlowa @ Nov 24 2008, 19:39)  Пробовать то можно, но существующие порт efsl (например) для SD интерфейса ARM7 NXP не использует DMA. В отличие от SPI, между прочим. Что касается SPI AVR, то что толку разогнать сам SPI? нужно же еще флаг готовности анализировать, адрес инкрементировать, проверять адрес на соответствие диапазону. Без DMA+IRQ сделать это с высокой скоростью нереально. Это так, но если данные идут непрерывно, без дефрагментации то можно просто установить размер блока данных, скажем 64 кБ и принимать их непрерывно, а потом уже делать проверки и прочая. мне лично больше 256кбит/с не было нужно, поэтому не пробовала. вот например часть кода из рабочей программы с функциями установки длины блока, считывания блока а также инициализацией карты, чтением FAT и т.д: Код unsigned char sec_per_clust, data[512]; unsigned int j, j2; unsigned long fat_base, cluster_base, addr; flash unsigned char cmd0[6] = {0x40, 0x00, 0x00, 0x00, 0x00, 0x95}, cmd1[6] = {0x41, 0x00, 0x00, 0x00, 0x00, 0x01}, blck_ln_200[6] = {0x50, 0x00, 0x00, 0x02, 0x00, 0x01}; //элементы 2-5 задают размер блока, в данном случае 512 байт ... void set_block_len(void) { spi(0xff); for(i=0; i<6; i++) spi(blck_ln_200[i]); while(spi(0xff)==0xff); spi(0xff); } ... void read_single_block(unsigned long daddr) { //k=255; //убрать комментарии если не хотите зависания при отсутствии карты do { spi(0xff); spi(0x51); spi(daddr>>24); spi(daddr>>16); spi(daddr>>8); spi(daddr); spi(0x01); while(spi(0xff)==0xff); //--k; } while((SPDR!=0x00));//&&(k>0)); while(spi(0xff)!=0xfe); for(j2=0; j2<512; j2++) data[j2]=spi(0xff); //разумеется, количество итераций зависит от размера считываемого блока spi(0xff); spi(0xff); spi(0xff); } ... //далее функция преобразования четырех байтов в одно 32-битное число (ну не нашла я готовых функций) void uchar_to_ulong(unsigned long *p, unsigned int offset, unsigned int count) { *p=0; for(; count>0; count--) { *p|=*(data+offset+count-1); if(count>1) *p<<=8; } } ... //=======инициализация карты=========== for (i=0; i<10; i++) spi(0xff); delay_ms(1); //========сброс карты=============== card_cs=0; do { spi(0xff); for(i=0; i<6; i++) spi(cmd0[i]); for(i=0; i<8; i++) if(spi(0xff)!=0xff) break; } while(SPDR!=0x01); //ждем ответа 0x01 - спящий режим //spi(0xff); //CS=1; //=======инициализация режима spi карты======= //CS=0; do { spi(0xff); for(i=0; i<6; i++) spi(cmd1[i]); for(i=0; i<8; i++) if(spi(0xff)!=0xff) break; } while(SPDR!=0x00); //spi(0xff); set_block_len();//0x100); read_single_block(0); //чтение master boot record card_cs=1; uchar_to_ulong(&addr, 0x1c6, 4); //позиция partition boot record в секторах card_cs=0; read_single_block(addr<<9); //чтение pbr card_cs=1; //================вычисление root base======================= uchar_to_ulong(&root_base, 0x0e , 2); //зарезервированных секторов root_base+=addr; //fat base в секторах fat_base=root_base<<9; //fat base в байтах uchar_to_ulong(&addr, 0x16, 2); //секторов на fat addr<<=1; //удвоение из-за того что 2 таблицы fat root_base+=addr; //root base в секторах root_base<<=9; //в байтах //================вычисление cluster base==================== sec_per_clust=data[0x0d]; //секторов на кластер addr=data[0x0d]; addr<<=10; //байтов на 2 фиктивных кластера cluster_base=root_base-addr; uchar_to_ulong(&addr, 0x11, 2); //число записей в корневом каталоге addr<<=5; //размер корневого каталога в байтах cluster_base+=addr; //cluster base в байтах card_cs=0; read_single_block(root_base); //чтение корневого каталога код читается плохо, согласна (написано полностью с нуля), но разобраться можно. спрашивайте, если что.
Сообщение отредактировал Paulina - Nov 24 2008, 17:22
|
|
|
|
|
Nov 25 2008, 07:49
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Paulina @ Nov 24 2008, 21:21)  Это так, но если данные идут непрерывно, без дефрагментации то можно просто установить размер блока данных, скажем 64 кБ и принимать их непрерывно Конечно, Paulina, только можно ли это назвать полноценной файловой системой? Цитата(sergeeff @ Nov 24 2008, 23:55)  Ну посмотрите хоть, перед тем как свой огород городить. Коллега, на AVR скорость fatfs около 300 кб/c, поэтому вопрос быстрее она efsl или нет, второстепенный, поскольку автору нужно больше, насколько я помню начало топика.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Nov 25 2008, 13:55
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(Dog Pawlowa @ Nov 25 2008, 10:49)  Конечно, Paulina, только можно ли это назвать полноценной файловой системой?  разумеется, нет, но в первом сообщении указывалось, что: Цитата Задачи самые скромные - только читать какой-нибудь файл. Не будет никаких каталогов - просто в корневом будет около 100 файлов
|
|
|
|
|
Nov 25 2008, 15:18
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(Dog Pawlowa @ Nov 25 2008, 11:49)  Конечно, Paulina, только можно ли это назвать полноценной файловой системой? Коллега, на AVR скорость fatfs около 300 кб/c, поэтому вопрос быстрее она efsl или нет, второстепенный, поскольку автору нужно больше, насколько я помню начало топика. Так надо сначала написать процедуру чтения сектора и замерить скорость чтения/записи n-секторов подряд и в произвольном порядке. После этого будет понятно, что является узким местом, вся организация доступа через FAT или чтение сектора. Я подобное проделывал с efsl, там накладные расходы от fat не превышали 10%.
|
|
|
|
|
Nov 25 2008, 16:19
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(sergeeff @ Nov 25 2008, 18:18)  Так надо сначала написать процедуру чтения сектора и замерить скорость чтения/записи n-секторов подряд и в произвольном порядке. После этого будет понятно, что является узким местом, вся организация доступа через FAT или чтение сектора. Я подобное проделывал с efsl, там накладные расходы от fat не превышали 10%. эффективность тем больше чем больше блок данных. если данные будут только транслироваться, то зачем ограничивать блок размером сектора, который всего 512 байт?
|
|
|
|
|
Nov 8 2009, 17:22
|
Группа: Участник
Сообщений: 5
Регистрация: 23-10-09
Пользователь №: 53 173

|
Пытаюсь прочесть хоть что-то с SD карты, чтобы понять, что все как-то работает и можно идти дальше, но карта отвечает только 0xFF (т.е. ничего), а программа ниже печатает только точки... В чем может быть дело, нет мыслей? Работаю с 8051 архитектурой и пока с программным SPI, фрагмент кода привожу ниже... Может, что-то не так с начальными установками уровней? Код deselect(); // Снять CS --> 1 for (i=0; i<10; ++i) wr_spi_msb(0x00); // Выдать >72 CLK for (i=0; i<10; ++i) // some delay, нужно ли? DATA = 0; // Начальный уровень на входе CMD карты
//========Сброс карты=============== select(); // Выдать CS_SD_Card --> 0 do { wr_spi_msb(0х40); // SD card CMD_0="CMD_GO_IDLE_STATE" - write byte MSB first via DATA pin wr_spi_msb(0); // Argument = 0 wr_spi_msb(0); // Argument = 0 wr_spi_msb(0); // Argument = 0 wr_spi_msb(0); // Argument = 0 wr_spi_msb(0x95); // Send CRC
for (i=0; i<8; ++i) // read card response R1 { card_status = rd_spi_READY_msb(); // прочесть байт из SD карты на ножке READY MSB first if (card_status != 0xFF) break; put_ch('.'); } } while (card_status != 0x01);
deselect(); // Снять CS --> 1 put_ch('x');
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Nov 9 2009, 17:17
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(inlog @ Nov 8 2009, 21:22)  Пытаюсь прочесть хоть что-то с SD карты, чтобы понять, что все как-то работает и можно идти дальше, но карта отвечает только 0xFF (т.е. ничего), а программа ниже печатает только точки... В чем может быть дело, нет мыслей? Работаю с 8051 архитектурой и пока с программным SPI, фрагмент кода привожу ниже... Может, что-то не так с начальными установками уровней?  А spi правильно настроен? полярность, фазировка клока sck? В начале перед отправкой cmd0 попробуйте пустой байт (0xff) отправить. Еще уберите put_ch('.') из внутреннего цикла (а лучше совсем). Опять же функции работы с spi неизвестно какие.
Сообщение отредактировал Paulina - Nov 9 2009, 17:19
|
|
|
|
|
Nov 11 2009, 18:39
|
Группа: Участник
Сообщений: 5
Регистрация: 23-10-09
Пользователь №: 53 173

|
Спасибо, все заработало - проблема банальна, неконтакт в разъеме (не родном) для SD ))) Еще понизил скорость SPI, а то резистивный делитель 5В-->3.3V даже с коротким кабелем ужасно валит фронты, а микросхемы преобразователя уровней пока не нашел подходящего и доступного (
Вопрос пока чисто теоретический на будущее (не нашел ответ в доках), если кто пробовал - а можно ли объединить SD pins IN и OUT проводным ИЛИ, чтобы работать с карточкой по одной двунаправленной шине данных при программном SPI ?
|
|
|
|
|
Nov 15 2009, 20:28
|
Группа: Участник
Сообщений: 5
Регистрация: 23-10-09
Пользователь №: 53 173

|
Цитата(Mik174 @ Nov 12 2009, 02:38)  Посмотрите в сторону контроллера LPC2378. Спасибо! У меня задача обновить старую 5V разработку, где в кач-ве внешней памяти были PCMCIA-карты, а прикручиваю SD. Все пока работает в прототипе на hrdw уровне, проблема только найти (розница для прототипа) преобразователи уровней. Пока поставил для 5В->3В NC7SZ125 (запитка от 3.3В), а данные 3В от SD подаю в 5В контроллер напрямую (
|
|
|
|
|
Nov 17 2009, 10:21
|

Участник

Группа: Свой
Сообщений: 72
Регистрация: 10-02-05
Из: Краснодар
Пользователь №: 2 558

|
Цитата(inlog @ Nov 15 2009, 23:28)  Спасибо! У меня задача обновить старую 5V разработку, где в кач-ве внешней памяти были PCMCIA-карты, а прикручиваю SD. Все пока работает в прототипе на hrdw уровне, проблема только найти (розница для прототипа) преобразователи уровней. Пока поставил для 5В->3В NC7SZ125 (запитка от 3.3В), а данные 3В от SD подаю в 5В контроллер напрямую ( Из 3 в 5 можно 74act/ahct(hct) серию попробовать, из 5 в 3 - 74lcx наример. А не проще CF в режиме PCMCIA попробовать было (вроде должно поддерживать) ?
Сообщение отредактировал Ronin - Nov 17 2009, 10:31
|
|
|
|
|
Nov 24 2009, 17:54
|
Группа: Участник
Сообщений: 5
Регистрация: 23-10-09
Пользователь №: 53 173

|
чтобы не создавать новой темки, спрошу тут - железки работают, взял Chan's FATFS lib, после шаманства с некоторыми переменными и текстом скомпилился без ошибок в Keil, но : у меня Р89V51RD2 и всего 1КВ RAM, а скомпиленная по умолчанию библиотека занимает более 1К. В основном за счет того, что буфер 512КВ объявлен 2 раза - мною в main и внутри одной из процедур библиотеки как рабочий... Хватит ли в логике работы с FAT всего одного буфера при работе с одним драйвом и не объявить ли его Global, например, и убрать из нутра функции? А то оверлаппинг не помогает.
|
|
|
|
|
Nov 24 2009, 19:11
|
Группа: Участник
Сообщений: 5
Регистрация: 23-10-09
Пользователь №: 53 173

|
Цитата(inlog @ Nov 24 2009, 20:54)  оверлаппинг не помогает.  Sorry, похоже сам виноват, буфер всего один ( Только все равно в 1КВ уложить не могу пока с ф-циями записи ((((( Кроме как чистить ненужные функции (типа перименования файлов и еще кое что...) мыслей нет
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|