Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с SD картой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Страницы: 1, 2, 3
QuickWitted
Цитата(SALOME @ Jul 24 2007, 14:16) *
С чего вы это взяли? Любое устройство, работающее в SPI выдает информацию (т.е. биты DATA) только при получении тактовых импульсов SCLK ( один бит DATA на один такт SCLK) и никак она не может "начать давать ответ" в середине байта.


В любой доке на ММС или SD посмотрите описание Ncr
А после прочтения станет ясно что:
Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.

Подробно тут:
http://electronix.ru/forum/index.php?showt...633?entry243656

Цитата
а иначе не будет Вам щастья smile.gif

При ответе счастье - это когда твой ответ с мануалом не расходится twak.gif
bmf
Цитата(QuickWitted @ Jul 24 2007, 12:42) *
В любой доке на ММС или SD посмотрите описание Ncr
А после прочтения станет ясно что:
Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.


Полный бред, не вводите в заблуждение если сами не читали или не понимаете
Спецификация на SD
...
While the SD Memory Card channel is based on command and data bit streams which are initiated
by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data
block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock
cycles).
...
Таблица Timing Values
Ncr - Unit - 8 clock cycles
...
SALOME
Цитата(QuickWitted @ Jul 24 2007, 16:42) *
В любой доке на ММС или SD посмотрите описание Ncr
А после прочтения станет ясно что:
Ncr - измеряется не в байтах, а в CLOCK CYCLE - а это в переводе означает один такт CLK на шине SPI.

Прошла по ссылке. Там как раз и пинают за эту путаницу smile.gif. Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит). Мне не попадалось... Итак для задержки нужно послать N-ое количество "пустых БАЙТ (0хFF)". Для Ncr это число от 0 до 8. Это означает, что если отклик после посылки 8-го пустого байта не пришел, то его уже не будет. Кстати "пустой" байт посылается не столько для задержки, а для того чтобы Мaster SPI (в Вашем случае это РС) послал тактовые импульсы Slave SPI (это FLASH карта) и с их помощью получил отклик. Если вы не пошлете пустой байт, то отклик не получите ни под каким видом, потому,что SPI - это СИНХРОННЫЙ интерфейс. И не хмурьте лоб на смайлике, лучше его наморщите :-)
QuickWitted
Цитата(bmf @ Jul 24 2007, 16:09) *
Полный бред, не вводите в заблуждение если сами не читали или не понимаете
Спецификация на SD


Всех датащитов на флеши не читал, но с десяток изучил...

Цитата
While the SD Memory Card channel is based on command and data bit streams which are initiated
by a start bit and terminated by a stop bit, the SPI channel is byte oriented. Every command or data
block is built of 8-bit bytes and is byte aligned to the CS signal (i.e. the length is a multiple of 8 clock
cycles).

Ну и что?
И чем это противоречит?
Токен FE для ловли начала и предназначен...

Цитата
Таблица Timing Values
Ncr - Unit - 8 clock cycles


Написано же НЕ У ВСЕХ производителей он КРАТЕН 8...
Из спецификации на SD С.т. 4-46 таблица 4-24 "Timing Values"

NCR
Min - 2 Clock cycles
Max - 64 Clock cycles

Страницу прикладываю...Нажмите для просмотра прикрепленного файла

Цитата(SALOME @ Jul 24 2007, 16:23) *
Прошла по ссылке. Там как раз и пинают за эту путаницу smile.gif. Все задержки, в т.ч. и Ncr измеряются именно в байтах. Обратите внимание на цифру 8 перед CLOCK CYCLE. Не может аппаратный SPI работать с циклами не кратными байту (т.е. 8 бит).


Во во поэтому они гибрид и делали (ловили софтово, а принимали хардварно)
bmf
Цитата(QuickWitted @ Jul 24 2007, 14:36) *
Всех датащитов на флеши не читал, но с десяток изучил...
...
Страницу прикладываю..

Как говорят: смотришь в книгу а видишь фигу 07.gif
Вы точно чего то не дочитали
у SD есть два режима - родной SD в котором действительно битовая синхронизация и SPI - в котором только байтовая.
вы привели как раз как раз таблицу для родного SD режима (в котором и эффективно работать можно только с SD контроллером).
А если таковые SD с битовой синхронизацией для SPI режима есть (в чем я сильно сомневаюсь) - то это не SD, т.к. они не будут отвечать спецификации
И если у когото и вылезла она в середине байта, то это из за мягко сказать неумелости - карта не переведена в режим SD или сбои по фронтам линии clock. Только и всего.
Angelborn
Вот и у меня, ребята назрел снова вопрос. Не буду добивать вас какой-то ерундой, у меня всё конкретно.
После инициализации карты шлём команду CMD18 и начинаем непрерывно считать байтики. Вот в порыве своей идеи я и забыл про CRC и мой DAC стал озвучивать и эту ахинею smile.gif.
Т.е. картина после посылки CMD18 такая:
Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC - Block 512 byte - CRC - CRC........ и т.д.
Так оно и есть.

