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

Задача стирания NAND флешки уже несколько притомила. В большинстве примером (большинство что я увидел на просторах интернета) сводятся к такому коду:
Код
void erase (uint16_t n) // как я понял н это номер блока
{  
  uint16_t addr1;
  uint8 addr2, addr3

  addr1 = n << 6;  // вот тут в каких 6 в каких 5
  addr2 = (uint8_t) (addr1 & 0xFF);
  addr2 = (uint8_t) ((addr1 >> 8) & 0xFF);

// и дальше addr1 и addr2 передаются в команду стирания
}
кто бы доходчиво мог объяснить что делается в данном коде... я не понимаю несколько моментов.
В описание в работе с нанд памятью указано что подаается 3 команды. В которых участвуют адреса блоков, страниц. Но как связан данный код с тем что требуется передать.
Спасибо.
SyncLair
требуется передать адрес... он и передаётся просто он расплющивается в несколько байт... см даташит на микросхему
deplen
получается мы передаем в функцию номер блока, далее номер блока преобразуется в адрес начала и конца блока?...
Если можно то поподробней что делается в тех трех командах
deplen
Может я не особо внятно попробовал задать вопрос..попробую еще раз...
Допустим на вход подается 1. Тобишь первый блок, тогда согласно функции результат сдвига будет 40h или 64 в десятичной. Строка с сдвигом 8 равна 0h.
Ниже распишу что получается:
40h 0h
80h 0h
C0 0h

а дальше
00h 01
40h 01
...
и так далее...тобишь через 4 итерации он изменяет переменную с сдвигом 8, как эти все действия связаны с адресацией NAND.
Прошу помощи в этом я не смог догадаться что все это значит.
SyncLair
давайте по порядку, лучше плясать от исходника.

1. наверное в последней строке addr3 иначе предыдущая строка не имеет смысла

а. номер блока умножается на 64 (значит в одном блоке 64 страницы)

б) номер блока распределяется в две однобайтные переменные

г) они куда то там передаются (вы уверены что передаются addr1 и addr2 )

тогда зачем addr3?????

вы бы глубоко вздохнули и ещё раз написали пример поподробнее
deplen
Цитата(SyncLair @ Dec 5 2012, 20:46) *
давайте по порядку, лучше плясать от исходника.

1. наверное в последней строке addr3 иначе предыдущая строка не имеет смысла

а. номер блока умножается на 64 (значит в одном блоке 64 страницы)

б) номер блока распределяется в две однобайтные переменные

г) они куда то там передаются (вы уверены что передаются addr1 и addr2 )

тогда зачем addr3?????

вы бы глубоко вздохнули и ещё раз написали пример поподробнее


Код
void Erase(uint16 block)
{
    uint32 pageNum
    uint8_t addr1,addr2;
    num = block << 6;
    addr1 = (uint8_t)( num & 0xff );
    addr2 = (uint8_t)( ( num >> 8 ) & 0xff );

    Далее команда на стирание 60h
    Передаем адрес addr1
    Передаем адрес add2
    Вторая команда стирания d0h

    Ожидаем ответ Ready/Bysy пина
}

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

Завтра уже нада что то показывать начальнику, а я в простой адресации не могу разобраться.
aaarrr
Цитата(deplen @ Dec 5 2012, 20:59) *
Завтра уже нада что то показывать начальнику, а я в простой адресации не могу разобраться.

У NAND флеш есть понятия страниц и блоков. Стирание ведется только блоками. Один блок в вашем примере содержит 64 страницы.
Так в чем, собственно, вопрос?
deplen
Цитата(aaarrr @ Dec 5 2012, 21:16) *
У NAND флеш есть понятия страниц и блоков. Стирание ведется только блоками. Один блок в вашем примере содержит 64 страницы.
Так в чем, собственно, вопрос?


да вопрос вобщем то, что делается в данном коде, что я представил выше)
что такое num? что такое addr1, addr2. Примеры того что в отладке при входных данных 1 и 2 приведены.
Я не могу понять что означают данные перменные.
Почему addr1 всегда имеет значения 00h, 40h, 80h, C0h. A addr2 через 4 итерации увеличивается на единицу.

