Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите подобрать файловую систему для microsd
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Зверюга
Добрый день. Задача следующая.
Имеется микроконтроллер AVR. Хотелось бы сделать на mega88 (1024 SRAM), но максимум что смогу себе позволить - mega32.

Задачи самые скромные - только читать какой-нибудь файл. Не будет никаких каталогов - просто в корневом будет около 100 файлов. Форматировать и записывать информацию планируется исключительно в Windows. Скорость хотелось бы не ниже 600 кбайт сек.

Вопросы.
1. Смогу ли я достичь такой скорости в SPI режиме при частоте контроллера 20 Мгц?
2. Ну собственно, учитывая скромные (кроме скорости) потребности - какую малотребовательную к ресурсам и легкую в освоении систему порекомендуете? efsl, я так понял, это акула, попроще ничего нет?
XVR
Цитата(Зверюга @ Nov 20 2008, 14:17) *
Добрый день. Задача следующая.
Имеется микроконтроллер AVR. Хотелось бы сделать на mega88 (1024 SRAM), но максимум что смогу себе позволить - mega32.

Задачи самые скромные - только читать какой-нибудь файл. Не будет никаких каталогов - просто в корневом будет около 100 файлов. Форматировать и записывать информацию планируется исключительно в Windows. Скорость хотелось бы не ниже 600 кбайт сек.
Если нужно только читать и нет каталогов, то рекомендую сделать свою FS с ориентацией именно на это. Самый простой вариант - корневой каталог лежит в начале SD, файлы адресуются ссылкой на первый сектор файла. В начале сектора лежит заголовок, в котором указанны длинна данного куска файла (в секторах), номер сектора, где находится продолжение файла и длинна занятого участка на последнем секторе (только для последнего участка).

Для последовательного чтения файлов в такой FS память в МК практически не нужна вообще.
Alex B._
Цитата(Зверюга @ Nov 20 2008, 14:17) *
какую малотребовательную к ресурсам и легкую в освоении систему порекомендуете? efsl, я так понял, это акула, попроще ничего нет?

fatfs
Зверюга
Свою?
Я наверное не сделал акцент, но с этой флешкой нужнго будет полноценно работать под Windows, то есть на компьютере будет только писаться, а на флешке только читаться.
Так что свою ситстему не потяну.

А вот что касается FATFS - она поддерживает SD-режим? А то SPI - 200 кб/сек - маловато будет.
Nixon
Она вообще не поддерживает никакого режима. Вам нужно самому переопределить функцию чтения/записи сектора.
Dog Pawlowa
Цитата(Зверюга @ Nov 20 2008, 15:17) *
Вопросы.

efsl у меня на ARM7 дала 250 кб/c.
Может, файловая система и не нужна? Разве что очень упрощенная.
SD режим - это 4 бита? Только потеряете в быстродействии на AVR по сравнению с SPI.
Зверюга
В общем, максимум что мне нужно это транслировать по SPI от контроллера объем данных в 64 кбайт 30 раз в секунду. Источник этих данных - SD карта. Данные эти просто передавать, никак не обрабатывая.
Как лучше сделать - закгрузить во внешнюю оперативную память эти 64 кб и крутить? или как-то по другому?
Dog Pawlowa
Цитата(Зверюга @ Nov 20 2008, 20:27) *
или как-то по другому?

Угу.
1) Выбрать более подходящий контроллер.
2) записывать данные во FLASH или EEPROM от компьютера по какому-нибудь интерфейсу.

Да и задача непонятно - что потом с этими данными делается?
XVR
Цитата(Зверюга @ Nov 20 2008, 18:36) *
Свою?
Я наверное не сделал акцент, но с этой флешкой нужнго будет полноценно работать под Windows,
А свой софт на Windows предусматривается? Или флэшка с вашей FS должна выглядеть как сменный накопитель на голой винде? Если первое, то своя FS не проблема, так как ее можно поддержать специальной программой на Windows, а если второе, то ищите контролер потолще, стандартные FS, которые понимает Винда, требуют ощутимого количества RAM'а для работы.
SysRq
Цитата(Зверюга @ Nov 20 2008, 18:36) *
Я наверное не сделал акцент, но с этой флешкой нужнго будет полноценно работать под Windows...
Есть известный способ обмануть FAT...
Зверюга
Цитата
А свой софт на Windows предусматривается?



