Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с SD card
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sergeeff
Коллеги!

Для теста купил карту Extrememory Allround 2 Gb. У нее оказался блок = 1024 байта. Соответственно библиотека EFSL не работает. Как решать проблему? Я так понимаю, что с ростом обьемов карт и скоростей обмена могут и другие обьемы блоков быть.
etoja
Карта на заводе сформатирована под FAT32. Сформатируй под FAT16. Для этого п Проводнике виндоуз
нажми правую кнопку мыши, выбери Форматировать, а затем FAT.
Самые правильные и надёжные карты памяти делает фарма Transcend.
ivstech
Цитата(etoja @ Mar 16 2007, 10:08) *
Самые правильные и надёжные карты памяти делает фарма Transcend.

Кроме того Transcend продает карты памяти, произведенные фирмой Hitachi (HB.....) со своей наклейкой. Опасайтесь подделок! smile.gif
etoja
Сплетни не нужны.
ivstech
Цитата(etoja @ Mar 16 2007, 10:34) *
Сплетни не нужны.

Какие могут быть сплетни. Мне ответил представитель фирмы Transcend на мой вопрос, почему у меня такая карточка, что они транснациональная компания и такое возможно
sergeeff
Переформатировать попробую в понедельник.
Два вопроса попутно.

1. Нет ли какокй-нибудь специализированной программы для форматирования SD card, типа той, что написала Panasonic и в которой можно задавать параметры. В том числе размер блока?

2. Насчет Transcenda. У меня есть их карточка 1Gb. Результаты под EFSL на at91rm9200:

Kinston 512 Mb : read - 1530 Kb/s , write - 167 Kb/s.
Transcend 1 Gb : read - 867 Kb/s , write - 7 Kb/s ( это не опечатка, пока не понял в чем тут дело).

В обоих случаях писался/читался файл 6 Mb.
sonycman
Цитата(etoja @ Mar 16 2007, 08:08) *
Карта на заводе сформатирована под FAT32. Сформатируй под FAT16. Для этого п Проводнике виндоуз
нажми правую кнопку мыши, выбери Форматировать, а затем FAT.
Самые правильные и надёжные карты памяти делает фарма Transcend.

Извиняюсь за глупый вопрос.
Собираюсь вот тоже освоить работу с MMC или SD картой памяти объёмом от 2 гигов. Пока слабо представляю себе как это всё делается. blink.gif
Интересно, карту можно отформатировать под различный размер блока (512 байт, 1024 и, наверное, другие)? Ну а при этом низкоуровневый процесс обмена данными по SPI между картой и микроконтроллером будет каким? Только блоками по 512 байт или любой другой длины? Есть ли какие-то стандарты на такой интерфейс?
ivstech
Цитата(sonycman @ Mar 17 2007, 01:52) *
Интересно, карту можно отформатировать под различный размер блока (512 байт, 1024 и, наверное, другие)? Ну а при этом низкоуровневый процесс обмена данными по SPI между картой и микроконтроллером будет каким? Только блоками по 512 байт или любой другой длины? Есть ли какие-то стандарты на такой интерфейс?

Очевидно, речь идет о размере кластера, или все-таки о размере блока(аналогично сектору на жестком диске)? На жестких дисках размер сектора всегда 512 байтов. Для MMC карточки есть команда SET_BLOCK_LENGTH. Таким образом можно проверить, какие размеры блоков карточка поддерживает.
Был вопрос насчет маленькой скорости записи - попробуйте использовать команду вроде MULTIPLY_WRITE (название точно не помню) для последовательной записи нескольких блоков.
sergeeff
Для прояснения. Ну да, наверное, правильнее сказать не размер блока, а размер сектора. Хотя в терминологии SD card - это именно блок.

1. Ситуация на практике такова. Купил карту. Она уже отформатирована (на заводе). Вставил в компьютер - записал, чего хотел.

2. Вытащил из компьютера. Вставил в некое устройство, реализованное на каком-то процессоре, где нет никакой OS. Надо файл открыть, прочитать, закрыть.

3. В такой ситуации, на мой взгляд, нет никакой возможности как-то корректировать этот размер блока. Он уже задан и с такими его значениями информация и была записана.

4. Соответственно, единственное, что напрашивается, это адаптироваться к условиям нефиксированного размера этого блока.

