初级会员

- 积分
- 153
- 金钱
- 153
- 注册时间
- 2016-3-22
- 在线时间
- 41 小时
|
5金钱
本人最近在学习nandflash,用的是阿波罗的代码,但是测试是数据总是输处错误,不是数据读错,而是子函数返回不了正确值,原本是将输入的数组指正赋给一个函数内的指针然后依次读取数据存放(*(vu8*)pBuffer= *(vu8*)FSMC_Bank_NAND;),但最后出来的数据都是181。之后我无意间将读出来的数据给了一个u8型的变量也没把他输出(d= *(vu8*)FSMC_Bank_NAND;),最后结果反而输出了正确的结果,这让我很困惑。希望大家能帮我找找原因。
调用
pbuf=mymalloc(SRAMIN,2113);
sta=NAND_ReadPage(pagenum,colnum,&pbuf[0],readbytes); //¶áè¡êy¾Y
//函数
u8 NAND_ReadPage(u32 PageNum,u16 ColNum,u8 *pBuffer,u16 NumByteToRead)
{
vu16 i=0;
u8 res=0;
u8 eccnum=0; //Dèòa¼ÆËãμÄECC¸öêy£¬Ã¿NAND_ECC_SECTOR_SIZE×Ö½ú¼ÆËãò»¸öecc
u8 eccstart=0; //μúò»¸öECCÖμËùêôμÄμØÖ··¶Î§
u8 errsta=0;
u8 *p;
u8 d;
*(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_1;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)ColNum;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(ColNum>>8);
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)PageNum;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(PageNum>>8);
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = (u8)(PageNum>>16);
*(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;
res=NAND_WaitRB(0); //μè′yRB=0
if(res)return NSTA_TIMEOUT; //3¬ê±íË3ö
//ÏÂÃæ2DD′úÂëêÇÕæÕyÅD¶ÏNANDêÇ·ñ×¼±¸oÃμÄ
res=NAND_WaitRB(1); //μè′yRB=1
if(res)return NSTA_TIMEOUT; //3¬ê±íË3ö
if(NumByteToRead%NAND_ECC_SECTOR_SIZE)//2»êÇNAND_ECC_SECTOR_SIZEμÄÕûêy±¶£¬2»½øDDECCD£Ñé
{
//¶áè¡NAND FLASHÖDμÄÖμ
for(i=0;i<NumByteToRead;i++)
{
d= *(vu8*)FSMC_Bank_NAND;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
else
{
eccnum=NumByteToRead/NAND_ECC_SECTOR_SIZE; //μÃμ½ecc¼ÆËã′Îêy
eccstart=ColNum/NAND_ECC_SECTOR_SIZE;
p=pBuffer;//½«pBufferμÄμØÖ·¸ø p
for(res=0;res<eccnum;res++)
{
FSMC_Bank2->PCR2|=1<<6; //ê1ÄüECCD£Ñé
for(i=0;i<NAND_ECC_SECTOR_SIZE;i++) //¶áè¡NAND_ECC_SECTOR_SIZE¸öêy¾Y
{
d= *(vu8*)(FSMC_Bank_NAND);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
for (i=0;i<512;i++)
{
delay_ms (10);
LCD_ShowNum(0,100,pBuffer[i],4,24); //ÄúèYè«êÇ181£»′íÎó
LCD_ShowNum(50,100,i,4,24);
}
while(!(FSMC_Bank2->SR2&(1<<6))); //μè′yFIFO¿Õ
nand_dev.ecc_hdbuf[res+eccstart]=FSMC_Bank2->ECCR2;//¶áè¡ó2¼t¼ÆËãoóμÄECCÖμ
FSMC_Bank2->PCR2&=~(1<<6); //½ûÖ1ECCD£Ñé
}
i=nand_dev.page_mainsize+0X10+eccstart*4; //′óspareÇøμÄ0X10λÖÿaê¼¶áè¡Ö®Ç°′æ′¢μÄeccÖμ
NAND_Delay(30);//μè′ytADL
*(vu8*)(FSMC_Bank_NAND|NAND_CMD)=0X05; //Ëæ»ú¶áÖ¸áî
//·¢ËíμØÖ·
*(vu8*)(FSMC_Bank_NAND|NAND_ADDR)=(u8)i;
*(vu8*)(FSMC_Bank_NAND|NAND_ADDR)=(u8)(i>>8);
*(vu8*)(FSMC_Bank_NAND|NAND_CMD)=0XE0; //¿aê¼¶áêy¾Y
NAND_Delay(30);//μè′ytADL
pBuffer=(u8*)&nand_dev.ecc_rdbuf[eccstart];
for(i=0;i<4*eccnum;i++) //¶á衱£′æμÄECCÖμ
{
d= *(vu8*)FSMC_Bank_NAND;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
for(i=0;i<eccnum;i++) //¼ìÑéECC
{
if(nand_dev.ecc_rdbuf[i+eccstart]!=nand_dev.ecc_hdbuf[i+eccstart])//2»Ïàμè,DèòaD£Õy
{
res=NAND_ECC_Correction(p+NAND_ECC_SECTOR_SIZE*i,nand_dev.ecc_rdbuf[i+eccstart],nand_dev.ecc_hdbuf[i+eccstart]);//ECCD£Ñé
if(res)errsta=NSTA_ECC2BITERR; //±ê¼Ç2BIT¼°òÔéÏECC′íÎó
else errsta=NSTA_ECC1BITERR; //±ê¼Ç1BIT ECC′íÎó
}
}
}
if(NAND_WaitForReady()!=NSTA_READY)errsta=NSTA_ERROR; //ê§°ü
pBuffer=p;
return errsta;
}
|
最佳答案
查看完整内容[请看2#楼]
问题已经解决了,帖子删不了,就在这说一下原因,本质问题是nandflash的fsmc地址被我写错了,后面写常量成功的原因是因为在写数据时我申请了以个空间,之后又被我释放掉了,但数据依然在里面。在读数据时我又申请了一个大小相同的空间。分配的地址还是之前写数据分配的地址,所以只要不做处理里面读出来的数据就是写入的数据。给人照成了nandflash读写没问题的错觉。心累啊,不说了,泪已滑落脸颊
|