да вопрос вобщем то, что делается в данном коде, что я представил выше)
что такое num? что такое addr1, addr2. Примеры того что в отладке при входных данных 1 и 2 приведены.
Я не могу понять что означают данные перменные.
Почему addr1 всегда имеет значения 00h, 40h, 80h, C0h. A addr2 увеличивается на единицу, после того как addr1 станет снова 00h.

В моем понимании адресация это 0x00010000-0x0001ffff
0x00020000... и так далее...

а как в представленном коде нанд понимает что ему подсвоевывают мне не понятно.
subver
Какой то поток сознания.
Ваш код делает следующее:

Умножает номер блока на 64, чтобы получить номер страницы начала блока.
Затем в переменные addr1 и addr2 раскладываются соответственно младший и старший байт полученного номера.
Потом они передаются как параметр команды.

И причем тут какие то итерации и увеличения?
vladimir_orl
Посмотри даташит на м/с NANDа типа MT29F4G08AAA. Там написано. Там последовательная запись адреса, разбитого на части.


Да, и если тема поднята, скажите, кто знает, по умолчанию SPARE область добавляется при чтении-записи или нет.
deplen
Цитата(subver @ Dec 6 2012, 09:10) *
Какой то поток сознания.
Ваш код делает следующее:

Умножает номер блока на 64, чтобы получить номер страницы начала блока.
Затем в переменные addr1 и addr2 раскладываются соответственно младший и старший байт полученного номера.
Потом они передаются как параметр команды.

И причем тут какие то итерации и увеличения?


Спасибо за исчерпывающий ответ. Я вобщем то к этому и пришел на работе и потом прочитал Ваш комментарий.

Задача решена. Всем отписавшимся спасибо за помощь.

После решения данной проблемы После решения данной задачи возникли следующие:
1)каким способом можно восстановить работоспособность памяти после стирания всех блоков?
2) при подключения, в параллели другого микроконтроллера к "родному" мк SD карточки, будет ли он (родной) как то мешать работе подключенного (тобишь на шину данных выставлять нули или еще какие препятствия)
subver
Цитата(deplen @ Dec 11 2012, 23:36) *
1)каким способом можно восстановить работоспособность памяти после стирания всех блоков?

Никаким. Даташит настоятельно не рекомендует стирать блоки, помеченные как "плохие".
Память при этом будет работоспособна, но выявить сбойные блоки будет сложно.
deplen
Цитата(subver @ Dec 12 2012, 07:59) *
Никаким. Даташит настоятельно не рекомендует стирать блоки, помеченные как "плохие".
Память при этом будет работоспособна, но выявить сбойные блоки будет сложно.


А как насчет низкоуровнего форматирования которое призвано восстановить работоспособность? Оно же как я понимаю записывают необходимую служебную информацию, после которой требуется только записать таблицу например быстрым форматированием Windows.
subver
Цитата(deplen @ Dec 12 2012, 23:20) *
А как насчет низкоуровнего форматирования которое призвано восстановить работоспособность? Оно же как я понимаю записывают необходимую служебную информацию, после которой требуется только записать таблицу например быстрым форматированием Windows.

Низкоуровневоео форматирование призвано стереть все блоки, не более того.
Не стоит равнять SD карту и микросхему NAND памяти.
Контроллер SD карты перед какими либо манипуляциями с данными в чипе NAND памяти проверяет на "корректность" выбраный блок. И если он помечен как "плохой" - то просто игнорирует его.
Если вы стерли все подряд блоки без контроля признака "плохого" блока - остается надеятся, что в данной конкретной микросхеме все блоки вдруг были "живые" перед этим, потому что простыми тестами чтения-записи скорее всего не удастся выявить "плохой" блок быстро.
deplen
Цитата(subver @ Dec 13 2012, 07:31) *
Низкоуровневоео форматирование призвано стереть все блоки, не более того.
Не стоит равнять SD карту и микросхему NAND памяти.
Контроллер SD карты перед какими либо манипуляциями с данными в чипе NAND памяти проверяет на "корректность" выбраный блок. И если он помечен как "плохой" - то просто игнорирует его.
Если вы стерли все подряд блоки без контроля признака "плохого" блока - остается надеятся, что в данной конкретной микросхеме все блоки вдруг были "живые" перед этим, потому что простыми тестами чтения-записи скорее всего не удастся выявить "плохой" блок быстро.


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