Вопрос следующий: как отключить эти CRC, чтобы посылки имели вид:
Block 512 byte - Block 512 byte - Block 512 byte....

Из буржуйского даташита вычитал, что есть такая команда, как CMD59, но вот её подробное описание не удосужились привести...
Кто что знает?
oll
Вопрос следующий: как отключить эти CRC, чтобы посылки имели вид:
Block 512 byte - Block 512 byte - Block 512 byte....

Так как время между посылками в звуковой цап или шим при оцифровке звука 16кГц составляет 65мкС - Вы спокойно успеете прочитать два CRC. Правда, если Вы используете 51 кристалл надо все просчитать - может понадобится снизить частоту оцифровки до 8 кГц (125 мкС).
Angelborn
Цитата(oll @ Jul 24 2007, 20:29) *
Так как время между посылками в звуковой цап или шим при оцифровке звука 16кГц составляет 65мкС - Вы спокойно успеете прочитать два CRC. Правда, если Вы используете 51 кристалл надо все просчитать - может понадобится снизить частоту оцифровки до 8 кГц (125 мкС).


Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти smile.gif)
Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC.
Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR).
И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк.
Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули.
У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0.
В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки.
Отпишусь о результатах.
oll
Цитата(Angelborn @ Jul 25 2007, 00:12) *
Не всё так просто. Я на своём AT89C2051 решил вытянуть все 22 кГц! И это получилось. Почти smile.gif)
Звук проигрывается, но со щелчками. Я встал ослом на выход ЦАПа и узнал характер этих щелчков - это те самые 2 байта CRC.
Так вот, для проигрывания 22 кГц, 8 бит мне пришлось поставить кварц 20 МГц (у 2051 на один такт уходит 12 циклов кварца, в итоге имеем реальную частоту 1,67 МГц, если бы это был AVR).
И со всеми этими условиями программка работает впритык, т.е не всунешь туда ещё пару строк.
Даже для этого мне пришлось ужать цикл воспроизведения 1 байта хитрым способом. ЦАП у меня 12 бит, поставил то, что было под рукой. Реально значат только старшие 8 бит, остальные 4 нули.
У DAC7513 цикл состоит из 16 бит: x-x-0-0-bit12-bit11-.....-bit0.
В рамках этой схемы всё получилось впритык, и эти 2 байта CRC всё портят. Сегодня попробую их просто не читать (16 clock на карточке и всё), но тогда появится ступенька в фонограмме. Но это лучше, чем щелчки.
Отпишусь о результатах.


Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает
плюсы:
-питание 3В
- малое потребление в слипе
-внутренний генератор 8 мГц
-не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено)
- и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия)
не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую
Angelborn
Цитата(oll @ Jul 24 2007, 21:42) *
Честно говоря я бы в Вашей задаче заменил AT89C2051 на Tiny2313 - по ногам совпадает
плюсы:
-питание 3В
- малое потребление в слипе
-внутренний генератор 8 мГц
-не нужен внешний ЦАП - звук можно вывести на 8-ми битный шим (их там четыре) + 1резистор и конденсатор - звук получается хороший (проверено)
- и лично для меня большой плюс - любимая среда разработки - Алгоритм билдер (до 2К компилирует не зарегистрированная версия)
не сочтите за рекламу АВРов - 51 серию тоже регулярно пользую


На тини это чудо техники сделать - раз плюнуть! Там быстродействие всё покроет и все дыры залатает.
Весь смысл в том, чтобы сделать это на AT89C2051. Проект не коммерческий, строится исключительно на энтузиазме. Поймите меня правильно.
QuickWitted
Цитата(bmf @ Jul 24 2007, 16:59) *
И если у когото и вылезла она в середине байта, то это из за мягко сказать неумелости - карта не переведена в режим SD или сбои по фронтам линии clock. Только и всего.


А с этого места подробно если можно...

Добавил 2 функции:
A) Ловить 0ххххххх (первый ноль, потом принять 7 бит)
Б) Ловить 11111110 (первый ноль)

