当前位置:   article > 正文

zynq利用bram向sd卡写文件_zynq7020 sd卡

zynq7020 sd卡

最近做了zynq7020的bram进行sd卡读写文件的实验,vivado版本为2022.1,由于xilffs的配置问题检查错误了很久,在此进行一个简单的记录,希望对大家有一定的帮助。

1. 在vivado中按照教程配置好ip核以及参数输出含bitstraem的文件,用vitis创建空c工程

2. 初始化bram驱动

  1. void bram_start(void) //初始化BRAM驱动
  2. {
  3. //bram初始化
  4. XBram bram_inst; //BRAM驱动实例
  5. XBram_Config *bram_cfg_ptr; //BRAM配置信息
  6. bram_cfg_ptr = XBram_LookupConfig(XPAR_BRAM_0_DEVICE_ID); //查找BRAM信息
  7. XBram_CfgInitialize(&bram_inst,bram_cfg_ptr,bram_cfg_ptr->CtrlBaseAddress); //初始化
  8. XBram_SelfTest(&bram_inst, 0); //自检
  9. }

3. 新建一个数组,用来存需要写进sd卡的数据

  1. //read data
  2. u32 read_data_arr[65536];
  3. int read_data;
  4. for(i = 0; i < 65536; i ++)
  5. {
  6. read_data = XBram_ReadReg(BaseAddress, bram_data_offset);
  7. bram_data_offset = bram_data_offset + 4;
  8. read_data_arr[i] = read_data;
  9. }

4. 挂载sd卡,将数组数据写进sd卡指定路径,并读出数据进行验证

  1. rc = f_mount(&fatfs, "0:/", 0); //将文件系统挂载到驱动器"1:"上
  2. if (rc != FR_OK)
  3. {
  4. xil_printf("mount failed!\r\n");
  5. return XST_FAILURE ;
  6. }
  7. file_write(&fil, FILE_PATHA, read_data_arr, 4096*4, FA_OPEN_APPEND|FA_WRITE);
  8. // 调用设置时间戳的函数,传递文件路径
  9. set_timestamp("0:/test_filename_a.dat"); // 由于使用zynq7020无timeset函数自定义时间戳函数
  10. file_read(&fil, FILE_PATHA, read_datatest_arr, FA_OPEN_ALWAYS|FA_READ);
  11. f_unmount("0:/");
  12. if (rc != FR_OK)
  13. {
  14. xil_printf("unmount failed!\r\n");
  15. return XST_FAILURE ;
  16. }

5. sd卡内部文件的读写操作代码实现

  1. #define USER_FILE_READ_SIZE_MAX 65536
  2. #define USER_FILE_WRITE_SIZE 65536
  3. int file_read(FIL *fil, TCHAR* path, u32 *buf, u8 mode)
  4. {
  5. FRESULT res ;
  6. unsigned int br;
  7. res = f_open(fil, path, mode);
  8. if(res != FR_OK)
  9. {
  10. xil_printf("Open file failed!\r\n");
  11. return XST_FAILURE ;
  12. }
  13. res = f_read(fil, buf, USER_FILE_READ_SIZE_MAX, &br);
  14. if(res != FR_OK)
  15. {
  16. xil_printf("read file failed!\r\n");
  17. return XST_FAILURE;
  18. }
  19. f_close(fil);
  20. return XST_SUCCESS;
  21. }
  22. int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode)
  23. {
  24. FRESULT res ;
  25. unsigned int br;
  26. res = f_open(fil, path, mode);
  27. if(res != FR_OK)
  28. {
  29. xil_printf("Create file failed!\r\n");
  30. return XST_FAILURE ;
  31. }
  32. res = f_write(fil, buf, len, &br) ;
  33. if(res != FR_OK)
  34. {
  35. xil_printf("Write file failed!\r\n");
  36. return XST_FAILURE ;
  37. }
  38. f_close(fil);
  39. return XST_SUCCESS;
  40. }

6. 自定义时间戳函数

  1. time_config current_time = { //可自定义
  2. 2024,
  3. 1,
  4. 18,
  5. 12,
  6. 23,
  7. 45,
  8. 3
  9. };
  10. int file_write(FIL *fil, TCHAR* path, u32 *buf, u32 len, u8 mode);
  11. void set_timestamp(char* path)
  12. {
  13. FILINFO fno;
  14. // 获取当前时间
  15. fno.fdate = (WORD)(((current_time.Year - 1980) * 512U) | current_time.Month * 32U | current_time.Day);
  16. fno.ftime = (WORD)(current_time.Hour * 2048U | current_time.Min * 32 | current_time.Sec / 2U);
  17. f_utime(path, &fno);
  18. }

7. 注意:该zynq7020芯片在实现sd卡的读写时,他vitis里面对于xilffs的设置应该如下才能实现读写操作(我按照教程给的实现不了读写操作,读进去无数据)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/830638
推荐阅读
相关标签
  

闽ICP备14008679号