大学生
最后登录1970-1-1
在线时间 小时
注册时间2015-12-5
|
前几天我还是可以正常的读写nand flash,今天又不行了,f_mount时总是出现FR_NO_FILESYSTE,使用f_mkfs返回值都是成功的,然后继续f_mount还是FR_NO_FILESYSTE。
硬件是没有问题的,我不使用FATFS,直接给NAND FLASH写入数据,然后再读出来是没有问题的。我都快疯掉了,下面是源码,火哥帮我看看哪里有问题。。
#define NAND_PAGE_SIZE ((uint16_t)0x0800) /* 2048 bytes per page w/o Spare Area */
#define NAND_BLOCK_SIZE ((uint16_t)0x0040) /* 64x2048 bytes pages per block */
#define NAND_ZONE_SIZE ((uint16_t)0x0200) /* 512 Block per zone */
#define NAND_SPARE_AREA_SIZE ((uint16_t)0x0040) /* last 64 bytes as spare area */
#define NAND_MAX_ZONE ((uint16_t)0x0002) /* 2 zones of 1024 block */
/*因为nand flash写入的时候需要一整个block擦除,所以只用到了一半的内存也就是64M,另外64M当成数据缓冲*/
DRESULTdisk_ioctl (BYTE drv,BYTE ctrl, void *buff)
{
DRESULTres = RES_OK;
uint32_t result;
switch(ctrl)
{
case CTRL_SYNC:
break;
case GET_BLOCK_SIZE:
*(DWORD*)buff = NAND_BLOCK_SIZE;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = (((NAND_MAX_ZONE/2) * NAND_ZONE_SIZE) * NAND_BLOCK_SIZE);
break;
case GET_SECTOR_SIZE:
*(WORD*)buff = NAND_PAGE_SIZE;
break;
default:
res = RES_PARERR;
break;
}
return res;
}
DRESULT disk_write (BYTE drv,const BYTE *buff,DWORD sector,BYTE count)
{
uint32_t result;
uint32_t BackupBlockAddr;
uint32_t WriteBlockAddr;
uint16_t IndexTmp = 0;
uint16_t OffsetPage;
/* NAND FLASH写入的block 的地址*/
WriteBlockAddr = (sector/NAND_BLOCK_SIZE);
/* 因为只用一半的内存,另一半做为数据缓冲,所以先将FATFS需要写入的那个block数据全部写入到另一半去,BackupBlockAddr需要偏移512block*/
BackupBlockAddr = (WriteBlockAddr + (NAND_MAX_ZONE/2)*NAND_ZONE_SIZE);
/*写入的页地址*/
OffsetPage = sector%NAND_BLOCK_SIZE;
if (drv || !count)
{
return RES_PARERR;
}
/* NAND FLASH要写入的时候,必须要先将这一整个block擦除,才能写入 */
result = NAND_EraseBlock(BackupBlockAddr*NAND_BLOCK_SIZE);
/*将FATFS需要写入的那个block数据,复制到缓冲区 */
for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )
{
NAND_CopySmallPage(WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp,BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp);
}
/* 擦除FATFS需要写入数据的block*/
result = NAND_EraseBlock(WriteBlockAddr*NAND_BLOCK_SIZE);
/*将缓冲去的数据整合跟当前FATFS的数据整合在一起,写入到FATFS对应的block中*/
for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )
{
if((IndexTmp>=OffsetPage)&&(IndexTmp < (OffsetPage+count)))
{
NAND_WriteSmallPage((uint8_t *)buff, WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp, 1);
buff = (uint8_t *)buff + NAND_PAGE_SIZE;
}
else
{
NAND_CopySmallPage(BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp,WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp);
}
}
if(result == NAND_READY)
{
return RES_OK;
}
else
{
return RES_ERROR;
}
}
|
|