Случай из практики:
1) Карта 32 метра ответ FE (11111110b) не приходит - вместо него FС (11111100b)
Т.к. у меня SPI софтовый то скорость можно СИЛЬНО уменьшить...
(пробовал вплоть до 25 герц при тактировании)
На мелких скоростях результат тот же
А остальные тесты -> проходили по датащиту
После изменения (ловли первого нуля) ответ FС переплыл в FE...

2) После переделки карта микро на 512 метров начала НОРМАЛЬНО отвечать на CMD0,CMD1,CMD16
До этого сыпала лобудой
Правда на CMD17 ругается на неверный аргумент (этот адресс на карте 32 метра работал)
QuickWitted
Народ у кого есть спецификация на MMC "4.0" ?
Поделитесь....
QuickWitted
смотрю я на листок инициализации MMC v4.0
(полной версии у меня нет, а ММС микро по стандарту 4.0)
и смущает меня тип ответа на CMD1...
в моём исходнике он RESP_1 (кстати в библиотеках на Си тоже)
а тут они получают ответ RESP_3

лист Нажмите для просмотра прикрепленного файла
bmf
Цитата(QuickWitted @ Jul 25 2007, 07:06) *
А с этого места подробно если можно...

Все выше сказанное мной относится к SD (с MMC не работаю).
А что там юзер или производитель накосячил, нет желания предугадывать.
Работаю с большими SD от SanDisk, Transcend и Kingston и никогда такая проблема не возникает.
Инициализирую сразу на частоте 25МГц, современные карты это позволяют.
Rudolph
Работаю с EP9302. Пытаюсь активировать SD-card (micro-SD Kingston 1024Mb ) для работы по SPI.

Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod. После CMD8, в случае illegal command(я получаю именно такой ответ R1=0x05) надо "Test IO flag". А что это за IO flag?

Причем насчет формата CMD8 нашел только вот тут: http://elm-chan.org/docs/mmc/mmc_e.html

Не подскажете, в какой доке посмотреть насчет CMD8?
QuickWitted
Цитата(Rudolph @ Aug 9 2007, 18:00) *
Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod.


Ничего не понятно....
Ссылку на датащит можно?
А лучше сюда кидай...
Rudolph
Вот он:
QuickWitted
Цитата(Rudolph @ Aug 9 2007, 18:00) *
Использую SDIO Simplidied spec. v. 2.00. Там есть блок-схема для инициализации в SPI-mod.


Ага - есть страница 4 рис 3,1
Где нарисована последовательность CMD0 - > CMD1 - > работаем с SPI
(Вроде стандартно wink.gif )

Пробовал? (там варианты ещё есть на рис 3,1)

ИМХО: то что на странице 7 рис 3,2 это для распознавания типа карточки...
(см. результат на рис 3,3)

Цитата
После CMD8, в случае illegal command(я получаю именно такой ответ R1=0x05) надо "Test IO flag". А что это за IO flag?


ИМХО: проверить ноги ввода вывода... (1 или 0)

Цитата
Причем насчет формата CMD8 нашел только вот тут:


А тебе описание её зачем?
(всё равно твоя карта её не держит)

Цитата
Не подскажете, в какой доке посмотреть насчет CMD8?


Искать новые доки в старых нет....

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

У тебя ещё свежие доки есть?
Rudolph
Схема подключения в точности такая, как в прикрепленном файле. Только выкинута флешка АТ25ххх, и SFRM напрямую заведен на вывод 1 карточки. Так же нет WP1, WP2 и CP1, CP2. 8 и 9-й контакты, как на этой схеме - на +3.3 заведены через сопротивление.

Цитата
Где нарисована последовательность CMD0 - > CMD1 - > работаем с SPI


Это-то работает. Получаю 0х00 в конце концов.

Схема:
QuickWitted
Цитата(Rudolph @ Aug 14 2007, 13:32) *
Схема подключения в точности такая, как в прикрепленном файле.


Это вэб сервер/пингер/или переходник Lan-RS232 ?

Цитата
Это-то работает. Получаю 0х00 в конце концов.


А в чём вопрос тогда?


Цитата(Rudolph @ Aug 14 2007, 13:32) *
Схема:


Если сервер то тебе хардварный интерфейс делать надо...
(иначе со скоростью впритык)
Angelborn
Часто встречаю в нете проблему, собственно и у меня она была.
Карточки SD, что мне попадались, не хотят отдавать блок данных, размером более 512 байт. Получается, что CMD16 для них не актуальна? Это у всех так?
Rudolph
Цитата(QuickWitted @ Aug 14 2007, 20:45) *
Это вэб сервер/пингер/или переходник Lan-RS232 ?

Если сервер то тебе хардварный интерфейс делать надо...


