|
根据网上的教程野火或者CSDN里的教程移植了FATFS文件系统
在res=f_mount(&fs,"1:",1)提示FR_NO_FILESYSTEM;然后f_mkfs("1:",0,work,sizeof(work));返回值res提示🆗,
后res=f_mount(NULL,"1:",1);
res=f_mount(&fs,"1:",1);返回值就提示FR_NO_FILESYSTEM;是什么原因呢,是因为接口代码有问题还是spi没写入,求教!
///////////////////////////////////////////////
下面是接口的定义
DSTATUS disk_status(BYTE pdrv) {
DSTATUS stat=STA_NOINIT;
switch(pdrv){
case SD_CARD:
break;
case EX_FLASH:
if(SPI_FLASH_TYPE==SPI_FLASH_ID){
stat=0;
}else{
stat|=STA_NOINIT;
}
break;
default:
stat=STA_NOINIT;
}
return stat;
}
///////////////////////////////
DSTATUS disk_initialize(BYTE pdrv) {
DSTATUS stat=STA_NOINIT;
uint16_t i;
switch(pdrv) {
case SD_CARD: //SD卡
break;
case EX_FLASH://外部flash
spiflash_init();
i=500;
while(--i);
W25QXX_WAKEUP();//唤醒SPI FLASH
stat=disk_status(EX_FLASH);
break;
default:
stat=STA_NOINIT;
}
return stat;
}
/////////////////////////////////////////////////
DRESULT disk_read(
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector,/* Sector address (LBA) */
UINT count /* Number of sectors to read (1..128) */
) {
DRESULT res;
if(!count) return RES_PARERR;//count不能等于0,否则返回参数错误
switch(pdrv) {
case SD_CARD: //SD卡
break;
case EX_FLASH://外部flash
for(;count>0;count--)
{
spiflash_read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
sector++;
buff+=FLASH_SECTOR_SIZE;
}
res=RES_OK;
break;
default:
res=RES_PARERR;
}
return res;
}
/////////////////////////////////////////////////////
DRESULT disk_write(
BYTE pdrv, /* Physical drive nmuber (0..) */
const BYTE *buff,/* Data to be written */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to write (1..128) */
) {
uint32_t write_addr;
DRESULT res=RES_PARERR;
if(!count) return RES_PARERR;//count不能等于0,否则返回参数错误
switch(pdrv) {
case SD_CARD: //SD卡
break;
case EX_FLASH://外部flash
sector+=512;
write_addr=sector<<12;
spiflash_sector_erase(write_addr);
spiflash_page_write((u8 *)buff,write_addr,count<<12);
res=RES_OK;
break;
default:
res=RES_PARERR;
}
return res;
}
//////////////////////////////////////////
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res = RES_PARERR;
switch (pdrv) {
case EX_FLASH :
switch(cmd){
//扇区数量:4096*4096/1024/1024=16(MB)
case GET_SECTOR_COUNT:
*(DWORD * )buff = 4096;
break;
case GET_SECTOR_SIZE :
*(WORD * )buff = 4096;
break;
case GET_BLOCK_SIZE :
*(DWORD * )buff = 1;
break;
}
res = RES_OK;
break;
default:
res = RES_PARERR;
}
return res;
}
////////////////////////////////////
找了很多跟踪调试,发现,每次都在:f_mount(xxx, "0:", 1) --> mount_volume("0:", xxx, 0) --> find_volume(xxx, 0) --> check_fs(xxx, 0) --> if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3;这里返回3
所以想看看是什么问题
|
|