Ну если от своего не денешься, то конечно легче сделать свой софт на виндовс. Хотя идея скачать файлик, закинуть его на флешку, короче, чтобы мог сделать любой дурак - так заманчива...

Цитата
то ищите контролер потолще,


АT91SAM7 подойдет для этих задач?
И скажите, по своему опыту прыжок с Mega на ARM7 сильно тернистый?
XVR
Цитата(Зверюга @ Nov 20 2008, 21:45) *
Ну если от своего не денешься, то конечно легче сделать свой софт на виндовс. Хотя идея скачать файлик, закинуть его на флешку, короче, чтобы мог сделать любой дурак - так заманчива...
Тогда только FAT. И как минимум 512 байт для обработки (а может и больше, зависит от библиотеки)
Цитата
АT91SAM7 подойдет для этих задач?
Да, скорее всего

Цитата
И скажите, по своему опыту прыжок с Mega на ARM7 сильно тернистый?
Сказать не могу - не прыгал sad.gif Но в принципе особых трудностей быть не должно (и по большей части это будет зависеть от 'прыгуна' smile.gif )
Зверюга
КТо-нибудь именл дело с этим http://www.megachip.ru/item.php?item_id=667627

Там даже разъем под SD есть и пример проекта.
Dog Pawlowa
Цитата(Зверюга @ Nov 21 2008, 08:00) *
Там даже разъем под SD есть и пример проекта.

Прыгал LPC-2478STK и на STM32 STK от Olimex.
По вопросу NXP/Atmel почитайте раздел ARM.
Прыжок не гарантирует требуемой скорости считывания карты, это комплексная задача.
Зверюга
Ну, продолжите.
Я так понимаю, скорость чтения зависит от частоты SPI и от скорости обработки данных контроллером.
Поменяв контроллер мы частично решим обе задачи. Дальше оптимизация программы, читающей файловую систему. Что еще входит в упомянутый Вами комплекс? Какой скорости считывания можно добиться на ARM7?
Paulina
Цитата(Зверюга @ Nov 21 2008, 18:32) *
Ну, продолжите.
Я так понимаю, скорость чтения зависит от частоты SPI и от скорости обработки данных контроллером.
Поменяв контроллер мы частично решим обе задачи. Дальше оптимизация программы, читающей файловую систему. Что еще входит в упомянутый Вами комплекс? Какой скорости считывания можно добиться на ARM7?


возьмите скорость SPI в 1/4 скорости контроллера, получите битрейт 5 мбит/с. При чтении данных блоками (скажем, секторами по 512 байт, если будете использовать FAT16) потери на служебную информацию невелики, и скорости 600кбайт/с теоретически можно достигнуть (если нет, можно попробовать разогнать SPI до 10 МГц). А поддержка FAT реализуется достаточно просто (делала на меге8), особенно если не нужно учитывать фрагментацию и длинные имена файлов.
Зверюга
Ну у на ARM7 - где 60 МГц?. Можно ведь разогнеать SPI до 30 МГц?
Ведь на PC - как-то читается до 8 МБ в секунду?
ИЛи выход - SD режим?
В библиотеке EFSL есть папки atmega_spi и atmega_sd - так вот последняя почему-то пуста...
Paulina
Цитата(Зверюга @ Nov 21 2008, 20:23) *
Ну у на ARM7 - где 60 МГц?. Можно ведь разогнеать SPI до 30 МГц?
Ведь на PC - как-то читается до 8 МБ в секунду?
ИЛи выход - SD режим?
В библиотеке EFSL есть папки atmega_spi и atmega_sd - так вот последняя почему-то пуста...


Зачем забивать гвозди микроскопом? Вам ведь просто нужно читать файлы? AVR хватит с головой для этого.
Зверюга
Я просто пытаюсь понять, от чего зависит скорость чтения.

Мне нужно (я пересчитал) - 1,5 Мбайт в секунду. Да и еще по ходу их наверное обрабатывать.
Paulina
Цитата(Зверюга @ Nov 21 2008, 20:50) *
Я просто пытаюсь понять, от чего зависит скорость чтения.

Мне нужно (я пересчитал) - 1,5 Мбайт в секунду. Да и еще по ходу их наверное обрабатывать.


