|
|
  |
Вылетает флаг fail при записи во флэш K9F2G, Может ли быть битой страница, а не блок? |
|
|
|
Jun 18 2010, 07:24
|
Местный
  
Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737

|
Проверяю 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-й,близко, но не то. Ничем ни примечательный адрес. Могут быть и битые страницы? или код?
|
|
|
|
|
Jun 18 2010, 07:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Насколько я понимаю, это означает, что эта Ваша 29-я страница только что побилась. Соответственно, надо остатки данных куда-то переносить и помечать весь блок как битый. апдейт: Именно это и написано в даташите, картинки "Program / Erase Flow Chart"
У меня другой вопрос. Поведение регистра статуса где-то подробно расписано? Особо интересно, по каким признакам определяется, прошла ли запись/чтение. Экспериментировал с NAND'ом, в котором есть сектора, помеченные как битые - запись/стирание нормально проходят.
PS Wano, а почему Вы чипселектом не дёргаете? Аппаратно как-то работает, что-ли?
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Jun 18 2010, 08:07
|
Местный
  
Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737

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

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Wano @ Jun 18 2010, 12:07)  ыыыыыы CE чип энэйблом? Его дёргает P4.31-CS1 у LPC2478. Не понял, ну да ладно  Я не интересовался, как интерфейс нанда устроен у LPC'шек. У меня с NAND'ом работает Samsung'овский процессор, там надо в нужный регистр нужный битик поставить/сбросить. Цитата(Wano @ Jun 18 2010, 12:07)  По поводу статусного регистра где про него прочитать, как не в даташите на микруху. В самсунговском шите Table2. Read Staus Register Definition. Я ж хочу подробно  Там написано pass/fail. Вот по каким параметрам происходит fail, там не написано. Лично у меня добиться состояния fail не получилось (хотя, возможно, я и ошибаюсь...).
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|