Нет-нет. Просто схему подключения SD card оттуда срисовали и все.
QuickWitted
Цитата(Rudolph @ Aug 15 2007, 14:03) *
Нет-нет. Просто схему подключения SD card оттуда срисовали и все.


Схема неахти...
(не экономно для мобильных устройств и есть возможность спалить флешу...)

Ниже привожу свою... (по экономичности такая же, но с защитой лучше...)
Нажмите для просмотра прикрепленного файла

А твой агрегат что делает? (у меня на промежуточном этапе вышел бук ридер)

Сейчас вроде уже освоился с флешами...
У меня иногда проявляется следующий баг:
При включении (1/10) карта инициализируется, но считывается с неё
мусор... повторная инициализация проблему не решает...

второй вариант как получить этот баг:

вставляем карту после включения...
инициализируем и в ответ мусор... Это что?

(Инициализация после включения вручную ~ через 10 сек...)

А как у вас?
Rudolph
Я не схемотехник, работаю с тем, что нарисовано другими. smile.gif Но за схему - спасибо, покажу кому надо.

У меня задача скидывать на SD card короткие сообщения, порядка десятков байт. Частота - раз в 10 секунд, не более. Но в общем случае - в случайное время. SD будет выниматься только в том случае, если она неисправна. То есть, как поставили при изготовлении девайса, так и стоит там всю жизнь.

Вышеописанного бага у меня нет. Есть другой - если я просто подаю питание на девайс с вставленной SD - то ее не инициализировать никакими силами. Жмешь кнопку ресета EP9302 - все сразу нормально работает. Но это, наверное особенности схемотехники - ошибка где-то.
Rudolph
Вот есть такой интересный баг:

Пишу блок 512 байт.
Читаю его же, сравниваю. И всегда получаю отличие 448-го и 449-го байтов. Что за хрень? Пока ничего не нашел, почему бы это так.
QuickWitted
Цитата(Rudolph @ Aug 16 2007, 14:23) *
Я не схемотехник, работаю с тем, что нарисовано другими. smile.gif Но за схему - спасибо, покажу кому надо.


Ну тогда полный вариант:

Нажмите для просмотра прикрепленного файла wink.gif

Более экономичный и быстродействующий
QuickWitted
Сегодня проверил с SD_Micro от Kingston на 64 МБ.
Данная последовательность команд (смотри топик выше) с ней работает!!!
QuickWitted
Кто плавал посоветуйте!!!

Как вычислять CRC16?
Или что скармливать вместо CRC в конце CMD24 ?
Rudolph
http://www.maxim-ic.com/appnotes.cfm/an_pk/4068

Там очень подробно про CRC7 ( раздел Cyclic Redundancy Check ) и в конце про CRC16.
QuickWitted
Цитата(Rudolph @ Aug 20 2007, 18:15) *
Там очень подробно про CRC7 ( раздел Cyclic Redundancy Check ) и в конце про CRC16.


Откопал в приведённой доке следующее:
59 (0x3B) CRC_ON_OFF Only Bit 0 R1 Argument sets CRC on (1) or off (0).

Ты случаем не сталкивался с работой команды 59
(она отключает только проверку или и саму выдачу CRC?)
Angelborn
Цитата(QuickWitted @ Aug 21 2007, 07:08) *
Откопал в приведённой доке следующее:
59 (0x3B) CRC_ON_OFF Only Bit 0 R1 Argument sets CRC on (1) or off (0).

Ты случаем не сталкивался с работой команды 59
(она отключает только проверку или и саму выдачу CRC?)


Я тоже хотел отключить это CRC, уж больно оно мне мешало, но как оказалось, оно по умолчанию и выключено, т.е. CMD59 включает проверку CRC. Только вот кому это надо? Лучше её не трогать.
Rudolph
По умолчанию в режиме SPI проверка CRC отключена, то есть мы должны отправить правильный CRC7 только с первоq командой - CMD0 (там считать ничего не надо - все известно заранее). То есть, байты CRC7 и CRC16 надо отправлять и получать, но на содержимое забить. я 0xFF отправляю.

CMD59 может включить/отключить этот режим. Я на всякий случай подаю CMD59 - мало ли что там производителю SD card взбредет в голову.
QuickWitted
Цитата(Angelborn @ Aug 21 2007, 11:39) *
Я тоже хотел отключить это CRC, уж больно оно мне мешало, но как оказалось, оно по умолчанию и выключено, т.е. CMD59 включает проверку CRC. Только вот кому это надо? Лучше её не трогать.


Дело не в этом просто у меня иногда карточка мусором сыпет...
Хочу в качестве проверки... (его включать не надо она его и так выдаёт при чтении)

