中级会员
 
- 积分
- 237
- 金钱
- 237
- 注册时间
- 2018-6-22
- 在线时间
- 25 小时
|
3金钱
正点原子fatfs实验,修改为16位的nandflash,型号MT29F4G16ABBD;修改了NAND_Init(void)函数,
1.添加后8位数据线初始化
2.FMC_Bank2_3->PCR3 bit4置1(16位模式)
3.添加对应flashID等信息;
结果是16位flash在写入百次左右后会出现返回3的情况,写入失败;
请问:
1. nand_dev结构体初始化的时候,page_totalsize,page_mainsize,page_sparesize等参数的大小单位是Byte还是Words?
2.是否还有其他地方需要修改,否则写入百次之后为什么会出现写入失败的情况;(单步调试是u32 FTL_FindUnusedBlock(u32 sblock,u8 flag))找不到未使用的块。
附件:nandflash.c nandflash.h注:换回8位flash后一切正常;
修改的代码:
/********************************************************************************************************
#if BIT16
//GPIOD8,9,10
GPIO_Set(GPIOD,(0X7<<8),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PG9 AF OUT
GPIO_AF_Set(GPIOD,8,12); //PD15,AF12
GPIO_AF_Set(GPIOD,9,12); //PD15,AF12
GPIO_AF_Set(GPIOD,10,12); //PD15,AF12
//GPIOE11,12,13,14,15
GPIO_Set(GPIOE,(0X1F<<11),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PG9 AF OUT
GPIO_AF_Set(GPIOE,11,12); //PD15,AF12
GPIO_AF_Set(GPIOE,12,12); //PD15,AF12
GPIO_AF_Set(GPIOE,13,12); //PD15,AF12
GPIO_AF_Set(GPIOE,14,12); //PD15,AF12
GPIO_AF_Set(GPIOE,15,12); //PD15,AF12
tempreg|=1<<4; //数据线宽度为8位(16BIT)
#endif //BIT16
tempreg=0<<1; //关闭等待特性
tempreg|=1<<3; //存储器类型为NAND FLASH
// tempreg|=0<<4; //数据线宽度为8位
tempreg|=0<<6; //禁止ECC
********************************************************************************************************/
/******************************************************************************************************** }else if(nand_dev.id==OTHER4G) //4GB//NAND为MT29F4G16ABADA
{
nand_dev.page_totalsize=2112/2; //nand一个page的总大小(包括spare区)
nand_dev.page_mainsize=2048/2; //nand一个page的有效数据区大小
nand_dev.page_sparesize=64/2; //nand一个page的spare区大小
nand_dev.block_pagenum=64; //nand一个block所包含的page数目
nand_dev.plane_blocknum=2048; //nand一个plane所包含的block数目
nand_dev.block_totalnum=4096; //nand的总block数目
// nand_dev.page_totalsize=1056; //nand一个page的总大小(包括spare区)
// nand_dev.page_mainsize=1024; //nand一个page的有效数据区大小
// nand_dev.page_sparesize=32; //nand一个page的spare区大小
// nand_dev.block_pagenum=64; //nand一个block所包含的page数目
// nand_dev.plane_blocknum=1024; //nand一个plane所包含的block数目
// nand_dev.block_totalnum=2048; //nand的总block数目
}else return 1; //错误,返回 OTHER4G
********************************************************************************************************/
测试代码:
u32 test_nand(void)
{
u32 i;
u32 ret;
while(1)
{
LED0=!LED0;
for(i = 0;i < sizeof(txbuf);i ++)
{
txbuf[i] = 0x99 + i;
}
ret=FTL_WriteSectors(txbuf,testSectorNo,512,4);//写入扇区
if(ret)//读取失败
while(1){;};
ret=FTL_ReadSectors(rxbuf,testSectorNo,512,4);//读取扇区
if(ret)//读取失败
while(1){;};
if(Mymemcmp(txbuf,rxbuf,512))
while(1){;};
testTimes ++;
}
}
|
|