soft_sdcard.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "board.h"
  2. #include "hpm_sdmmc_sd.h"
  3. #include "soft_sdcard.h"
  4. #include "ff.h"
  5. #include "hard_sdio_sd.h"
  6. #include "diskio.h"
  7. #include "my_math.h"
  8. #include "soft_delay.h"
  9. #include "soft_time.h"
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. /*
  14. //==========================连续写入测试=============================
  15. ...
  16. (注释内容保持不变)
  17. */
  18. /**
  19. ******************************************************************************
  20. * 定义变量
  21. ******************************************************************************
  22. */
  23. FATFS fs; /* FatFs文件系统对象 */
  24. FIL fnew_data, fnew_log; /* 文件对象 */
  25. FRESULT res_sd; /* 文件操作结果 */
  26. UINT frnum; /* 文件成功读数量 */
  27. UINT fwnum; /* 文件成功写数量 */
  28. // BYTE ReadBuffer[_MAX_SS] = {0}; /* 读缓冲区 */
  29. // BYTE WriteBuffer[_MAX_SS] = {0}; /* 写缓冲区*/
  30. BYTE work[FF_MAX_SS] = {0}; /* 工作区 (larger is better for processing time) */
  31. DIR logdir;
  32. DIR posdir;
  33. FILINFO fno;
  34. int file_num = 0;
  35. // FATFS文件名不区分大小写。默认大写。
  36. const char *logpath = "LOG";
  37. const char *pospath = "POS";
  38. static uint8_t _sd_init_ok = 0;
  39. /*========== HPM6750 适配:添加设备定义 ==========*/
  40. #define SDMMC_BASE BOARD_APP_SDXC_BASE
  41. #define SDMMC_IRQn BOARD_APP_SDXC_IRQn
  42. #define DEV_SD 0
  43. uint8_t sdcard_initok(void)
  44. {
  45. return _sd_init_ok;
  46. }
  47. /**
  48. * @brief 初始化 SD 卡
  49. * @param init_type
  50. * @arg 0 初始化 SD 卡, 1 格式化 SD 卡
  51. */
  52. void sdcard_inital(uint8_t init_type)
  53. {
  54. // 硬件初始化 被中间件做了?
  55. /*========== HPM6750 适配:等待SD卡插入并初始化 ==========*/
  56. while ((disk_initialize(DEV_SD))) // 检测不到SD卡
  57. {
  58. printf("SD CARD ERR \n");
  59. delay_ms(600);
  60. }
  61. /*========== HPM6750 适配:配置中断 ==========*/
  62. // intc_m_enable_irq_with_priority(SDMMC_IRQn, 1); 要启动中断???
  63. // SDIO方式挂载文件系统,文件系统挂载时会对SDIO设备初始化
  64. /*========== HPM6750 适配:保持空路径 ==========*/
  65. res_sd = f_mount(&fs, "", 1);
  66. /*----------------------- 格式化测试 ---------------------------*/
  67. /* 如果没有文件系统就格式化创建创建文件系统 */
  68. if (res_sd == FR_NO_FILESYSTEM || init_type == 1)
  69. {
  70. /* 格式化 */
  71. /*========== HPM6750 适配:MKFS_PARM结构体 ==========*/
  72. MKFS_PARM mkfs_parm;
  73. mkfs_parm.fmt = FM_ANY;
  74. mkfs_parm.n_fat = 0;
  75. mkfs_parm.align = 0;
  76. mkfs_parm.n_root = 0;
  77. mkfs_parm.au_size = 0;
  78. /* 保持空路径 */
  79. res_sd = f_mkfs("", &mkfs_parm, work, sizeof(work));
  80. if (res_sd == FR_OK)
  81. {
  82. /* 格式化后,先取消挂载 */
  83. res_sd = f_mount(NULL, "", 1);
  84. /* 重新挂载 */
  85. res_sd = f_mount(&fs, "", 1);
  86. }
  87. else
  88. {
  89. // 格式化失败。》》
  90. printf("sd card format fail!\n");
  91. while (1)
  92. ;
  93. }
  94. }
  95. else if (res_sd != FR_OK)
  96. {
  97. // SD卡挂载文件系统失败,可能原因:SD卡初始化不成功。\r\n");
  98. printf("sd card mount fail!\n");
  99. while (1)
  100. ;
  101. }
  102. else
  103. {
  104. // 文件系统挂载成功,可以进行读写测试\r\n");
  105. }
  106. // 创建文件夹
  107. res_sd = f_mkdir(logpath);
  108. res_sd = f_mkdir(pospath);
  109. // 检查是否存在LOG文件
  110. f_open(&fnew_data, "LOG/LOG_FLY.DAT", FA_CREATE_NEW);
  111. f_close(&fnew_data);
  112. DWORD nclst;
  113. unsigned long free_size = 0;
  114. FATFS *fs_p = &fs;
  115. // 检查剩余容量
  116. res_sd = f_getfree("", &nclst, &fs_p);
  117. free_size = nclst * fs_p->csize / 2;
  118. // 打开log文件夹, 读下一个的文件
  119. res_sd = f_opendir(&logdir, logpath);
  120. res_sd = f_readdir(&logdir, &fno);
  121. // 如果剩余容量小于96MB, 删除部分数据文件, 防止写满
  122. while (free_size < 96 * 1024)
  123. {
  124. if (fno.fname[0] != 'L')
  125. {
  126. char datafile_path[20] = "";
  127. // 拼接文件路径
  128. strcat(datafile_path, logpath);
  129. strcat(datafile_path, "/");
  130. strcat(datafile_path, fno.fname);
  131. // 删除一个文件
  132. f_unlink(datafile_path);
  133. }
  134. // 再读一下剩余的容量是否够用
  135. res_sd = f_getfree("", &nclst, &fs_p);
  136. free_size = nclst * fs_p->csize / 2;
  137. // 读下一个文件
  138. res_sd = f_readdir(&logdir, &fno);
  139. }
  140. _sd_init_ok = 1;
  141. // 关闭文件夹
  142. res_sd = f_closedir(&logdir);
  143. }