i am using K9F1G08U0B, and interface with LPC2468 micorcontroller, i am writing 5 pages data, when i am reading 5 pages data only first two pages data will be display correct remaining pages are displayed wrong data(i.e first data, second data, first data).
how to read multiple pages in K9F1G08U0B
///////////////Write/////////////// DWORD NANDFLASHPageProgram( DWORD pageNum, DWORD blockNum, BYTE *bufPtr ) { volatile BYTE *pCLE; volatile BYTE *pALE; volatile BYTE *pDATA; DWORD i, curAddr;
pCLE = K9F1G_CLE; pALE = K9F1G_ALE; pDATA = K9F1G_DATA;
curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM + pageNum * NANDFLASH_RW_PAGE_SIZE; *pCLE = K9FXX_BLOCK_PROGRAM_1; *pALE = (BYTE)(curAddr & 0x000000FF); /* column address low */ *pALE = (BYTE)((curAddr & 0x00000F00) >> 8); /* column address high */ *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16); /* row address low */ *pALE = (BYTE)((curAddr & 0xFF000000) >> 24); /* row address high */ __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 ) ); }
///////////////Read/////////////////
DWORD NANDFLASHPageRead( DWORD pageNum, DWORD blockNum, BYTE *bufPtr ) { volatile BYTE *pCLE; volatile BYTE *pALE; volatile BYTE *pDATA; DWORD i, curAddr;
pCLE = K9F1G_CLE; pALE = K9F1G_ALE; pDATA = K9F1G_DATA; for(i=0;i<2048;i++) { DataBuff[i] = pDATA; }
curAddr = NANDFLASH_BASE_ADDR + blockNum * NANDFLASH_BLOCKNUM + pageNum * NANDFLASH_RW_PAGE_SIZE; *pCLE = K9FXX_READ_1; *pALE = (BYTE)(curAddr & 0x000000FF); /* column address low */ *pALE = (BYTE)((curAddr & 0x00000F00) >> 8); /* column address high */ *pALE = (BYTE)((curAddr & 0x00FF0000) >> 16); /* row address low */ *pALE = (BYTE)((curAddr & 0xFF000000) >> 24); /* row address high */ *pCLE = K9FXX_READ_2;
NANDFLASHRBCheck(); for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ ) { *bufPtr = *pDATA; bufPtr++; } return( TRUE ); } ////////////////////////Block Erase////////////////// DWORD ERAGEDATA(void) { DWORD FlashID; DWORD i;
//initialize memory NANDFLASHInit(); NANDFLASHReset(); // FlashID = NANDFLASHReadID(); if ( (FlashID & 0xFFFF0000) != K9FXX_ID ) { while( 1 ); } //Erase the entire NAND FLASH for ( i = 0; i < NANDFLASH_BLOCKNUM; i++ ) { if ( NANDFLASHEraseBlock( i ) == FALSE ) { while( 1 ); } } return (TRUE); } //////////////////////////main.c//////////////////// main() { NANDFLASHWRITE(2,0); NANDFLASHWRITE(3,0); NANDFLASHREAD(3,0); } ///////////NANDFLASHWRITE(page,block)////////////////// DWORD NANDFLASHWRITE( DWORD pageNum, DWORD blockNum ) { DWORD FlashID; DWORD i; DWORD temppage, tempblock; temppage = pageNum; tempblock = blockNum;
/* initialize memory */ NANDFLASHInit(); NANDFLASHReset();
FlashID = NANDFLASHReadID(); if ( (FlashID & 0xFFFF0000) != K9FXX_ID ) { while( 1 ); /* Fatal error */ } // for ( i = 0; i < NANDFLASH_BLOCKNUM; i++ ) { if ( NANDFLASHEraseBlock( i ) == FALSE ) { while( 1 ); } } // for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ ) { ReadBuf[i] = 0; WriteBuf[i] = i; } // if ( NANDFLASHCheckValidBlock() == FALSE ) { while ( 1 ); /* Fatal error */ } // if ( InvalidBlockTable[0] == 0 ) { for(i = 0;i<3;i++) { if((temppage == pageNum) && (tempblock == blockNum)) { WriteBuf[0] = pageNum; WriteBuf[1] = pageNum; WriteBuf[2] = pageNum; WriteBuf[3] = pageNum; } } // if ( NANDFLASHPageProgram( pageNum, blockNum, &WriteBuf[0] ) == FALSE ) { while ( 1 ); } __asm { nop nop } } return (TRUE); } ///////////NANDFLASHREAD(page,block)////////////////// DWORD NANDFLASHREAD( DWORD pageNum, DWORD blockNum ) { DWORD FlashID; DWORD i; DWORD temppage, tempblock; temppage = pageNum; tempblock = blockNum;
FlashID = NANDFLASHReadID(); if ( (FlashID & 0xFFFF0000) != K9FXX_ID ) { while( 1 ); /* Fatal error */ }
//if ( InvalidBlockTable[0] == 0 ) { for ( i = 0; i < NANDFLASH_RW_PAGE_SIZE; i++ ) { if((temppage == pageNum) && (tempblock == blockNum)) { ReadBuf[i] = 0; } } __asm { nop nop } // if ( NANDFLASHPageRead( pageNum, blockNum, &ReadBuf[0] ) == FALSE ) { while ( 1 ); } __asm { nop nop } } return (TRUE); }
Please READ posting instructions, your source code is a wall of text. http://www.keil.com/forum/tips.asp
I am using SDRAM IC K4S561632H when ever run my code 0xFF 0xFF 0xFF 0xFF...... are coming in dynamic address is 0xA0000000
my source code is
sdram.c
void SDRAMInit( void ) { DWORD i, dummy = dummy; // SCS |= 0x00000002; /* Reset EMC */ EMC_CTRL = 0x00000001; /*Disable Address mirror*/ PCONP |= 0x00000800; /* Turn On EMC PCLK */ PINSEL4 = 0x50000000; PINSEL5 = 0x05050555; PINSEL6 = 0x55555555; PINSEL8 = 0x55555555; PINSEL9 = 0x50555555; EMC_DYN_RP = 2; /* command period: 3(n+1) clock cycles */ EMC_DYN_RAS = 3; /* RAS command period: 4(n+1) clock cycles */ EMC_DYN_SREX = 7; /* Self-refresh period: 8(n+1) clock cycles */ EMC_DYN_APR = 2; /* Data out to active: 3(n+1) clock cycles */ EMC_DYN_DAL = 5; /* Data in to active: 5(n+1) clock cycles */ EMC_DYN_WR = 1; /* Write recovery: 2(n+1) clock cycles */ EMC_DYN_RC = 5; /* Active to Active cmd: 6(n+1) clock cycles */ EMC_DYN_RFC = 5; /* Auto-refresh: 6(n+1) clock cycles */ EMC_DYN_XSR = 7; /* Exit self-refresh: 8(n+1) clock cycles */ EMC_DYN_RRD = 1; /* Active bank A->B: 2(n+1) clock cycles */ EMC_DYN_MRD = 2; /* Load Mode to Active cmd: 3(n+1) clock cycles */ EMC_DYN_RD_CFG = 1; /* Command delayed strategy */ /* Default setting, RAS latency 3 CCLKs, CAS latenty 3 CCLKs. */ EMC_DYN_RASCAS0 = 0x00000303; #if ENG_BOARD_LPC24XX /* NXP engineering board */ /* 256MB, 16Mx16, 4 banks, row=12, column=9 */ EMC_DYN_CFG0 = 0x00000480; #else /* Embedded Artists board */ /* 256MB, 16Mx16, 4 banks, row=13, column=9 */ EMC_DYN_CFG0 = 0x00000680; #endif delayMs(1, 100); /* use timer 1 */ /* Mem clock enable, CLKOUT runs, send command: NOP */ EMC_DYN_CTRL = 0x00000183; delayMs(1, 200); /* use timer 1 */ /* Send command: PRECHARGE-ALL, shortest possible refresh period */ EMC_DYN_CTRL = 0x00000103; /* set 32 CCLKs between SDRAM refresh cycles */ EMC_DYN_RFSH = 0x00000002; for(i = 0; i < 0x40; i++); /* wait 128 AHB clock cycles */ /* set 28 x 16CCLKs=448CCLK=7us between SDRAM refresh cycles */ EMC_DYN_RFSH = 28; /* To set mode register in SDRAM, enter mode by issue MODE command, after finishing, bailout and back to NORMAL mode. */ /* Mem clock enable, CLKOUT runs, send command: MODE */ EMC_DYN_CTRL = 0x00000083; /* Set mode register in SDRAM */ /* Mode regitster table for Micron's MT48LCxx */ /* bit 9: Programmed burst length(0) bit 8~7: Normal mode(0) bit 6~4: CAS latency 3 bit 3: Sequential(0) bit 2~0: Burst length is 8 row position is 12 */ dummy = *((volatile DWORD *)(SDRAM_BASE_ADDR | (0x33 << 12))); EMC_DYN_CTRL = 0x00000000; /* Send command: NORMAL */ EMC_DYN_CFG0 |= 0x00080000; /* Enable buffer */ delayMs(1, 1); /* Use timer 1 */ return; }
main.c
SDRAMInit(); wr_ptr = (DWORD *)SDRAM_BASE_ADDR; char_wr_ptr = (BYTE *)wr_ptr; for ( i= 0; i < SDRAM_SIZE/4; i++ ) { *wr_ptr++ = 0; } //8 bit write for (i=0; i<SDRAM_SIZE; i++) { *char_wr_ptr++ = 0xAA; *char_wr_ptr++ = 0x55; *char_wr_ptr++ = 0x5A; *char_wr_ptr++ = 0xA5; }
Have you done some basic checking of the hardware, can confirmed your can see clock, ras, cas signals on the appropriate pins?
In your first post you said, "i am using K9F1G08U0B";
In your latest post you said, "I am using SDRAM IC K4S561632H";
Your code says,
/* Mode regitster table for Micron's MT48LCxx */
So which is it?
K9F1G08U0B problem solved.
Now i am testing K4S561632H
So why using code for MT48LCxx ?
K9F1G08U0B is a Parallel Non-Volatile Flash memory K4S561632H is a Parallel SDRAM (needless to say, is volatile).
K9F1G08U0B problem solved. did u figure out the exact problem? what was the solution?