Добрый день!
Используется контроллер LPC3131 и микросхема памяти MT29F8G16.
Выполнена инициализация контроллера. Функции чтения и записи страниц работают.
void InitNAND(void)
{
/*Select EBI/MPMC pins*/
SYSCREG_MUX_LCD_EBI_SEL_bit.Mux_LCD_EBI_sel = 1;
CGU_Run_Clock(EBI_CLK);
/*Enable MPMC clocks*/
CGU_Run_Clock(MPMC_CFG_CLK);
CGU_Run_Clock(MPMC_CFG_CLK2);
CGU_Run_Clock(MPMC_CFG_CLK3);
/* Enable NAND Flash Controller Clocks */
CGU_Run_Clock(NANDFLASH_S0_CLK);
CGU_Run_Clock(NANDFLASH_ECC_CLK);
CGU_Run_Clock(NANDFLASH_NAND_CLK);
CGU_Run_Clock(NANDFLASH_PCLK);
/*Reset NAND Flash Controller*/
NANDFLASH_CTRL_ECC_RESET_N_SOFT = 0;
NANDFLASH_CTRL_NAND_RESET_N_SOFT = 0;
for(volatile Int32U i = 0; 10000 > i; i++);
NANDFLASH_CTRL_ECC_RESET_N_SOFT = 1;
NANDFLASH_CTRL_NAND_RESET_N_SOFT = 1;
/**/
SYSCREG_MUX_NAND_MCI_SEL_bit.Mux_NAND_MCI_sel = 0;
/*Nand Configuration Register*/
NandConfig = (1<<0)| /* Error Correction On */
(1<<1)| /* 16-bit flash device */
(0<<3)| /* DMA enabled */
(0<<4)| /* Little endian */
(3<<5)| /* Latency configuration */
(0<<7)| /* ECC started after 516B */
(1<<8)| /* CE deactivated */
(0<<10)| /* 528 Bytes Read/Write */
(0<<12); /* 5-bit mode ECC */
NandSetCE = 0x1E;
/* NAND Reset */
/*Clear Status Flags*/
NandIRQStatusRaw = 0xffffffff;
/*Erase Command*/
NandSetCmd = NAND_RST;
// wait for device ready
while (!NandIRQStatusRaw_bit.INT28R);
}
/*************************************************************************
* Function Name: NandReadPage
* Parameters: Page - NAND Flash Page Number. It is Block*NAND_PG_PER_BLK + Page_in_Block
* Buffer_Index - Index to NFC Buffer (0-3)
* Return: FLASH_OK - No Read Error or 1bit Error
* FLASH_ERROR - Non Correcable Read Error
* Description: Reads one page (512 main+16 spera) from NAND Flash into RBA
*
*************************************************************************/
unsigned int NandReadPage(unsigned char * dest, unsigned int Page,unsigned int Buff_Index)
{
int t=0;
/*Read commad*/
NandSetCmd = 0x00;
/*Set Address*/
#ifdef NAND_MOD
AddrInOperation(NAND_PAGE_WORD_SIZE *(Page%4),Page/4);
#else
AddrInOperation(NAND_PAGE_SIZE *(Page%4),Page/4);
#endif
/*Clear Status Flags*/
NandIRQStatusRaw = 0xffffffff;
/*Read Command*/
NandSetCmd = 0x30;
// wait for device ready
while (!NandIRQStatusRaw_bit.INT28R);
/*Clear Status flags*/
NandIRQStatusRaw = 0xffffffff;
/*Start Reading*/
NandControlFlow = 1;
/*Wait reading and ECC to complete*/
while(!NandIRQStatusRaw_bit.INT21R);
/*Non Correctable error*/
if( !NandIRQStatusRaw_bit.INT26R && NandIRQStatusRaw_bit.INT11R)
return FLASH_ERROR;
unsigned char * src = (unsigned char *) 0x70000000;
for(int i = 0; i<516; i+=sizeof(unsigned char))
{
*dest++ = *src++;
}
return FLASH_OK;
}
Проблема возникает когда я пытаюсь организовать проверку всех микросхемы на наличие плохих блоков.
Генирируется таблица случайных чисел и записывается в каждый блок (страница за страницей).
Затем в цикле постранично считывается и сравнивается с ожидаемым результом.
Число блоков 8192. Число страниц в блоке 256 по 512 байт.
В случайном блоке при чтении возникает событие
if( !NandIRQStatusRaw_bit.INT26R && NandIRQStatusRaw_bit.INT11R)
и функция чтения возвращает ошибку чтения.
В моем цикле, в случае ошибки, предусмотрено чтение страницы 3 раза. Все 3 попытки оказываются не успешными.
void ReadRandomData(void)
{
int i,k,j;
int NumTry=3;
int ErrorInBlock=0;
for(i = STARTBLOCK; i<NAND_BLK_NUM; ++i)
{ int compare=0;
for( k =0; k<NAND_PG_PER_BLK; k++)
{
NumTry=3;
do
{
ErrorInBlock=0;
if (FLASH_ERROR == NandReadPage(DataBuf, i*NAND_PG_PER_BLK+k,0))
{
NumTry--;
ErrorInBlock++;
}
else NumTry=0;
}
while (NumTry!=0);
/*Compare Data*/
if (ErrorInBlock)
{
/*вывод сообщения об ошибке*/
}
else
{
/*сравнение полученных данных и ожидаемых*/
}
}
}
}
Если же потом обратиться к данной странице, то ошибки нет, и данные считываются верно.
Так же если проверять не все страницы блока, а с шагом, скажем каждая 10,17, 20 сраница, то данной ошибки не возникает и тест выполняется.
Пробовала в случае ошибки снова вызывать функцию инициализации. Не помогло.
Из-за чего может возникнуть такая ошибка?