5. Вариант переформатирования карты до ее использования - не лучший. Всегда найдется кто-то и этого не сделает. Соответственно важна задача совместимости с другими системами.

6. Насчет скорости записи. Подозрительно, когда отличие в скорости не в 2-3 раза, а почти в 25 раз. На мой взгляд, дело не в мультиблоковой записи, а в чем-то другом.
elfsoft
Здесь явно идёт речь о блоке на SD-карте (аналог сектора на HDD). То есть это единица, которая, в общем случае, к логическому формату и файловой системе не имеет отношения. Я столкнулся с такой же проблемой - при попытке использования 2-гиговой SD-карточки (с размером блока 1024 байта) выяснил, что AT91RM9200 неправильно читает 1024-байтные блоки - в старших 512 байтах читается ерунда (в смысле, даже не нули, а просто иногда что-то случайное). И, похоже, неправильно себя ведёт именно контроллер SD/MMC в Атмеле.
..пока просто запретил заказчику использовать в моём проекте карточки объёмом больше 1ГБ smile.gif Хотел попробовать посмотреть, как будет себя вести карточка и контроллер, если к ней обращаться в режиме SPI, но это в любом случае меня не устраивает, т.к. сильно медленная скорость для моего случая получится.
ЗЫ Насколько мне известно, размер блока в SD-карточках поменять/перешить нельзя sad.gif На всех карточках размером от 32 МБ до 1 ГБ включительно, которые мне попадплись в руки, размер блока был 512 байт. Кстати, может и с этим связано то, что некоторые картридеры (обычные комповые usb-шные) не хотят работать с 2 и 4-гиговыми SD (не SDHC) картами.
MiniMax
Цитата(elfsoft @ Oct 30 2007, 18:35) *
ЗЫ Насколько мне известно, размер блока в SD-карточках поменять/перешить нельзя sad.gif На всех карточках размером от 32 МБ до 1 ГБ включительно, которые мне попадплись в руки, размер блока был 512 байт. Кстати, может и с этим связано то, что некоторые картридеры (обычные комповые usb-шные) не хотят работать с 2 и 4-гиговыми SD (не SDHC) картами.

Самое простое это считать и декодировать CSD регистр. Там есть вся информация
elfsoft
Цитата(MiniMax @ Oct 30 2007, 18:50) *
Самое простое это считать и декодировать CSD регистр. Там есть вся информация

Ну, собственно, GetCSD я чуть ли не в первую очередь делаю - мне ж нужно знать, что у меня за карточка запихнута smile.gif (я на ней свою FAT16/32-библиотечку использую). Именно когда у меня начались проблемы с большими карточками, я и начал копать, кто виноват, я и накнулся, что дело именно в 1024-байтном секторе. Сначала было подумал, что FAT-овская библиотечка глючит, но потом, когда полез глубже/на более низкий уровень, увидел, что творится при чтении/записи блоков. "С помощью лома и какой-то матери" (с) заставить читаться/писаться эту карточку правильно не получилось sad.gif
PS. Эх, жаль, что поле READ_BLOCK_LENGTH в CSD - Read-Only.. а так бы поменял размер - и нет проблем! smile.gif (ну ладно, это я уже несерьёзно... хотя в том же DataFlash-е можно один раз в жизни (жизни этого DataFlash-а smile.gif ) поменять размер сектора с 528 на 512 байт, но это, всё-таки, чуть-чуть другой случай)
MiniMax
Цитата(elfsoft @ Oct 31 2007, 11:37) *
дело именно в 1024-байтном секторе. Сначала было подумал, что FAT-овская библиотечка глючит, но потом, когда полез глубже/на более низкий уровень, увидел, что творится при чтении/записи блоков.

