新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2020-6-6
- 在线时间
- 8 小时
|

楼主 |
发表于 2020-11-30 21:27:05
|
显示全部楼层
if(NumByteToRead % NAND_ECC_SECTOR_SIZE) //不是NAND_ECC_SECTOR_SIZE的整数倍,不进行ECC校验
{
//读取NAND FLASH中的值
for(i=0;i<NumByteToRead;i++)
{
*(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
}
}else
{
eccnum = NumByteToRead/NAND_ECC_SECTOR_SIZE; //得到ecc计算次数
eccstart = ColNum/NAND_ECC_SECTOR_SIZE;
p = pBuffer;
for(res=0;res<eccnum;res++)
{
FMC_Bank2_3->PCR3 |= 1<<6; //使能ECC校验
for(i=0;i<NAND_ECC_SECTOR_SIZE;i++) //读取NAND_ECC_SECTOR_SIZE个数据
{
*(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
}
while(!(FMC_Bank2_3->SR3&(1<<6))); //等待FIFO空
nand_dev.ecc_hdbuf[res+eccstart] = FMC_Bank2_3->ECCR3; //读取硬件计算后的ECC值
FMC_Bank2_3->PCR3 &= ~(1<<6); //禁止ECC校验
}
i = nand_dev.page_mainsize + 0X10 + eccstart*4; //从spare区的0X10位置开始读取之前存储的ecc值
NAND_Delay(NAND_TRHW_DELAY); //等待tRHW
*(vu8*)(NAND_ADDRESS|NAND_CMD) = 0X05; //随机读指令
//发送地址
*(vu8*)(NAND_ADDRESS|NAND_ADDR) = (u8)i;
*(vu8*)(NAND_ADDRESS|NAND_ADDR) = (u8)(i>>8);
*(vu8*)(NAND_ADDRESS|NAND_CMD) = 0XE0; //开始读数据
NAND_Delay(NAND_TWHR_DELAY); //等待tWHR
pBuffer = (u8*)&nand_dev.ecc_rdbuf[eccstart];
for(i=0;i<4*eccnum;i++) //读取保存的ECC值
{
*(vu8*)pBuffer++ = *(vu8*)NAND_ADDRESS;
}
for(i=0;i<eccnum;i++) //检验ECC
{
if(nand_dev.ecc_rdbuf[i+eccstart] != nand_dev.ecc_hdbuf[i+eccstart])//不相等,需要校正
{
printf("err hd,rd:0x%x,0x%x\r\n",nand_dev.ecc_hdbuf[i+eccstart],nand_dev.ecc_rdbuf[i+eccstart]);
printf("eccnum,eccstart:%d,%d\r\n",eccnum,eccstart);
printf("PageNum,ColNum:%d,%d\r\n",PageNum,ColNum);
res = NAND_ECC_Correction(p+NAND_ECC_SECTOR_SIZE*i,nand_dev.ecc_rdbuf[i+eccstart],nand_dev.ecc_hdbuf[i+eccstart]);//ECC校验
if(res)
errsta = NSTA_ECC2BITERR; //标记2BIT及以上ECC错误
else
errsta = NSTA_ECC1BITERR; //标记1BIT ECC错误
}
}
原子哥,帮忙看一下,没想通啊!!! |
|