а, ну тогда понятно. либо с ARM в SPI либо попробовать на AVR в режиме SD.
Зверюга
но ведь пишут же
Цитата
SD режим - это 4 бита? Только потеряете в быстродействии на AVR по сравнению с SPI.
Paulina
ну тогда арм - и вперед smile.gif
Зверюга
Хм... а если содержимое файла перед работой переписывать на ту же флешку куда-нибудь в конец и потом читать просто как поток информации - будет быстрее?
Paulina
Цитата(Зверюга @ Nov 24 2008, 14:34) *
Хм... а если содержимое файла перед работой переписывать на ту же флешку куда-нибудь в конец и потом читать просто как поток информации - будет быстрее?


я правильно поняла, что вам еще надо по этому же каналу spi отправлять данные дальше? как вариант можно дождаться начала блока данных и выставить сигнал #CS для принимающего устройства, чтобы оно уже принимало только эти данные (после окончания блока, естественно, снять #CS). но при данной скорости контроллера получите в лучшем случае чуть меньше 10 МБит/с.
Зверюга
Paulina, в принципе вы предложили хороший вариант, я подумаю.
Paulina
только этот момент подачи #CS надо хорошенько продумать. скорость spi будет равна половине скорости контроллера, а обновление портов происходит через 1 такт после записи в порт, можно и не успеть до прихода следующего фронта CLK. поиграйтесь с настройками CPOL, CPHA, авось получится. код для работы с FAT16 могу выложить, если надо.
Зверюга
Ну выложите, лишним не будет.
КТо бы выложил код для работы в SD режиме. Что-то не гуглится мне.
Dog Pawlowa
Цитата(Paulina @ Nov 21 2008, 21:55) *
а, ну тогда понятно. либо с ARM в SPI либо попробовать на AVR в режиме SD.

Пробовать то можно, но существующие порт efsl (например) для SD интерфейса ARM7 NXP не использует DMA. В отличие от SPI, между прочим.
Что касается SPI AVR, то что толку разогнать сам SPI? нужно же еще флаг готовности анализировать, адрес инкрементировать, проверять адрес на соответствие диапазону. Без DMA+IRQ сделать это с высокой скоростью нереально.
Paulina
Цитата(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); //чтение корневого каталога

код читается плохо, согласна (написано полностью с нуля), но разобраться можно. спрашивайте, если что.
sergeeff
Коллеги!

Ну уже не знаю сколько раз на нашем форуме сравнивались efsl и fatfs. Последняя работает быстрее efsl за счет мультисекторных операций. На ее сайте http://elm-chan.org/fsw/ff/00index_e.html есть benchmark'и. Ну посмотрите хоть, перед тем как свой огород городить.
Dog Pawlowa
Цитата(Paulina @ Nov 24 2008, 21:21) *
Это так, но если данные идут непрерывно, без дефрагментации то можно просто установить размер блока данных, скажем 64 кБ и принимать их непрерывно

Конечно, Paulina, только можно ли это назвать полноценной файловой системой? smile.gif


Цитата(sergeeff @ Nov 24 2008, 23:55) *
Ну посмотрите хоть, перед тем как свой огород городить.

Коллега,
на AVR скорость fatfs около 300 кб/c, поэтому вопрос быстрее она efsl или нет, второстепенный, поскольку автору нужно больше, насколько я помню начало топика.
Paulina
Цитата(Dog Pawlowa @ Nov 25 2008, 10:49) *
Конечно, Paulina, только можно ли это назвать полноценной файловой системой? smile.gif


разумеется, нет, но в первом сообщении указывалось, что:
Цитата
Задачи самые скромные - только читать какой-нибудь файл. Не будет никаких каталогов - просто в корневом будет около 100 файлов
sergeeff
Цитата(Dog Pawlowa @ Nov 25 2008, 11:49) *
Конечно, Paulina, только можно ли это назвать полноценной файловой системой? smile.gif
Коллега,
на AVR скорость fatfs около 300 кб/c, поэтому вопрос быстрее она efsl или нет, второстепенный, поскольку автору нужно больше, насколько я помню начало топика.


Так надо сначала написать процедуру чтения сектора и замерить скорость чтения/записи n-секторов подряд и в произвольном порядке. После этого будет понятно, что является узким местом, вся организация доступа через FAT или чтение сектора. Я подобное проделывал с efsl, там накладные расходы от fat не превышали 10%.
Paulina
Цитата(sergeeff @ Nov 25 2008, 18:18) *
Так надо сначала написать процедуру чтения сектора и замерить скорость чтения/записи n-секторов подряд и в произвольном порядке. После этого будет понятно, что является узким местом, вся организация доступа через FAT или чтение сектора. Я подобное проделывал с efsl, там накладные расходы от fat не превышали 10%.


