基于Xilinx平台MicroBlaze的SPI方式FatFs移植

本文介绍了如何在Xilinx MicroBlaze平台上以SPI方式移植FatFs文件系统。FatFs是一个适用于小型嵌入式系统的FAT文件系统模块,支持多种处理器。移植过程涉及修改diskio.c中的特定函数,如disk_status、disk_initialize、disk_read、disk_write和disk_ioctl,以及调整ffconf.h配置。文章提供了详细的步骤和代码示例。
摘要由CSDN通过智能技术生成

FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式。

FatFs源码下载FatFs - Generic FAT Filesystem Module

下载下来后,目录结构由帮助文档(doc)和文件系统源码(src)构成:

打开源码我们会看到如下几个文件:

integer.h:文件中包含了一些数值类型定义。

diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。

ff.c:FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。(相当于C语言中的stdio.h)

ffconf.h:这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。

在Xilinx平台MicroBlaze没有SD卡,所以我们只能以SPI的方式来进行移植。

移植步骤如下:

1.diskio.c中需要修改如下几个函数

1.

  DSTATUS disk_status (
    BYTE pdrv        /* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat;
    int result;

    switch (pdrv) {
    case DEV_SPI :
        result = spi_flash_status();
        stat = RES_OK;
        return stat;

    case DEV_MMC :

        return stat;

    case DEV_USB :

        return stat;
    }
    return STA_NOINIT;
}
2.

DSTATUS disk_initialize (
    BYTE pdrv                /* Physical drive nmuber to identify the drive */
)
{
    DSTATUS stat;
    int result;

    switch (pdrv) {
    case DEV_SPI :
          result = spi_flash_init((u32)pdrv);
        stat = RES_OK;
        return stat;

    case DEV_MMC :

        return stat;

    case DEV_USB :

        return stat;
    }
    return STA_NOINIT;
}
3.

DRESULT disk_read (
    BYTE pdrv,        /* Physical drive nmuber to identify the drive */
    BYTE *buff,        /* Data buffer to store read data */
    DWORD sector,    /* Start sector in LBA */
    UINT count        /* Number of sectors to read */
)
{
    DRESULT res;
    int result;

    switch (pdrv) {
    case DEV_SPI :
        sector+=1536;
        result = spi_flash_read(sector*4096,count*4096,(u8*)buff);
        res = RES_OK;
        return res;

    case DEV_MMC :

        return res;

    case DEV_USB :

        return res;
    }

    return RES_PARERR;
}
4.

DRESULT disk_write (
    BYTE pdrv,            /* Physical drive nmuber to identify the drive */
    const BYTE *buff,    /* Data to be written */
    DWORD sector,        /* Start sector in LBA */
    UINT count            /* Number of sectors to write */
)
{
    DRESULT res;
    int result;

    switch (pdrv) {
    case DEV_SPI :
    
        sector += 1536;
        spi_flash_sector_erase(sector*4096);
        result = spi_flash_write(sector*4096,count*4096,(u8*)buff);
        res = RES_OK;
        return res;

    case DEV_MMC :

        return res;

    case DEV_USB :

        return res;
    }

    return RES_PARERR;
}

5.

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;

    switch (pdrv) {
    case DEV_SPI:
         switch(cmd)
         {
             case GET_SECTOR_COUNT:
                  *(DWORD *) buff = 512;
                  break;
             case GET_SECTOR_SIZE:
                  *(DWORD *) buff = 4096;
                  break;
             case GET_BLOCK_SIZE:
                  *(DWORD *) buff = 1;
                  break;
          }
        res = RES_OK;
        return

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值