Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вылетает флаг fail при записи во флэш K9F2G
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Wano
Проверяю K9F2G08 на битые блоки вроде как по шиту чтением 0xFF в конце первой и второй страницы каждого блока, как в примере от EA:

CODE

#define K9FXX_READ_1 0x00
#define K9FXX_READ_2 0x30
#define K9FXX_BLOCK_PROGRAM_1 0x80
#define K9FXX_BLOCK_PROGRAM_2 0x10

unsigned int NANDFLASHCheckValidBlock( unsigned int block )
{
volatile unsigned char *pCLE;
volatile unsigned char *pALE;
volatile unsigned char *pDATA;
unsigned int page, retValue = TRUE,curAddr;

if(block > (NANDFLASH_BLOCKNUM-1))return FALSE;

pCLE = K9F1G_CLE;
pALE = K9F1G_ALE;
pDATA = K9F1G_DATA;

NANDFLASHEraseBlock(block);

for ( page = 0; page < 2; page++ )
{
/* Check column address 2048 at first page and second page */
curAddr = ((block & 0x000007FF)<<6) + (page & 0x3F);
*pCLE = K9FXX_READ_1;
*pALE = (unsigned char)(0); /* адрес младшей колонки А7-А0*/
*pALE = (unsigned char)(8); /* адрес старший колонки А11-А8 */
*pALE = (unsigned char)( curAddr & 0x000000FF); /* row address А19-А12 */
*pALE = (unsigned char)((curAddr & 0x0000FF00) >> 8); /* row address А27-А20 */
*pALE = (unsigned char)((curAddr & 0x00FF0000) >> 16); /* row address А28 */
*pCLE = K9FXX_READ_2;

NANDFLASHRBCheck();//скопировались ли данные
if ( *pDATA != 0xFF )
{
/* found invalid block number, mark block number in the invalid
block table. */
InvalidBlockTable[block]++;//маркер на битом блоке
retValue = FALSE; /* At least one block is invalid. */
}
}

return( retValue );
}

unsigned int NANDFLASHPageProgram( unsigned int pageNum, unsigned int blockNum, unsigned char *bufPtr )
{
volatile unsigned char *pCLE;
volatile unsigned char *pALE;
volatile unsigned char *pDATA;
unsigned int i;
unsigned int curAddr;

pCLE = K9F1G_CLE;
pALE = K9F1G_ALE;
pDATA = K9F1G_DATA;

curAddr = ((blockNum & 0x000007FF)<<6) + (pageNum & 0x3F);//адрес
*pCLE = K9FXX_BLOCK_PROGRAM_1;
*pALE = (unsigned char)(0); /* адрес колонки ноль так как не используется адресация внутри страницы А7-А0*/
*pALE = (unsigned char)(0); /* адрес старший колонки тоже ноль, так как не используется адресация внутри страницы А11-А8 */
*pALE = (unsigned char)( curAddr & 0x000000FF); /* row address А19-А12 */
*pALE = (unsigned char)((curAddr & 0x0000FF00) >> 8); /* row address А27-А20 */
*pALE = (unsigned char)((curAddr & 0x00010000) >> 16);/* row address А28 */
__asm
{
nop
nop
}
for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ )
{
*pDATA = *bufPtr++;
}
*pCLE = K9FXX_BLOCK_PROGRAM_2;

__asm
{
nop
nop
}
NANDFLASHRBCheck();
return( NANDFLASHReadStatus( K9FXX_BLOCK_PROGRAM_1 ) );
}