эффективность тем больше чем больше блок данных. если данные будут только транслироваться, то зачем ограничивать блок размером сектора, который всего 512 байт?
inlog
Пытаюсь прочесть хоть что-то с SD карты, чтобы понять, что все как-то работает и можно идти дальше, но карта отвечает только 0xFF (т.е. ничего), а программа ниже печатает только точки... В чем может быть дело, нет мыслей? Работаю с 8051 архитектурой и пока с программным SPI, фрагмент кода привожу ниже... Может, что-то не так с начальными установками уровней? unsure.gif

Код
    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');
Paulina
Цитата(inlog @ Nov 8 2009, 21:22) *
Пытаюсь прочесть хоть что-то с SD карты, чтобы понять, что все как-то работает и можно идти дальше, но карта отвечает только 0xFF (т.е. ничего), а программа ниже печатает только точки... В чем может быть дело, нет мыслей? Работаю с 8051 архитектурой и пока с программным SPI, фрагмент кода привожу ниже... Может, что-то не так с начальными установками уровней? unsure.gif


А spi правильно настроен? полярность, фазировка клока sck? В начале перед отправкой cmd0 попробуйте пустой байт (0xff) отправить.
Еще уберите put_ch('.') из внутреннего цикла (а лучше совсем).
Опять же функции работы с spi неизвестно какие.
inlog
Спасибо, все заработало - проблема банальна, неконтакт в разъеме (не родном) для SD )))
Еще понизил скорость SPI, а то резистивный делитель 5В-->3.3V даже с коротким кабелем ужасно валит фронты, а микросхемы преобразователя уровней пока не нашел подходящего и доступного (

Вопрос пока чисто теоретический на будущее (не нашел ответ в доках), если кто пробовал - а можно ли объединить SD pins IN и OUT проводным ИЛИ, чтобы работать с карточкой по одной двунаправленной шине данных при программном SPI ?
Mik174
Посмотрите в сторону контроллера LPC2378.

У него есть аппаратный порт для подключения MMC/SD карт, причем, как я понял, SD - с 4 линиями данных:

"SD/MMC card interface pin description
Pin Name Type Description
MCICLK Output Clock output
MCICMD Input Command input/output.
MCIDAT[3:0] Output Data lines. Only MCIDAT[0] is used for Multimedia cards.
MCIPWR Output Power Supply Enable for external SD/MMC power supply.

...

CLK: One bit is transferred on both command and data lines with each clock cycle.
The clock frequency varies between 0 MHz and 20 MHz (for a multimedia card) or
0 MHz and 25 MHz (for a secure digital memory card)."
inlog
Цитата(Mik174 @ Nov 12 2009, 02:38) *
Посмотрите в сторону контроллера LPC2378.

Спасибо! У меня задача обновить старую 5V разработку, где в кач-ве внешней памяти были PCMCIA-карты, а прикручиваю SD. Все пока работает в прототипе на hrdw уровне, проблема только найти (розница для прототипа) преобразователи уровней. Пока поставил для 5В->3В NC7SZ125 (запитка от 3.3В), а данные 3В от SD подаю в 5В контроллер напрямую (
Ronin
Цитата(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 попробовать было (вроде должно поддерживать) ?
inlog
чтобы не создавать новой темки, спрошу тут - железки работают, взял Chan's FATFS lib, после шаманства с некоторыми переменными и текстом скомпилился без ошибок в Keil, но :
у меня Р89V51RD2 и всего 1КВ RAM, а скомпиленная по умолчанию библиотека занимает более 1К. В основном за счет того, что буфер 512КВ объявлен 2 раза - мною в main и внутри одной из процедур библиотеки как рабочий... Хватит ли в логике работы с FAT всего одного буфера при работе с одним драйвом и не объявить ли его Global, например, и убрать из нутра функции? А то оверлаппинг не помогает. crying.gif
inlog
Цитата(inlog @ Nov 24 2009, 20:54) *
оверлаппинг не помогает. crying.gif

Sorry, похоже сам виноват, буфер всего один ( Только все равно в 1КВ уложить не могу пока с ф-циями записи (((((
Кроме как чистить ненужные функции (типа перименования файлов и еще кое что...) мыслей нет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.