реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> NAND или как его побороть
deplen
сообщение Dec 4 2012, 19:57
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Здравствуйте!

Задача стирания 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 команды. В которых участвуют адреса блоков, страниц. Но как связан данный код с тем что требуется передать.
Спасибо.

Сообщение отредактировал IgorKossak - Dec 5 2012, 11:34
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Dec 4 2012, 20:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



требуется передать адрес... он и передаётся просто он расплющивается в несколько байт... см даташит на микросхему


--------------------
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 5 2012, 03:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



получается мы передаем в функцию номер блока, далее номер блока преобразуется в адрес начала и конца блока?...
Если можно то поподробней что делается в тех трех командах

Сообщение отредактировал deplen - Dec 5 2012, 03:14
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 5 2012, 15:22
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Может я не особо внятно попробовал задать вопрос..попробую еще раз...
Допустим на вход подается 1. Тобишь первый блок, тогда согласно функции результат сдвига будет 40h или 64 в десятичной. Строка с сдвигом 8 равна 0h.
Ниже распишу что получается:
40h 0h
80h 0h
C0 0h

а дальше
00h 01
40h 01
...
и так далее...тобишь через 4 итерации он изменяет переменную с сдвигом 8, как эти все действия связаны с адресацией NAND.
Прошу помощи в этом я не смог догадаться что все это значит.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Dec 5 2012, 16:46
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



давайте по порядку, лучше плясать от исходника.

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

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

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

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 5 2012, 16:59
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Цитата(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 пина
}

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

Завтра уже нада что то показывать начальнику, а я в простой адресации не могу разобраться.

Сообщение отредактировал IgorKossak - Dec 5 2012, 17:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 5 2012, 17:16
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

У NAND флеш есть понятия страниц и блоков. Стирание ведется только блоками. Один блок в вашем примере содержит 64 страницы.
Так в чем, собственно, вопрос?
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 5 2012, 18:23
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Цитата(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... и так далее...

а как в представленном коде нанд понимает что ему подсвоевывают мне не понятно.

Сообщение отредактировал deplen - Dec 5 2012, 18:23
Go to the top of the page
 
+Quote Post
subver
сообщение Dec 6 2012, 05:10
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Какой то поток сознания.
Ваш код делает следующее:

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

И причем тут какие то итерации и увеличения?
Go to the top of the page
 
+Quote Post
vladimir_orl
сообщение Dec 6 2012, 07:31
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591



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


Да, и если тема поднята, скажите, кто знает, по умолчанию SPARE область добавляется при чтении-записи или нет.
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 11 2012, 16:36
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



Цитата(subver @ Dec 6 2012, 09:10) *
Какой то поток сознания.
Ваш код делает следующее:

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

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


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

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

После решения данной проблемы После решения данной задачи возникли следующие:
1)каким способом можно восстановить работоспособность памяти после стирания всех блоков?
2) при подключения, в параллели другого микроконтроллера к "родному" мк SD карточки, будет ли он (родной) как то мешать работе подключенного (тобишь на шину данных выставлять нули или еще какие препятствия)

Сообщение отредактировал deplen - Dec 11 2012, 16:46
Go to the top of the page
 
+Quote Post
subver
сообщение Dec 12 2012, 03:59
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(deplen @ Dec 11 2012, 23:36) *
1)каким способом можно восстановить работоспособность памяти после стирания всех блоков?

Никаким. Даташит настоятельно не рекомендует стирать блоки, помеченные как "плохие".
Память при этом будет работоспособна, но выявить сбойные блоки будет сложно.
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 12 2012, 16:20
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



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


А как насчет низкоуровнего форматирования которое призвано восстановить работоспособность? Оно же как я понимаю записывают необходимую служебную информацию, после которой требуется только записать таблицу например быстрым форматированием Windows.

Сообщение отредактировал deplen - Dec 12 2012, 16:21
Go to the top of the page
 
+Quote Post
subver
сообщение Dec 13 2012, 03:31
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



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

Низкоуровневоео форматирование призвано стереть все блоки, не более того.
Не стоит равнять SD карту и микросхему NAND памяти.
Контроллер SD карты перед какими либо манипуляциями с данными в чипе NAND памяти проверяет на "корректность" выбраный блок. И если он помечен как "плохой" - то просто игнорирует его.
Если вы стерли все подряд блоки без контроля признака "плохого" блока - остается надеятся, что в данной конкретной микросхеме все блоки вдруг были "живые" перед этим, потому что простыми тестами чтения-записи скорее всего не удастся выявить "плохой" блок быстро.
Go to the top of the page
 
+Quote Post
deplen
сообщение Dec 13 2012, 04:54
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 143
Регистрация: 19-11-12
Пользователь №: 74 471



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


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

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

Если и это не поможет то неужели стирание низкого уровня командами нанда - стереть блок, это дорога в один конец и потом карточку нельзя будет использовать?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016