|
Помогите подобрать файловую систему для microsd |
|
|
|
 |
Ответов
|
Nov 21 2008, 17:55
|
Участник

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

|
Цитата(Зверюга @ Nov 21 2008, 20:50)  Я просто пытаюсь понять, от чего зависит скорость чтения.
Мне нужно (я пересчитал) - 1,5 Мбайт в секунду. Да и еще по ходу их наверное обрабатывать. а, ну тогда понятно. либо с ARM в SPI либо попробовать на AVR в режиме SD.
|
|
|
|
|
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, 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 ?
|
|
|
|
Сообщений в этой теме
Зверюга Помогите подобрать файловую систему для microsd Nov 20 2008, 11:17 XVR Цитата(Зверюга @ Nov 20 2008, 14:17) Добр... Nov 20 2008, 12:19 Alex B._ Цитата(Зверюга @ Nov 20 2008, 14:17) каку... Nov 20 2008, 12:24 Зверюга Свою?
Я наверное не сделал акцент, но с этой флешк... Nov 20 2008, 15:36 XVR Цитата(Зверюга @ Nov 20 2008, 18:36) Свою... Nov 20 2008, 17:35 SysRq Цитата(Зверюга @ Nov 20 2008, 18:36) Я на... Nov 20 2008, 17:55 Nixon Она вообще не поддерживает никакого режима. Вам ну... Nov 20 2008, 15:42 Dog Pawlowa Цитата(Зверюга @ Nov 20 2008, 15:17) Вопр... Nov 20 2008, 15:45 Зверюга В общем, максимум что мне нужно это транслировать ... Nov 20 2008, 16:27 Dog Pawlowa Цитата(Зверюга @ Nov 20 2008, 20:27) или ... Nov 20 2008, 17:07 Зверюга ЦитатаА свой софт на Windows предусматривается?
... Nov 20 2008, 18:45 XVR Цитата(Зверюга @ Nov 20 2008, 21:45) Ну е... Nov 20 2008, 20:36 Зверюга КТо-нибудь именл дело с этим http://www.megachip.r... Nov 21 2008, 04:00 Dog Pawlowa Цитата(Зверюга @ Nov 21 2008, 08:00) Там ... Nov 21 2008, 11:38 Зверюга Ну, продолжите.
Я так понимаю, скорость чтения зав... Nov 21 2008, 15:32 Paulina Цитата(Зверюга @ Nov 21 2008, 18:32) Ну, ... Nov 21 2008, 16:41 Зверюга Ну у на ARM7 - где 60 МГц?. Можно ведь разогнеать ... Nov 21 2008, 17:23 Paulina Цитата(Зверюга @ Nov 21 2008, 20:23) Ну у... Nov 21 2008, 17:25     Paulina Цитата(Dog Pawlowa @ Nov 25 2008, 10:49) ... Nov 25 2008, 13:55 Зверюга но ведь пишут же
ЦитатаSD режим - это 4 бита? Толь... Nov 21 2008, 17:58 Paulina ну тогда арм - и вперед Nov 21 2008, 18:12 Зверюга Хм... а если содержимое файла перед работой перепи... Nov 24 2008, 11:34 Paulina Цитата(Зверюга @ Nov 24 2008, 14:34) Хм..... Nov 24 2008, 15:10 Зверюга Paulina, в принципе вы предложили хороший вариант,... Nov 24 2008, 15:21 Paulina только этот момент подачи #CS надо хорошенько прод... Nov 24 2008, 15:35 Зверюга Ну выложите, лишним не будет.
КТо бы выложил код д... Nov 24 2008, 16:01 sergeeff Коллеги!
Ну уже не знаю сколько раз на нашем... Nov 24 2008, 19:55 Mik174 Посмотрите в сторону контроллера LPC2378.
У него ... Nov 11 2009, 22:38 inlog Цитата(Mik174 @ Nov 12 2009, 02:38) Посмо... Nov 15 2009, 20:28  Ronin Цитата(inlog @ Nov 15 2009, 23:28) Спасиб... Nov 17 2009, 10:21   inlog чтобы не создавать новой темки, спрошу тут - желез... Nov 24 2009, 17:54    inlog Цитата(inlog @ Nov 24 2009, 20:54) оверла... Nov 24 2009, 19:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|