Самое простое - это подлатать немного драйвер ( то место , где идет запись/чтение 512 байтового сектора в очередной блок данных карточки) используя кэширование. Другими словами,
имеем буфер на 1024 байт в RAM, который отображается на два соседних 512-byte сектора FAT.
При попытке записи 1-го сектора копируем его только в 1024-байт RAM буфер. Реальную запись делаем только при заполненном 1024-байт буфере. Если очередной записываемый сектор не отображается на 2-й сектор RAM буфера, то cчитать его с SD и закончить операцю записи предыдущего блока. И т.д.
elfsoft
Цитата(MiniMax @ Oct 31 2007, 11:00) *
Самое простое - это подлатать немного драйвер ( то место , где идет запись/чтение 512 байтового сектора в очередной блок данных карточки) используя кэширование. Другими словами,
имеем буфер на 1024 байт в RAM, который отображается на два соседних 512-byte сектора FAT.
При попытке записи 1-го сектора копируем его только в 1024-байт RAM буфер. Реальную запись делаем только при заполненном 1024-байт буфере. Если очередной записываемый сектор не отображается на 2-й сектор RAM буфера, то cчитать его с SD и закончить операцю записи предыдущего блока. И т.д.

Не, ну так естественно, что я так и делаю!.. smile.gif (тем более, что у меня в большинстве случаев приходится работать с целыми кластерами, которые часто по нескольку килобайт).
Проблема тут находится "ниже" и состоит в том, что если просто, не глядя на файловую систему и т.д., в "сыром" режиме попробовать взять и прочитать или записать 1024-байтный блок, то при чтении в верхних 512 байтах лежит туфта вместо данных (при этом старые данные - те, что были в памяти, - затираются), а при записи блок тоже портится. Под туфтой я имею ввиду довольно много нулей с изредка попадающимися ненулевыми битами.
ЗЫ Правда тут у меня очень нехорошее предположение возникло.. попробую-ка я при случае (сейчас плата недоступна) точно повыключить весь кэш и т.д. Хотя, может, я это уже и пробовал делать.. с другой стороны, если б это из-за кэша было, то тогда бы и с 512-байтными секторами глюки вылазили бы..
MiniMax
Цитата(elfsoft @ Nov 6 2007, 11:40) *
ЗЫ Правда тут у меня очень нехорошее предположение возникло.. попробую-ка я при случае (сейчас плата недоступна) точно повыключить весь кэш и т.д. Хотя, может, я это уже и пробовал делать.. с другой стороны, если б это из-за кэша было, то тогда бы и с 512-байтными секторами глюки вылазили бы..


Я говорил не про FAT кэширование, а про низкоуровневое SD кэширование,
которе надо добавитьь для поддержки новых карт.
Это принципиально разные вещи.
Calculator
В начале работы с карточкой подается команда установки размера используемого блока (CMD16, SET_BLOCKLEN). Скорее всего это делает библиотечная процедура и устанавливает размер 512 байт.
elfsoft
Цитата(MiniMax @ Nov 6 2007, 11:08) *
Я говорил не про FAT кэширование, а про низкоуровневое SD кэширование,
которе надо добавитьь для поддержки новых карт.
Это принципиально разные вещи.

Не-не-не, я тут уже вообще забыл про FAT и говорил исключительно про обмен с SD-карточкой.
А кэш я имел ввиду процессорный (I- и D-cache) - просто подумалось, вдруг это из-за неправильной работы MCI DMA при включенном кэше (хотя я уже проверил - кэш данных у меня всё равно выключен, кэш команд вроде как на это влиять не должен, но и его я тоже выключал, результат тот же).
Короче, проблема остаётся - прочитать с SD-шки (правильно, само собой) или записать сектор (блок) размером больше 512 байт (т.е. если у SD-шки блок больше 512 байт) пока не представляется возможным sad.gif Эх.

