А фрагментированные файлы поддерживаются? Была несколько раз ошибка \"F_er\", которая устранялась после полного стирания и записи tzx файлов.
А фрагментированные файлы поддерживаются? Была несколько раз ошибка \"F_er\", которая устранялась после полного стирания и записи tzx файлов.
Нет пока не поддерживаются, но работы в этом направлении ведутся. Для этого надо доволно много переделать, в частности добавить хорошую буферизацию. Дело в том, что пока идёт воспроизведение \"беготня\" по секторам может превысить межбитный интервал.Сообщение от skyther
А сразу после выбора файла может быть можно построить цепочку в ОЗУ по принципу: 4 байта - адрес сектора (не номер), 1 байт - длина нефрагментированного участка. Выделить под это дело байт этак 50, т.е. на цепочку из 10 фрагментов. Если длина равна нулю - конец цепочки. Если файл фрагментирован более 10 фрагментов, то \"еггог\" еще до старта вывода...
2 jdigreze
Да, это нужно сделать, но только ошибка у меня всё равно появляется до начала воспроизведения потому как парсинг идёт и там проверяется целостность блоков файла. Хотя есть вероятность того, что парсинг проскочит \"не родные\" сектора.
Поэтому наверное проще добавить перед парсингом проверку на смежность кластеров файла. Просто по фату пробежаться от начала файла и до конца :-)
Погонял SD карту, не работаетВот лаги с теримнала:
Код:MMC_GO_IDLE: OK MMC_SEND_OP_COND: FAILED DOS_mmcStartMR: FAILED
2 skyther
Спасибо. Это очень важная информация. Получилось тоже самое, что и у меня с SD. Надо разбираться...
Честно сказать, я думал, что у тебя так и сделано... Видимо обшибси...Сообщение от DVS
![]()
Хм. И странно, что SD не хочет реагировать на CMD1. Вот что по этому поводу пишет SanDisk:
Т.е. CMD1 (set_op_cond) должен в любом случае вывести карту из сна, но эту команду нужно посылать многократно, пока не сбросится бит <<in-idle-state>>.Сообщение от SanDisk
И еще:
А вместо OCR, будет возвращаться один байт - R1, в котором бит <<0>> и есть <<in-idle-state>>.Сообщение от SanDisk
В общем, хз... Я полностью ориентировался на SD, и отличий от MMC не знаю. А документ от SanDisk называется ProdManualSDCardv1.9.pdf, если не найдешь, пиши на мыло, отправлю... Правда там около 1,1Мб![]()
В следующих версиях будет доделано ;-)Сообщение от jdigreze
Он не только не сбрасывается, там ещё и бит <<illegal command>> взведён!Сообщение от jdigreze
У меня подозрения закрались насчёт реакции SD на отпускание CS... Дело в том, что Response R1 (после отправки команды и CRC) я читаю так: тактирую SPI побайтно, т.е. по 8 бит, и смотрю, что мне в регистр сваливается, как только это что-то отлично от 0xFF я прекращаю тактирование, считаю что принял R1 и отпускаю CS. Но по идее нужно читать ещё 40 бит, так как длина R1 48бит, но зачем это делать если полезная инфа содержиться только в первых 8 битах!!!
Поэтому я считал, что после отпускания CS, карта при следующем CS не будет пытаться вывести мне оставшиеся 40 бит.
В общем, то в обоих вариантах результат не удовлетворительный SD отказывается выходить из Idle, мало того во втором варианте с чтением всех 48 бит R1 отличается от полученного по первому варианту (8 бит) !!! :-)
Продолжаю поиск решения...
PDF у меня вроде достаточно, даже на какой то проц Intel XCA Application Note скачал, там написано как SD инициализировать: CMD0, CMD55, ACMD41 - пробовал и так.
Вот как это делается:
Код:u08 mmcCommand(u08 cmd, u32 arg) { u08 r1; u08 retry=0; // send command spiTransferByte(cmd | 0x40); spiTransferByte(arg>>24); spiTransferByte(arg>>16); spiTransferByte(arg>>8); spiTransferByte(arg); spiTransferByte(0x95); // crc valid only for MMC_GO_IDLE_STATE // end command // wait for response // if more than 8 retries, card has timed-out // return the received 0xFF while((r1 = spiTransferByte(0xFF)) == 0xFF) if(retry++ > 8) break; // return response return r1; } u08 mmcSendCommand(u08 cmd, u32 arg) { u08 r1; // assert chip select SPI_CS = 0; // issue the command r1 = mmcCommand(cmd, arg); // release chip select SPI_CS = 1; return r1; } u08 mmcReset(void) { u16 retry; u08 r1=0; retry = 0; do { // send dummy bytes with CS high before accessing spiTransferByte(0xFF); spiTransferByte(0xFF); spiTransferByte(0xFF); spiTransferByte(0xFF); // resetting card, go to SPI mode r1 = mmcSendCommand(MMC_GO_IDLE_STATE, 0); // do retry counter retry++; if(retry>100) { #ifdef DEBUG USART_puts("MMC_GO_IDLE: FAILED"); #endif return 0xFD; } } while(r1 != 0x01); #ifdef DEBUG USART_puts("MMC_GO_IDLE: OK"); #endif // TODO: check card parameters for voltage compliance // before issuing initialize command retry = 0; do { // initializing card for operation r1 = mmcSendCommand(MMC_SEND_OP_COND, 0); // do retry counter retry++; if(retry>5000) { #ifdef DEBUG USART_puts("MMC_SEND_OP_COND: FAILED"); #endif return r1; } } while(r1); #ifdef DEBUG USART_puts("MMC_SEND_OP_COND: OK"); #endif ...
Повторю, что с MMC работает на УРА. Я mmcReset вообще делаю перед воспроизведением каждого файла :-)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)