STM32 SPI Flash SST25VF016B 移植FATfs文件系统 二

作者:fly 发布于:2014-3-21 16:38 分类:嵌入式

因为我的是SPI flash扇区是4K的,

所以在ffconfig.h中,修改最大最小扇区尺寸均为4096.

然后就是填充diskio.c中的相关函数。

里边总共有五个函数,前边两个我是直接返回的RES_OK

以下是对读写控制三个函数的改动部分。

做到这里,基本就完成了。

另外。我的2M的flash 使用FAT16版本与FAT32版本,均会返回错误,容量太低,按照一个簇一个扇区,计算出来。FAT16要求存储容量至少为16M。

FAT32要求存储容量至少为64M。

最后选得是FAT12.不知道Windows能不能兼容。现在还没做到USB那。等做到的时候,看看再说,

另外开始增加fatfs对单片机片上的部分的支持。

单片机flash比较小了,不知道最后能不能用,如果不能用。只能自己弄个伪文件系统了。

 

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;
	//int result;

	switch (pdrv) {
	case ATA :
		// translate the arguments here

		//result = ATA_disk_read(buff, sector, count);

		// translate the reslut code here

		return res;

	case MMC :
		// translate the arguments here

		//result = MMC_disk_read(buff, sector, count);

		// translate the reslut code here

		return res;

	case USB :
		// translate the arguments here

		//result = USB_disk_read(buff, sector, count);

		// translate the reslut code here

		return res;
	case Diskio_SPI_FLASH:
		#if((System_SST25VF016B==Module_USED)&&(System_Storage==Module_USED))
			Diskio_SPI_Flash->Read(sector*Diskio_fucksectorsize,buff,count*Diskio_fucksectorsize);
			return RES_OK;
		#endif
	case MCU_FLASH:
		return RES_OK;
	}
	return RES_PARERR;
}



/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/

#if _USE_WRITE
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) */
)
{
	DRESULT res;
	switch (pdrv) {
	case ATA :
		// translate the arguments here

		//result = ATA_disk_write(buff, sector, count);

		// translate the reslut code here

		return res;

	case MMC :
		// translate the arguments here

		//result = MMC_disk_write(buff, sector, count);

		// translate the reslut code here

		return res;

	case USB :
		// translate the arguments here

		//result = USB_disk_write(buff, sector, count);

		// translate the reslut code here

		return res;
	case Diskio_SPI_FLASH:
		#if((System_SST25VF016B==Module_USED)&&(System_Storage==Module_USED))			
			Diskio_SPI_Flash->Erase(sector,sector+count-1);
			Diskio_SPI_Flash->Write(sector*4096,(unsigned char *)buff,4096*count);
			return RES_OK;
		#endif
	case MCU_FLASH:
		return res;
	}
	return RES_PARERR;
}
#endif


/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/

#if _USE_IOCTL
DRESULT disk_ioctl (
	BYTE pdrv,		/* Physical drive nmuber (0..) */
	BYTE cmd,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	DRESULT res;
	//int result;
	buff=buff;
	switch (pdrv) {
	case ATA :
		// pre-process here

		//result = ATA_disk_ioctl(cmd, buff);

		// post-process here

		return res;

	case MMC :
		// pre-process here

		//result = MMC_disk_ioctl(cmd, buff);

		// post-process here

		return res;

	case USB :
		// pre-process here

		//result = USB_disk_ioctl(cmd, buff);

		// post-process here

		return res;
	case Diskio_SPI_FLASH:
		switch(cmd)
		{
			case CTRL_SYNC:return RES_OK;
			case GET_SECTOR_COUNT:*(int*)buff=SST25VF016B_SectorNum;return RES_OK;
			case GET_BLOCK_SIZE:*(int*)buff=1;return RES_OK;
			default:return RES_ERROR;
		}
	case MCU_FLASH:
		return RES_OK;
	}
	return RES_PARERR;
}
#endif

 

评论:

初学者
2014-07-09 23:17
正好用上

发表评论:

 
Powered by emlog sitemap