Откопал на китайском сайте исходник ОДНО НО
то что карточка возвращает с этим CRC не совпадает sad.gif

оригинал в файле Нажмите для просмотра прикрепленного файла

;**************************************************
;CRC16
;**************************************************

Mat_CRC16:
lds R16_Tmp1, SPI_Blo1 ; Настроим счётчик
mov R10_Racht, R16_Tmp1 ; Нам нужен блок длиной в SPI_Blo1 и SPI_Blo0
lds R16_Tmp1, SPI_Blo0
mov R09_Racht, R16_Tmp1

; LDI R18, $FF ; Предустановка значения
; LDI R19, $FF

clr R18
clr R19

ldi Xl, low(SpiMas) ; Укажем на память
ldi Xh, high(SpiMas)

rjmp CRC_LoopEnd ; Перейдём к исполнению
CRC02:
LD R16, X+
EOR R18, R16
LDI R17, $9
CRC03:
DEC R17
BREQ CRC05
CLC
ROR R19
ROR R18
CRC04:
BRCC CRC03
LDI R16,1
EOR R18,R16
LDI R16,$A0
EOR R19,R16
RJMP CRC03
CRC05:

ldi R16_Tmp1, 1 ; Уменьшим счётчик циклов на 1
sub R09_Racht,R16_Tmp1
sbc R10_Racht,R01_Tut0

CRC_LoopEnd:
mov R16_Tmp1,R09_Racht
or R16_Tmp1,R10_Racht
brne CRC02 ; Если не всё получили - повторим

STS SPI_CRCL, R18 ; Закатаем результат
STS SPI_CRCH, R19

RET
QuickWitted
Цитата(Rudolph @ Aug 21 2007, 14:37) *
CMD59 может включить/отключить этот режим. Я на всякий случай подаю CMD59 - мало ли что там производителю SD card взбредет в голову.


В общих чертах у тебя последовательность команд какая?
QuickWitted
Случаем никто ФАТ не ковырял? Как вычислить номер блока – соответствующий началу размещения файлов? И как вычислить объём флеши (т.е. максимальный адрес) ?

Я использую предформатирование - Т.е. закатываю на флешу файл, а после
его изменения сливаю на комп...

В этом случае я просто ломился по адресу 00045000 и попадал на начало файла,
но как недавно обнаружилось у некоторых флешей начало файла может быть другим...
(например с 00044E00)...
Rudolph
Цитата(QuickWitted @ Aug 22 2007, 07:24) *
В общих чертах у тебя последовательность команд какая?


В данный момент такая:

0. Частота SPI < 400 kHz

1. 100 байтов 0xFF, что б уж точно хватило.
2. CMD0 до тех пор, пока не получу 0х01, с таймаутом конечно.
3. CMD55.
- Если ответ на CMD55 == 0x01, то это SD и далее CMD41 до тех пор, пока не получу 0х00
- Если ответ на CMD55 == illegal command, то это MMC и далее CMD1 до тех пор, пока не получу 0x00

4. Выставляю частоту SPI на макс., т.е. 3.7 МГц

Все, теперь работаю с карточкой. Конечно надо еще сделать анализ всех битов в ответах (R1, например) и т.д.

Запись, чтение и стирание проходят нормально.

Насчет FAT-ов я надеюсь на Windows CE. Там все это есть, так что, надеюсь, мне только придется написать аппаратно-зависимый драйвер SPI.

Ох, забфл совсем, после пункта 4 идет:

5. CMD59 arg = 0
6. CMD16 arg = 512
7. CMD9 arg=0 - получить регистр CSD.

Вот пока с регистром CID только непонятки какие-то. Не получить его, но, наверное, я что-то неправильно делаю - будем разбираться.
QuickWitted
Цитата(Rudolph @ Aug 27 2007, 19:16) *
7. CMD9 arg=0 - получить регистр CSD.
Вот пока с регистром CID только непонятки какие-то. Не получить его, но, наверное, я что-то неправильно делаю - будем разбираться.


У меня ОДНА последовательность на CID и CSD...
(разница только в команде)
Вчера возился с алгоритмом расчёта объёма карты...
Одно НО у меня получается 30 метров с хвостиком вместо 32х twak.gif

32 mb
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

8C 26 01 2A 0F 59 01 E9 F6 D9 83 E3 92 40 40 D3 - CID
15 00 00 30 30 30 30 30 30 09 B3 00 9B 9A 28 E3 - CSD

