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-й,близко, но не то. Ничем ни примечательный адрес. Могут быть и битые страницы? или код?