ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)_第1张图片

功能介绍

代码实现了通过文件系统读取 SD 卡上的文件,并对文件和文件夹做读、写、删除、建立、文件列表、文件搜索等功能,代码以将文件系统和 SD 卡驱动挂载在一起,直接运行代码可对格式化过的 SD 卡进行文件建立等操作。

编译运行代码,代码会对 SD 卡根目录下的文件进行文件列表,然后将第一个文件进行复制,并保存为“2.txt”,通过计算机可以查阅复制的文件。

代码使用说明

工程下有两个文件夹:bf53x_sd_mmc_lib 和 fat32_lib 。 这两个文件夹分别是 SD 卡驱动的库源代码和文件系统的库源代码,直接运行这两个文件夹下的工程,会在各自的 DEBUG 文件夹下生成*.dlb 文件,这个文件就是库文
件。在工程文件夹的根目录下,已经有这两个库文件,这两个库文件被 BF53x_SD_FS.dpj 工程调用,实现文件系统功能。

SD 卡速度的配置:
void MMC_HardwareInitial(void)
{
*pFIO_DIR = PF2;
*pFIO_FLAG_S = PF2;
*pSPI_FLG = FLS2;
*pSPI_BAUD = 4;
*pSPI_CTL = 0x0000;
*pSPI_CTL = 0x0001 | MSTR ;
*pSPI_CTL = (*pSPI_CTL | SPE);
}

修改*pSPI_BAUD 的值进行配置,当为 2 时,速度最快,配置值不能小于 2。

当使用 SD 卡时,需通过 CPLD 打通 SD 卡链路,配置如下:

*pDEVICE_OE = ~SD_SEL;

文件列表函数:将“/”目录下所有文件和文件夹进行列表,并将文件和文件夹的名称和数量存入指定数组。

scan_files(“/”,file_name,file_count,dir_name,dir_count);

代码调试步骤

  1. 将 SD 卡格式化,并在 SD 卡根目录下存一些.txt 文件。
  2. 将 SD 卡插入开发板的 SD 卡接口,编译并运行代码。
  3. 待代码运行完成后,将 SD 卡插入计算机,查看建立的 2.txt 文件。

调试结果

在 SD 卡根目录下将文件列表的第一个文件行复制并将文件名改为 2.txt。

程序源码

cpu.c

#include

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

diskio.c

#include
#include “diskio.h”

void MMC_HardwareInitial(void)
{
*pSPI_FLG = FLS2;
*pSPI_BAUD = 550;
*pSPI_CTL = 0x0000;
*pSPI_CTL = 0x0001 | MSTR ;
*pSPI_CTL = (*pSPI_CTL | SPE);
}

DSTATUS disk_initialize ()
{
MMC_HardwareInitial();
MMC_Init();
return 0;
}

DSTATUS disk_shutdown ()
{
return 0;
}
DSTATUS disk_status ()
{
return 0;
}

DRESULT disk_read (BYTE buff, DWORD sect, BYTE cnt)//cnt = sector num
{
while(cnt–){
MMC_read_sector(sect,buff);
sect += 1;
buff += 512;
}
return 0;
}
#ifndef _READONLY
DRESULT disk_write (const BYTE
buff, DWORD sect, BYTE cnt)
{
while(cnt–){
MMC_Write_sector(sect,buff);
sect += 1;
buff += 512;
}
return 0;
}
#endif

main.c

#include
#include
#include “ff.h”

FIL infile, outfile;
unsigned char buff[0x1000];
unsigned char file_name[100][12];
unsigned char dir_name[50][12];
int file_count[1];
int dir_count[1];

int main()
{
int i;
FRESULT retval = 0;
WORD lenth;

Set_PLL(16,4);
Init_EBIU();

SD_Enable();	
f_mountdrv();

scan_files("/",file_name,file_count,dir_name,dir_count);	
for(i=0;i

}

你可能感兴趣的:(Blackfin专题,ADI,DSP技术中心,ADI,DSP资料下载,ADI,DSP,ADI,DSP中文资料,嵌入式硬件)