最近做了zynq7020的bram进行sd卡读写文件的实验,vivado版本为2022.1,由于xilffs的配置问题检查错误了很久,在此进行一个简单的记录,希望对大家有一定的帮助。
1. 在vivado中按照教程配置好ip核以及参数输出含bitstraem的文件,用vitis创建空c工程
2. 初始化bram驱动
void bram_start(void) //初始化BRAM驱动
{
//bram初始化
XBram bram_inst; //BRAM驱动实例
XBram_Config *bram_cfg_ptr; //BRAM配置信息
bram_cfg_ptr = XBram_LookupConfig(XPAR_BRAM_0_DEVICE_ID); //查找BRAM信息
XBram_CfgInitialize(&bram_inst,bram_cfg_ptr,bram_cfg_ptr->CtrlBaseAddress); //初始化
XBram_SelfTest(&bram_inst, 0); //自检
}
3. 新建一个数组,用来存需要写进sd卡的数据
//read data
u32 read_data_arr[65536];
int read_data;
for(i = 0; i < 65536; i ++)
{
read_data = XBram_ReadReg(BaseAddress, bram_data_offset);
bram_data_offset = bram_data_offset + 4;
read_data_arr[i] = read_data;
}
4. 挂载sd卡,将数组数据写进sd卡指定路径,并读出数据进行验证
rc = f_mount(&fatfs, "0:/", 0); //将文件系统挂载到驱动器"1:"上
if (rc != FR_OK)
{
xil_printf("mount failed!\r\n");
return XST_FAILURE ;
}
file_write(&fil, FILE_PATHA, read_data_arr, 4096*4, FA_OPEN_APPEND|FA_WRITE);
// 调用设置时间戳的函数,传递文件路径
set_timestamp("0:/test_filename_a.dat"); // 由于使用zynq7020无timeset函数自定义时间戳函数
file_read(&fil, FILE_PATHA, read_datatest_arr, FA_OPEN_ALWAYS|FA_READ);
f_unmount("0:/");
if (rc != FR_OK)
{
xil_printf("unmount failed!\r\n");
return XST_FAILURE ;
}
5. sd卡内部文件的读写操作代码实现
#define USER_FILE_READ_SIZE_MAX 65536
#define USER_FILE_WRITE_SIZE 65536
int file_read(FIL *fil, TCHAR* path, u32 *buf, u8 mode)
{
FRESULT res ;
unsigned int br;
res = f_open(fil, path, mode);
if(res != FR_OK)
{
xil_printf("Open file failed!\r\n");
return XST_FAILURE ;
}
res = f_read(fil, buf, USER_FILE_READ_SIZE_MAX, &br);
if(res != FR_OK)
{
xil_printf("read file failed!\r\n");
return XST_FAILURE;
}
f_close(fil);
return XST_SUCCESS;
}
int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode)
{
FRESULT res ;
unsigned int br;
res = f_open(fil, path, mode);
if(res != FR_OK)
{
xil_printf("Create file failed!\r\n");
return XST_FAILURE ;
}
res = f_write(fil, buf, len, &br) ;
if(res != FR_OK)
{
xil_printf("Write file failed!\r\n");
return XST_FAILURE ;
}
f_close(fil);
return XST_SUCCESS;
}
6. 自定义时间戳函数
time_config current_time = { //可自定义
2024,
1,
18,
12,
23,
45,
3
};
int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode);
void set_timestamp(char* path)
{
FILINFO fno;
// 获取当前时间
fno.fdate = (WORD)(((current_time.Year - 1980) * 512U) | current_time.Month * 32U | current_time.Day);
fno.ftime = (WORD)(current_time.Hour * 2048U | current_time.Min * 32 | current_time.Sec / 2U);
f_utime(path, &fno);
}
7. 注意:该zynq7020芯片在实现sd卡的读写时,他vitis里面对于xilffs的设置应该如下才能实现读写操作(我按照教程给的实现不了读写操作,读进去无数据)