09 - Read_Bl_Len 59 => 9
07 - Sector_Size 83 E3 => 10.000011 1.1100011 => 0000111 => 07
07 - старший байт C_Size 01 E9 F6 => 000000.01 11101001 11.110110 => 07 A7 => 07
A7 - младший байт C_Size => A7
03 - C_Size_mult D9 83 => 110110.01 1.0000011 => 011 => 03
> OK.

mult = 2^(c_size_mult + 2) = 2^(3+2) =32
block_len = 2^read_bl_len = 2^9 =512
block_nr = (c_size + 1) * mult = 07A8h*32d =62720
Capacity = block_len * block_nr =62720*512 =32112640 = 30,625 mb
Rudolph
Дык реальный объем всегда меньше. Все правильно.
QuickWitted
Цитата(Rudolph @ Aug 28 2007, 16:50) *
Дык реальный объем всегда меньше. Все правильно.


Перефразирую:
Надо что-бы на экране писалось 32, 64, и т.д.
как подправить формулу пересчёта?
(табличный метод не хочу)
Rudolph
ИМХО искать ближайшее из константных значений (32, 64, 128...) и его выводить.
QuickWitted
Цитата(Rudolph @ Aug 27 2007, 19:16) *
В данный момент такая:

//// Сгрызли мыши ////

6. CMD16 arg = 512
7. CMD9 arg=0 - получить регистр CSD.


почему не наоборот?
(объём, скорость, и размер макс блока вычисляется в CMD9)
и на мой взгляд логично поднимать частоту ПОСЛЕ CMD9

Кстати интересный вопрос - А как вычислить скорость по CMD9?
(где лежит, знаю, а математику приведения/вычисления реальной- нет)
DL36
Думаю полезная ссылка будет FAT хороший перевод.

Вот и описание MBR, нашлось.Нажмите для просмотра прикрепленного файла Думаю будет полезным.
Rudolph
Цитата(QuickWitted @ Aug 31 2007, 08:44) *
почему не наоборот?
(объём, скорость, и размер макс блока вычисляется в CMD9)
и на мой взгляд логично поднимать частоту ПОСЛЕ CMD9



Да, конечно, правильнее проверить CSD сначала и подавать CMD16 только, если это надо.
QuickWitted
В файловой системе основной единицей является кластер.
Кластер состоит из секторов, а сектор имеет длину в N байт.
Файл записанный на диск занимает какое-то ЦЕЛОЕ кол-во кластеров.

В фат все значения идут младшим вперёд

На диске в начале идёт сектор который называют "boot сектор",
"reserved sector" или "0th sector," но главное лишь то,
что это первый сектор на диске.

Смещение от начала диска в блоках на ??? это 4-х байтовое значение
в нулевом секторе, начиная с позиции 1C6h.

1) Вычислить место нахождение ??? считав НУЛЕВОЙ блок и обработав 4 байта
начиная со смещения 1C6h

загрузочная запись раздела начинается с = 00 00 00 20
-------------------------------------------------------------------------------------
Пример:
01С0 01,00,04,01,E0,D4,20,00,00,00,DF,F4,00,00,00,00
^^1bayt
-------------------------------------------------------------------------------------

2) Считать этот блок


3) Выделить 2 байта по смещению 0Bh
Количество байтов в секторе = 07 00
-------------------------------------------------------------------------------------
Пример:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 F8,FF,FF,FF,03,00,04,00,05,00,06,00,07,00,08,00
^^1bayt
-------------------------------------------------------------------------------------

4) Выделить 2 байта по смещению 0Eh
Количество зарезервированных секторов = 00 08
-------------------------------------------------------------------------------------
Пример:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0000 F8,FF,FF,FF,03,00,04,00,05,00,06,00,07,00,08,00
^^1bayt
-------------------------------------------------------------------------------------

5) Выделить 1 байт по смещению 10h
Количество копий FAT = 02
-------------------------------------------------------------------------------------
Пример:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00
^^1bayt
-------------------------------------------------------------------------------------

6) Выделить 2 байта по смещению 11h
Количество возможных записей в корневом каталоге = 02 00
-------------------------------------------------------------------------------------
Пример:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00
^^1bayt
-------------------------------------------------------------------------------------

7) Выделить 2 байта по смещению 16h
Секторов на FAT = 00 F3
-------------------------------------------------------------------------------------
Пример:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0010 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00
^^1bayt
-------------------------------------------------------------------------------------

Записи FAT = загрузочная запись раздела + 0Eh (2 байта)
= 20 + 08 = 28h

Записи каталога = записи FAT + (16h (2 байта) * 10h (1 байт))
= 28h + F3*2 = 20Eh