PS Вот что появляется в памяти при попытке чтения 1024-байтного блока: (на всякий случай - пугаться насчёт перевёрнутых DWORD-ов в boot-секторе не надо)
Первые 512 байт - такие, какие и должны быть. Интересно, что в байтах 0x200-0x207 что-то почти осмысленное, потом всегда идут FF-ки. Но это самое "осмысленное" на самом деле нигде на флэшке не встречается (сканировал всю флэшку))
Total SDCard capacity = 2032664576 bytes
MaxReadDatablock = 1024
MaxWriteDataBlock = 1024
Sector size = 32
Read partial = true
WritePartial = false
ReadBlockMisalignment = false
WriteBlockMisalignment = false
sectorsize=1024, addr2read=0, offs=0
was read:
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001B0 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 ................
000001C0 3F 06 00 3D 00 F9 D7 FF 89 07 00 00 00 00 00 3C ?..=.ù×ÿ‰......<
000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000001F0 00 00 00 00 00 00 00 00 00 00 00 00 AA 55 00 00 ............ªU..
00000200 33 FB 0B 94 64 3F F2 ED FF FF FF FF FF FF FF FF 3û.”d?òíÿÿÿÿÿÿÿÿ
00000210 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000220 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000230 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000240 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000250 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000260 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000270 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000280 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000290 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000002F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000300 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000310 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000320 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000330 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000340 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000350 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000360 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000370 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000380 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
00000390 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
000003F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
Abo
По моему, поле размера блока в CSD используется лишь для рассчета объема карточки и ни в коем случае не для указания настоящего размера блока, который всегда равен 512 байт. Только таким образом можно объяснить наличие не SDHC карт объемом более 1G. Для SDHC карт размер блока тоже 512 байт, но размер карты в CSD указывается не в байтах а в блоках.
elfsoft
Цитата(Abo @ Nov 30 2007, 00:09) *
По моему, поле размера блока в CSD используется лишь для рассчета объема карточки и ни в коем случае не для указания настоящего размера блока, который всегда равен 512 байт. Только таким образом можно объяснить наличие не SDHC карт объемом более 1G. Для SDHC карт размер блока тоже 512 байт, но размер карты в CSD указывается не в байтах а в блоках.


Всё, таки нашёл, в чём была трабла. Abo, Большое пасиба за подсказку! Я тут полдня писал ответ, попутно проверяя разные вещи, и, в конце концов выяснил, что таки да, с 2/4-гиговой карточкой нужно работать точно так же, как и с обычной (а я зачем-то изначально сделал поддержку 1024-байтных (и более) секторов для больших карточек, думая, что нужно работать такими блоками). Плюс трабла была в READ_MULTIPLE_BLOCK - оно у меня, похоже, неправильно работало. Ответ пришлось стереть smile.gif
Для всех - в Simplified Physical Layer Spec ( http://www.sdcard.org/about/memory_card/pl..._Layer_Spec.pdf ) в пунктах 4.3.2-4.3.4 написано, что, независимо от того, какой размер блока указан в MaxReadDatablock/MaxWriteDataBlock, SetBlockLength всё равно нужно делать не больше, чем 512. И, главное, даже если Read/WriteBlockMisalignment=0, читать/писать с адреса, кратного 512 можно (нельзя читать с совсем произвольного адреса).

Calculator, предположения насчёт размера блока подтолкнули, в общем-то, на правильный путь (только в другую сторону smile.gif )

MiniMax, наши обоюдные предположения ("Самое простое - это подлатать немного драйвер ( то место , где идет запись/чтение 512 байтового сектора в очередной блок данных карточки) используя кэширование. Другими словами, имеем буфер на 1024 байт в RAM, который отображается на два соседних 512-byte сектора FAT. При попытке записи 1-го сектора копируем его только в 1024-байт RAM буфер. Реальную запись делаем только при заполненном 1024-байт буфере. Если очередной записываемый сектор не отображается на 2-й сектор RAM буфера, то cчитать его с SD и закончить операцю записи предыдущего блока. И т.д.") оказались неверными, но, главное, что в конце концов разобрались smile.gif

ЗЫ Всем огромное спасибо!..

ЗЗЫ У кого-нибудь спецификация SDHC есть? Хочется посмотреть, что за зверь такой, и можно ли его заставить работать тут.
MiniMax
Это очень хорошо. Значит и мне не придется ничего латать, когда я перейду на 2GB карты :-)
Abo
Цитата(elfsoft @ Nov 30 2007, 14:41) *
ЗЗЫ У кого-нибудь спецификация SDHC есть? Хочется посмотреть, что за зверь такой, и можно ли его заставить работать тут.


Тут и про SD и про SDHC
sergeeff
Вернувшись после некоторого перерыва к работе с SD. Применил новый вариант драйвера для MCI от Atmel (AT91SAM9263-EK Software Package на http://www.atmel.com/dyn/products/tools_ca...p?tool_id=4227). Все это вместе с efsl благополучно работает с картой в 2 Gb и блоками по 512 bytes.

Однако осталась загадкой фантастически низкая скорость записи в 1 Gb SD Transcend, по-прежнему ок. 7 Kb/s, a чтение ~1 Mb/s. Другие карточки пишутся на 130-150 Kb/s.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.