unsigned int NANDFLASHReadStatus( unsigned int Cmd )
{
volatile unsigned char *pCLE;
volatile unsigned char *pDATA;
unsigned char StatusData;

pCLE = K9F1G_CLE;
pDATA = K9F1G_DATA;

*pCLE = K9FXX_READ_STATUS;
/* Wait until bit 5 and 6 are 1, READY, bit 7 should be 1 too, not protected */
/* if ready bit not set, it gets stuck here */
do{
StatusData = *pDATA;
}
while ( (StatusData & K9F2X_READY) != K9F2X_READY);

StatusData = *pDATA;
switch ( Cmd )
{
case K9FXX_BLOCK_PROGRAM_1:
case K9FXX_BLOCK_ERASE_1:
if ( StatusData & 0x01 ) /* Erase/Program failure(1) or pass(0) */
return( FALSE );
else
return( TRUE );
case K9FXX_READ_1: /* bit 5 and 6, Read busy(0) or ready(1) */
return( TRUE );
default:
break;
}
return( FALSE );
}


Проблема состоит в том, что именно в 197-м блоке при записи в 29-ю страницу выдаётся флаг Fail при записи. Блок этот не обнаруживается битым. Битый блок у меня 207-й,близко, но не то. Ничем ни примечательный адрес. Могут быть и битые страницы? или код?
esaulenka
Насколько я понимаю, это означает, что эта Ваша 29-я страница только что побилась.
Соответственно, надо остатки данных куда-то переносить и помечать весь блок как битый.
апдейт: Именно это и написано в даташите, картинки "Program / Erase Flow Chart"

У меня другой вопрос.
Поведение регистра статуса где-то подробно расписано?
Особо интересно, по каким признакам определяется, прошла ли запись/чтение. Экспериментировал с NAND'ом, в котором есть сектора, помеченные как битые - запись/стирание нормально проходят.

PS Wano, а почему Вы чипселектом не дёргаете? Аппаратно как-то работает, что-ли?
Wano
Цитата(esaulenka @ Jun 18 2010, 10:42) *
PS Wano, а почему Вы чипселектом не дёргаете? Аппаратно как-то работает, что-ли?


ыыыыыы CE чип энэйблом? Его дёргает P4.31-CS1 у LPC2478. По поводу статусного регистра где про него прочитать, как не в даташите на микруху. В самсунговском шите Table2. Read Staus Register Definition.
esaulenka
Цитата(Wano @ Jun 18 2010, 12:07) *
ыыыыыы CE чип энэйблом? Его дёргает P4.31-CS1 у LPC2478.

Не понял, ну да ладно smile.gif Я не интересовался, как интерфейс нанда устроен у LPC'шек. У меня с NAND'ом работает Samsung'овский процессор, там надо в нужный регистр нужный битик поставить/сбросить.


Цитата(Wano @ Jun 18 2010, 12:07) *
По поводу статусного регистра где про него прочитать, как не в даташите на микруху. В самсунговском шите Table2. Read Staus Register Definition.

Я ж хочу подробно smile.gif
Там написано pass/fail. Вот по каким параметрам происходит fail, там не написано.
Лично у меня добиться состояния fail не получилось (хотя, возможно, я и ошибаюсь...).
Wano
У LPC3хх есть вроде контроллер нанда,а у LPC2 его подключать можно к линиям статической памяти и обращаясь "типа к SRAM памяти" можно с ними работать, поэтому и написал про P4.31-CS1. Я сам непосредственно не дёргаю это ногу.

Спаял ещё две платки и во всех 2-3 битых блока. Но только в одной микросхеме страница кривая. А по поводу статусного регистра наверно не заморачивались сильно:

If program operation results in an error, map out
the block including the page in error and copy the
target data to another block.

не прочитали 0xFF в первых страницах после стирания блока -> используйте другой блок
при стирании блока ошибка -> используйте другой блок
словили fail во время записи страницы -> используйте другой блок
esaulenka
Да читал я про это, читал...

У нас просто FAT под WinCE периодически сыпется.
Перекопал всё, пока без результатов...

Единственное предположение - в Spare Area пишется что-то не то или как-то не так (там нет контрольной суммы, проверить затруднительно...).
Возможно, стоит перечитывать записанное, может, что и выяснится...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.