赞
踩
最近做了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的设置应该如下才能实现读写操作(我按照教程给的实现不了读写操作,读进去无数据)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。