Область данных (кластер 0) = записи каталога + (11h (2 байта)*32/512) в загрузочной записи раздела
= 20E + 200h*32/512 = 20E + 32d = 22E



А начало в 228

В байтах 04 50 00 h
в блоках 02 28 h



Blok 0200
> Adres00000000

00A0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00B0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00C0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00D0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00E0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00F0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0100 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0110 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0120 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0130 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0140 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0150 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0160 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0170 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0180 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0190 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01A0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01B0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01C0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01D0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01E0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
01F0 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0200 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0210 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0220 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0230 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0240 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0250 00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,01 [#128]
0260 01,00,04,01,E0,D4,20,00,00,00,DF,F4,00,00,00,00
0270 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0280 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
0290 00,00,00,00,00,00,00,00,00,00,00,00,00,00,55,AA U[#170]

> OK.


>>>>>>>>>>>
> Blok 0200
> Adres00004000

00A0 EB,3C,90,4D,53,44,4F,53,35,2E,30,00,02,01,02,00 <[#144]MSDOS5.0
00B0 02,00,02,DF,F4,F8,F3,00,3F,00,FF,00,20,00,00,00 ?
00C0 00,00,00,00,00,00,29,4B,C8,5F,F0,4E,4F,20,4E,41 )K _ NO NA
00D0 4D,45,20,20,20,20,46,41,54,31,36,20,20,20,33,C9 ME FAT16 3
00E0 8E,D1,BC,F0,7B,8E,D9,B8,00,20,8E,C0,FC,BD,00,7C [#142] [#188] {[#142] [#142] [#189]|
00F0 38,4E,24,7D,24,8B,C1,99,E8,3C,01,72,1C,83,EB,3A 8N$}$[#139] [#153] <r[#131] :
0100 66,A1,1C,7C,26,66,3B,07,26,8A,57,FC,75,06,80,CA f[#161]|&f;&[#138]W u[#128]
0110 02,88,56,02,80,C3,10,73,EB,33,C9,8A,46,10,98,F7 [#136]V[#128] s 3 [#138]F[#152]
0120 66,16,03,46,1C,13,56,1E,03,46,0E,13,D1,8B,76,11 fFVF [#139]v
0130 60,89,46,FC,89,56,FE,B8,20,00,F7,E6,8B,5E,0B,03 `[#137]F [#137]V [#139]^
0140 C3,48,F7,F3,01,46,FC,11,4E,FE,61,BF,00,00,E8,E6 H F N a[#191]
0150 00,72,39,26,38,2D,74,17,60,B1,0B,BE,A1,7D,F3,A6 r9&8-t`[#177][#190][#161]} [#166]
0160 61,74,32,4E,74,09,83,C7,20,3B,FB,72,E6,EB,DC,A0 at2Nt[#131] ; r [#160]
0170 FB,7D,B4,7D,8B,F0,AC,98,40,74,0C,48,74,13,B4,0E }[#180]}[#139] [#172][#152]@tHt[#180]
0180 BB,07,00,CD,10,EB,EF,A0,FD,7D,EB,E6,A0,FC,7D,EB [#187] [#160] } [#160] }
0190 E1,CD,16,CD,19,26,8B,55,1A,52,B0,01,BB,00,00,E8 &[#139]UR[#176][#187]
01A0 3B,00,72,E8,5B,8A,56,24,BE,0B,7C,8B,FC,C7,46,F0 ;r [[#138]V$[#190]|[#139] F
01B0 3D,7D,C7,46,F4,29,7D,8C,D9,89,4E,F2,89,4E,F6,C6 =} F )}[#140] [#137]N [#137]N
01C0 06,96,7D,CB,EA,03,00,00,20,0F,B6,C8,66,8B,46,F8 [#150]} [#182] f[#139]F
01D0 66,03,46,1C,66,8B,D0,66,C1,EA,10,EB,5E,0F,B6,C8 fFf[#139] f ^[#182]
01E0 4A,4A,8A,46,0D,32,E4,F7,E2,03,46,FC,13,56,FE,EB JJ[#138]F2 F V
01F0 4A,52,50,06,53,6A,01,6A,10,91,8B,46,18,96,92,33 JRPSjj[#145][#139]F[#150][#146]3
0200 D2,F7,F6,91,F7,F6,42,87,CA,F7,76,1A,8A,F2,8A,E8 [#145] B[#135] v[#138] [#138]
0210 C0,CC,02,0A,CC,B8,01,02,80,7E,02,0E,75,04,B4,42 [#128]~u[#180]B
0220 8B,F4,8A,56,24,CD,13,61,61,72,0B,40,75,01,42,03 [#139] [#138]V$ aar@uB
0230 5E,0B,49,75,06,F8,C3,41,BB,00,00,60,66,6A,00,EB ^Iu A[#187]`fj
0240 B0,4E,54,4C,44,52,20,20,20,20,20,20,0D,0A,52,65 [#176]NTLDR Re
0250 6D,6F,76,65,20,64,69,73,6B,73,20,6F,72,20,6F,74 move disks or ot
0260 68,65,72,20,6D,65,64,69,61,2E,FF,0D,0A,44,69,73 her media. Dis
0270 6B,20,65,72,72,6F,72,FF,0D,0A,50,72,65,73,73,20 k error Press
0280 61,6E,79,20,6B,65,79,20,74,6F,20,72,65,73,74,61 any key to resta
0290 72,74,0D,0A,00,00,00,00,00,00,00,AC,CB,D8,55,AA rt[#172] U[#170]
QuickWitted
По фат открыл новую тему:
http://electronix.ru/forum/index.php?showtopic=36216
QuickWitted
Результаты разработки выложил на свой сайт.

Конструкция
http://www.sword.greenline.ru/BookReader.html

Как я фат ковырял
http://www.sword.greenline.ru/MSFat.html

Чем заливать
http://www.sword.greenline.ru/Pony.html
QuickWitted
Цитата(QuickWitted @ Oct 24 2007, 09:55) *
Результаты разработки выложил на свой сайт.


В связи с труднодоступностью сервера сделал зеркало...

Конструкция
http://www.swordgreenline.narod.ru/BookReader.html

Как я фат ковырял
http://www.swordgreenline.narod.ru/MSFat.html

Чем заливать
http://www.swordgreenline.narod.ru/Pony.html
Aesthete Animus
Подскажите, в чем причина.
Карточка (SD ver1 16MB) вполне корректно инициализируется. После этого даю комманду чтения (CMD17), получаю верный responce равный 0x00. Проверка CRC включена, так что комманда доходит совершенно верно (проверял). Но token вместо ожидаемого 0xFE стабильно равен 0x01.

В общем, имею тако лог работы:
Код
send_cmd(CMD = 0, arg = 0x00000000) = 01 crc = 0x95
send_cmd(CMD = 59, arg = 0x00000001) = 01 crc = 0x83
send_cmd(CMD = 8, arg = 0x000001AA) = 05 crc = 0x87
send_cmd(CMD = 55, arg = 0x00000000) = 01 crc = 0x65
send_cmd(CMD = 41, arg = 0x00000000) = 01 crc = 0xE5
send_cmd(CMD = 55, arg = 0x00000000) = 01 crc = 0x65
send_cmd(CMD = 41, arg = 0x00000000) = 00 crc = 0xE5
send_cmd(CMD = 16, arg = 0x00000200) = 00 crc = 0x15
send_cmd(CMD = 17, arg = 0x0002E800) = 00 crc = 0xC1
token = 0xFF
token = 0xFF
token = 0xFF
token = 0x01
QuickWitted
Цитата(Aesthete Animus @ Dec 24 2007, 16:04) *
Подскажите, в чем причина.
Карточка (SD ver1 16MB) вполне корректно инициализируется. После этого даю комманду чтения (CMD17), получаю верный responce равный 0x00. Проверка CRC включена, так что комманда доходит совершенно верно (проверял). Но token вместо ожидаемого 0xFE стабильно равен 0x01.


Во во я не один такой...
Ответ начинается НЕ КРАТНО 8 бит!!!

0xFE = 11111110

Лови софтой первый ноль и переходи на Харду...
zltigo
Цитата(Aesthete Animus @ Dec 24 2007, 12:04) *
Но token вместо ожидаемого 0xFE стабильно равен 0x01.

Полагаю, что это не token. Это Responce. Причем совершенно нормальный - R1_IDLE_STATE и никаких ошибок.
Признак получения ответа это
бит
#define R1_NOTVALID 0x80
равный 0

дальше разбор ошибок:
#define R1_OK 0x00
#define R1_IDLE_STATE 0x01
#define R1_ERASE_RST 0x02
#define R1_ILLEGAL_CMD 0x04
#define R1_CRC_ERROR 0x08
#define R1_ERASE_ERROR 0x10
#define R1_ADD_ERROR 0x20
#define R1_PARAM_ERROR 0x40
#define R1_NOTVALID 0x80

И можете гнать 0xFF до полученя уже token



Цитата(QuickWitted @ Jan 8 2008, 11:41) *
Ответ начинается НЕ КРАТНО 8 бит!!!

Разумеется нет. Ну последующий "совет" совершенно вредный.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.