Перейти к содержанию

    

Подключаю карту SD к AVR. Вот вроде все, пишет, читает, регистры читает и все такое. Но вот возникли вопросы.

 

1. Правельно ли утверждение, что я могу писать в блок/сектор сколько угодно раз без стирания?

2. Если да, то нафига стирание (т. е. зачем сама операция)?

3. Как происходит адресация? Т. е. например в блоке/секторе 512 байт. Если я записываю 512 байт по адресу 0x00000001, то следующие 512 байт "начнуться" с адреса 0x00000001 + 0x00000200 (512) = 0x00000201 (513)?

4. Из регистра CSD судя по SDProdManual для карточек SanDisk можно вытащить информацию обо все параметрах-размерах (размер сектора/блока, их число, число байт => вычислить весь объем карточки). Справедливо ли это для карт прочих производителей? Как узнать объем вставленной карточки?

5. Часть секторов/блоков именуются как write protected. Как узнать об их распределении по адресному пространству карточки, где они расположены? Т. е. я, к примеру, пишу блок/сектор, а потом оказывается что туда нельзя писать, т. к. он защищен.

 

P. S. "блок/сектор" - единица информации, обычно в 512 байт. По непонятным причинам, как я понял, эти совершенно разные понятия конфликтуют в доках на карты SD (блок) и MMC (сектор).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели никто не может помочь? Наверняка кто-нить разобрался как следует...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Неужели никто не может помочь? Наверняка кто-нить разобрался как следует...

Ну,практически сами ответили на свои вопросы. На карточке действительно работа посекторная(блочная) и вычисления так и происходят Nсект*512. В бут секторе есть информация про количество секторов в кластере. Размер кластера увеличивается в прогрессии с обьемом карточки.

В пример

32мб 1сектор в кластере,

64мб 2 сектора в ластере

..........................

2гб 64сектора в кластере

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если Вы давали ответ на 3-й вопрос, то я немного про другое спрашивал... ли не понял ответа. Есть у меня 32 разряда адреса (4 байта из 6-и в команде). Что в тих 32 битах есть что? Т. е. "географически" куда укажет адрес 0x00000001, а куда 0x00000002? Сколько между ними пространства, если иначе. И что такое бут-сектор? Я фат не пользуюсь. Ну и остальные вопросы тоже пока без ответов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1. Правельно ли утверждение, что я могу писать в блок/сектор сколько угодно раз без стирания?

Да.

 

2. Если да, то нафига стирание (т. е. зачем сама операция)?

Для ускорения записи.

 

3. Как происходит адресация? Т. е. например в блоке/секторе 512 байт. Если я записываю 512 байт по адресу 0x00000001, то следующие 512 байт "начнуться" с адреса 0x00000001 + 0x00000200 (512) = 0x00000201 (513)?

512 байт по адресу 0x01 никто записать не позволит. Адреса в байтах, но работать можно только блоками по 512 байт.

 

4. Из регистра CSD судя по SDProdManual для карточек SanDisk можно вытащить информацию обо все параметрах-размерах (размер сектора/блока, их число, число байт => вычислить весь объем карточки). Справедливо ли это для карт прочих производителей? Как узнать объем вставленной карточки?

CSD одинаков для всех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5. Часть секторов/блоков именуются как write protected. Как узнать об их распределении по адресному пространству карточки, где они расположены? Т. е. я, к примеру, пишу блок/сектор, а потом оказывается что туда нельзя писать, т. к. он защищен.

Т.е. это сбойные секторы?

Я вот подумываю о том, чтоб SD/MMC карточку в качестве таблицы использовать. Т.е. только для чтения. По рассчётам получается, что мне 4 гБайта таблица нужна. И время доступа ограниченное. Если бы сбойных секторов не было, то SD/MMC хорошо подходила бы. По адресу читаешь блок и всё. А так придётся за 2 раза это делать. Сначала таблицу соответствия физических секторов логическим (аналог FAT), а затем уже сами данные.

Или я тут бред полный написал? Я работал с AT45DB642D, так у неё сбойных блоков в принципе не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Или я тут бред полный написал? Я работал с AT45DB642D, так у неё сбойных блоков в принципе не было.

Сбойные сектора у SD обрабатываются и маскируются встроенным в карту контроллером.

У AT45 это надо делать руками, Atmel гарантирует только то, что у свежих кристаллов их нет, но это не значит, что они не могут появиться в процессе работы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сбойные сектора у SD обрабатываются и маскируются встроенным в карту контроллером.

