初级会员

- 积分
- 197
- 金钱
- 197
- 注册时间
- 2021-6-25
- 在线时间
- 50 小时
|
使用的是FatFs文件系统,diskio.c 几个重要函数如下:
搞不懂为什么从0扇区挂载不了,但是偏移扇区挂载可以挂载成功?
/*-----------------------------------------------------------------------*/
/* 读扇区:读取扇区内容到指定存储区 */
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
BYTE pdrv, /* 设备物理编号(0..) */
BYTE *buff, /* 数据缓存区 */
DWORD sector, /* 扇区首地址 */
UINT count /* 扇区个数(1..128) */
)
{
DRESULT status = RES_PARERR;
switch (pdrv) {
case ATA: /* SD CARD */
break;
case SPI_FLASH:
/* 扇区偏移0.5MB,外部Flash文件系统空间放在SPI Flash后面15.5MB空间 */
sector += 128; //改为sector++; 偏移0扇区会挂载失败
W25QXX_Read(buff, sector <<12, count<<12);
status = RES_OK;
break;
default:
status = RES_PARERR;
break;
}
return status;
}
/*-----------------------------------------------------------------------*/
/* 写扇区:见数据写入指定扇区空间上 */
/*-----------------------------------------------------------------------*/
DRESULT disk_write (
BYTE pdrv, /* 设备物理编号(0..) */
const BYTE *buff, /* 欲写入数据的缓存区 */
DWORD sector, /* 扇区首地址 */
UINT count /* 扇区个数(1..128) */
)
{
uint32_t write_addr;
DRESULT status = RES_PARERR;
if (!count) {
return RES_PARERR; /* Check parameter */
}
switch (pdrv) {
case ATA: /* SD CARD */
break;
case SPI_FLASH:
/* 扇区偏移0.5MB,外部Flash文件系统空间放在SPI Flash后面15.5MB空间 */
sector += 128;
write_addr = sector<<12;
W25QXX_Erase_Sector(write_addr);
W25QXX_Write((u8 *)buff,write_addr,count<<12);
status = RES_OK;
break;
default:
status = RES_PARERR;
break;
}
return status;
}
DRESULT disk_ioctl (
BYTE pdrv, /* 物理编号 */
BYTE cmd, /* 控制指令 */
void *buff /* 写入或者读取数据地址指针 */
)
{
DRESULT status = RES_PARERR;
switch (pdrv) {
case ATA: /* SD CARD */
break;
case SPI_FLASH:
switch (cmd) {
/* 扇区数量:3968*4096/1024/1024=15.5(MB) */
case GET_SECTOR_COUNT:
*(DWORD * )buff = 3968;
break;
/* 扇区大小 */
case GET_SECTOR_SIZE :
*(WORD * )buff = 4096;
break;
/* 同时擦除扇区个数 */
case GET_BLOCK_SIZE :
*(DWORD * )buff = 1;
break;
}
status = RES_OK;
break;
default:
status = RES_PARERR;
break;
}
return status;
}
|
|