Раз низкоуровневое формирование не поможет, тогда может будет возможен такой вариант: слить дамп памяти, стереть NAND ERASE все подряд, и затем залить дамп обратно?

Если и это не поможет то неужели стирание низкого уровня командами нанда - стереть блок, это дорога в один конец и потом карточку нельзя будет использовать?
Flexz
Давайте сначала: что вы подразумеваете под "восстановлением работоспособности"?
deplen
Цитата(Flexz @ Dec 13 2012, 10:06) *
Давайте сначала: что вы подразумеваете под "восстановлением работоспособности"?


Под этим я понимаю возможность работать с карточкой. Ведь в определенных местах памяти хранится служебная информация для работы карты, таблица трансляции. Когда происходит стирание, удаляется все это. Каждое значение в дампе имеет значение FF. следовательно чтобы сделать работоспособной память надо эти служебные данные записать в теже самые места памяти. Или я не правильно понимаю принцип работы ?
GDI
Вроде начинали с микросхем NAND Flash, тогда о какой карточке сейчас речь?
deplen
Цитата(GDI @ Dec 13 2012, 13:35) *
Вроде начинали с микросхем NAND Flash, тогда о какой карточке сейчас речь?


Так, видно нужно полностью описать задачу что я делаю может тогда будет более яснее.
Есть microSD карточка, внутри которой NAND микросхема памяти и свой контроллер. Программируемый мк (LPC) будет встраиваться в паралельную работу между между линиями СД и прямым подсоединеним к микросхеме. Ожидать получения команды и затем полностью стирать микросхему нанда командами 60h-d0h. Вот как связаны нанд и сд.
А теперь собственно вопрос смогу ли я после такого удаления всего что есть на микросхеме работать с ней. Работать это значит записывать, читать, удалять обыкновенным способом для большинства ОС. Как я узнал что не смогу так как потру все что есть на микросхеме нанда, а надо сделать так что бы она была работосособной.

Я узнал о двух возможных способах:
1) это низкоуровневое форматирование (но в постах данной темы сказали что не подойдет)
2) сохранять дамп памяти изначально пустой работоспособной сд карточки и потом заливать его обратно после стирания

Если есть еще другие способы то прошу помочь с проблемой, подсказать пути решения.

Надеюсь я достаточно подробно описал процесс.
Alex11
Вы бы хоть объяснили, для чего Вы это делаете. А так видно, что Вы приобретаете кучу геморроя исключительно задаром.
deplen
Цитата(Alex11 @ Dec 14 2012, 01:57) *
Вы бы хоть объяснили, для чего Вы это делаете. А так видно, что Вы приобретаете кучу геморроя исключительно задаром.

Не моя прихоть, таково условие.
GDI
Правильно ли я понял, что вы хотите подключить контроллер LPC между стандартной SD картой и ПК, куда она вставляется? В таком случае, контроллер SD карты все сделает за вас, он сам управляет информацией которая хранится в его NAND флеше и сам следит за целостностью этой информации.
В любом случае, практика - критерий истины. Попробуйте и расскажите о результатах.
deplen
Цитата(GDI @ Dec 14 2012, 11:10) *
Правильно ли я понял, что вы хотите подключить контроллер LPC между стандартной SD картой и ПК, куда она вставляется? В таком случае, контроллер SD карты все сделает за вас, он сам управляет информацией которая хранится в его NAND флеше и сам следит за целостностью этой информации.
В любом случае, практика - критерий истины. Попробуйте и расскажите о результатах.


Я хочу подключить LPC между родным микроконтроллером флешки и микросхемой NAND и и соединить с площадками sd (что бы получать команду), и при определенной команде запускалась процедура полного стирания. Если не очень понятно то могу залить примерный рисунок .
GDI
Интересно, как Вы это хотите осуществить? Я имею ввиду физически как это реализовать, разобрать корпус карты? А LPC туда поместится, да еще с кучей проводов? Как насчет конкурентного доступа к NAND со стороны штатного контроллера? В общем тут вопросов могут быть тысячи, а ответы будут зависеть от конкретного контроллера карты. Что он там делает с NAND памятью, одному разработчику известно. Может проще заказать разработчику SD карты поддержать в своей прошивке вашу команду для стирания, или найти такие карты у которых можно залезть в прошивку?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.