Т.е. можно читать не задумываясь о сбойных блоках. И 4 гБайта это размер уже после отбрасывания сбойных блоков? А что такое write protected блоки? Это действительно защищённые от записи? И защита программно не снимается?

У AT45 это надо делать руками, Atmel гарантирует только то, что у свежих кристаллов их нет, но это не значит, что они не могут появиться в процессе работы.

Атмел гарантирует, что сбойные блоки не появятся до 100000 перезаписей. Но для этого после 10000 перезаписей в одной странице надо перезаписать те блоки, которые не перезаписывались за эти 10000 раз. Иначе информация в них повреждена м.б. Для этого и команда специальная есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Т.е. можно читать не задумываясь о сбойных блоках. И 4 гБайта это размер уже после отбрасывания сбойных блоков? А что такое write protected блоки? Это действительно защищённые от записи? И защита программно не снимается?

Ровно 4ГБайта Вам никто не обещает. Реальный объем, конечно, будет заметно меньше.

Write protected блоки устанавливаются и снимаются программно.

 

Атмел гарантирует, что сбойные блоки не появятся до 100000 перезаписей. Но для этого после 10000 перезаписей в одной странице надо перезаписать те блоки, которые не перезаписывались за эти 10000 раз. Иначе информация в них повреждена м.б. Для этого и команда специальная есть.

Гарантии Atmel'а - дело крайне темное. Когда-то число циклов стирания/записи не упоминалось вообще, потом были цифры 10K, 50K...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ровно 4ГБайта Вам никто не обещает. Реальный объем, конечно, будет заметно меньше.

Понял. Придётся брать 8ГБайт SD.

Гарантии Atmel'а - дело крайне темное. Когда-то число циклов стирания/записи не упоминалось вообще, потом были цифры 10K, 50K...

В своё время проверил на 2х AT45DB642D. Пол-года непрерывной циклической записи выдержали. Они пишутся медленнее чем Атмел в своих pdf обещает. Не более 80 кБайт (блоков) в секунду (у AD45DB642D блок = 1 кБайт = 1056 байт если точно). За пол-года наверное 120000 записей набралось, но точно более 100000.

Потом уже сделал счётчик кол-ва записей в блок. Если блок сдохнет можно будет максимальный по всей FLASH узнать. Но пока ещё ни одна не сдохла - заказчики молчат.

 

А вообще 'aaarrr' большое спасибо за ответы. За счёт таблицы в SD - задача, которая раньше сложной казалась, теперь - детский сад.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
512 байт по адресу 0x01 никто записать не позволит. Адреса в байтах, но работать можно только блоками по 512 байт.

Возвращаясь к своему примеру: Если я записываю 512 байт по адресу 0x00000000, то следующие 512 байт "начнуться" с адреса 0x00000000 + 0x00000200 (512) = 0x00000200 (512)? Верно? Странно то, что в адрес 0x00000000 я ничего записать не смог, а вот в 0x00000001 с легкостью. Хотя надо проверить код...

 

Write protected блоки устанавливаются и снимаются программно.

Значит, не на все блоки я могу установить защиту от записи (WP_SET)? Потому как число этих блоков ГОРАЗДО меньше общего числа блоков. Или что-то я не догоняю? И тогда как все-таки они распределены по адресному пространству?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Возвращаясь к своему примеру: Если я записываю 512 байт по адресу 0x00000000, то следующие 512 байт "начнуться" с адреса 0x00000000 + 0x00000200 (512) = 0x00000200 (512)? Верно? Странно то, что в адрес 0x00000000 я ничего записать не смог, а вот в 0x00000001 с легкостью. Хотя надо проверить код...

Адрес следующего бока Вы расчитали верно. Однако, если длина блока 512байт (по умолчанию) то в адрес 0x00000001 запись не идет. Я специально попробовала на своей флэшке. Одрес записи должен начинаться кратно блокам, т.е.0x00000000, 0x00000200, 0x00000400 и т.д. Так ште скорее всего у Вас ошибка в формировании адреса в проге :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь. Ошибка действительно была в моей проге.

 

P. S. SALOME, если это конечно не "сценический образ", :a14: - очень редко встретишь девушку в нашей области, да еще и...

Я специально попробовала на своей флэшке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я нашел программку на си для кодевижена которой от меня требуется только номер сектора и массив из 512 данных.

теперь вопрос как мне узнать диапазон секторов для любой вставленной флешки с которыми можно работать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прочитать документацию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация