硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
功能介绍
代码实现了通过文件系统读取 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);
代码调试步骤
调试结果
在 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
}