soft_sdcard.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "soft_sdcard.h"
  2. #include "ff.h"
  3. #include "hard_sdio_sd.h"
  4. #include "my_math.h"
  5. #include "soft_delay.h"
  6. #include "soft_time.h"
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. // 掉hpm的sd fatfs库
  11. /*
  12. //==========================连续写入测试=============================
  13. WriteBuffer字节 写入速度 写固定字节数 写大数据块
  14. 512 475kb 写512字节用时1052us 写2*1024*1024字节用时4310us
  15. 1024 563kb 写1024字节用时1775us 写2*1024*1024字节用时3637us
  16. 2048 1280kb 写2048字节用时1562us 写2*1024*1024字节用时1600us
  17. 4096 2528KB 写4096字节用时1582us 写2*1024*1024字节用时810us
  18. /////////////=============实际测试==非连续写入==写512字节用时平均4500us========问题出在哪里????
  19. 实际测试
  20. 正常记录过程中拔掉TF卡不会造成死机。f_write之前会检查系统,如果CARD_ERR会直接返回。且不耗时间,直接返回。
  21. 不连续记录时,每次写512字节用时4000us。写5120字节用时5000us。。。所以猜测写操作的时间主要浪费在了数据发送完成后的写入环节。。
  22. */
  23. #if 0
  24. /**
  25. ******************************************************************************
  26. * 定义变量
  27. ******************************************************************************
  28. */
  29. FATFS fs; /* FatFs文件系统对象 */
  30. FIL fnew_data, fnew_log; /* 文件对象 */
  31. FRESULT res_sd; /* 文件操作结果 */
  32. UINT frnum; /* 文件成功读数量 */
  33. UINT fwnum; /* 文件成功写数量 */
  34. // BYTE ReadBuffer[_MAX_SS] = {0}; /* 读缓冲区 */
  35. // BYTE WriteBuffer[_MAX_SS] = {0}; /* 写缓冲区*/
  36. BYTE work[FF_MAX_SS] = {0}; /* 工作区 (larger is better for processing time) */
  37. DIR logdir;
  38. DIR posdir;
  39. FILINFO fno;
  40. int file_num = 0;
  41. // FATFS文件名不区分大小写。默认大写。
  42. const char *logpath = "LOG";
  43. const char *pospath = "POS";
  44. static uint8_t _sd_init_ok = 0;
  45. uint8_t sdcard_initok(void)
  46. {
  47. return _sd_init_ok;
  48. }
  49. /**
  50. * @brief 初始化 SD 卡
  51. * @param init_type
  52. * @arg 0 初始化 SD 卡, 1 格式化 SD 卡
  53. */
  54. void sdcard_inital(uint8_t init_type)
  55. {
  56. //while ((SD_Init())) // 检测不到SD卡
  57. //{
  58. // printf("SD CARD ERR \n");
  59. // delay_ms(600);
  60. //}
  61. //SDIO_NvicConfig();
  62. //// SDIO方式挂载文件系统,文件系统挂载时会对SDIO设备初始化
  63. //res_sd = f_mount(&fs, "", 1);
  64. ///*----------------------- 格式化测试 ---------------------------*/
  65. ///* 如果没有文件系统就格式化创建创建文件系统 */
  66. //if (res_sd == FR_NO_FILESYSTEM || init_type == 1)
  67. //{
  68. // /* 格式化 */
  69. // res_sd = f_mkfs("", FM_ANY, 0, work, sizeof(work));
  70. // if (res_sd == FR_OK)
  71. // {
  72. // /* 格式化后,先取消挂载 */
  73. // res_sd = f_mount(NULL, "", 1);
  74. // /* 重新挂载 */
  75. // res_sd = f_mount(&fs, "", 1);
  76. // }
  77. // else
  78. // {
  79. // // 格式化失败。》》
  80. // printf("sd card format fail!\n");
  81. // while (1)
  82. // ;
  83. // }
  84. //}
  85. //else if (res_sd != FR_OK)
  86. //{
  87. // // SD卡挂载文件系统失败,可能原因:SD卡初始化不成功。\r\n");
  88. // printf("sd card mount fail!\n");
  89. // while (1)
  90. // ;
  91. //}
  92. //else
  93. //{
  94. // // 文件系统挂载成功,可以进行读写测试\r\n");
  95. //}
  96. //// 创建文件夹
  97. //res_sd = f_mkdir(logpath);
  98. //res_sd = f_mkdir(pospath);
  99. //// 检查是否存在LOG文件
  100. //f_open(&fnew_data, "LOG/LOG_FLY.DAT", FA_CREATE_NEW);
  101. //f_close(&fnew_data);
  102. //DWORD nclst;
  103. //unsigned long free_size = 0;
  104. //FATFS *fs_p = &fs;
  105. //// 检查剩余容量
  106. //res_sd = f_getfree("", &nclst, &fs_p);
  107. //free_size = nclst * fs_p->csize / 2;
  108. //// 打开log文件夹, 读下一个的文件
  109. //res_sd = f_opendir(&logdir, logpath);
  110. //res_sd = f_readdir(&logdir, &fno);
  111. //// 如果剩余容量小于96MB, 删除部分数据文件, 防止写满
  112. //while (free_size < 96 * 1024)
  113. //{
  114. // if (fno.fname[0] != 'L')
  115. // {
  116. // char datafile_path[20] = "";
  117. // // 拼接文件路径
  118. // strcat(datafile_path, logpath);
  119. // strcat(datafile_path, "/");
  120. // strcat(datafile_path, fno.fname);
  121. // // 删除一个文件
  122. // f_unlink(datafile_path);
  123. // }
  124. // // 再读一下剩余的容量是否够用
  125. // res_sd = f_getfree("", &nclst, &fs_p);
  126. // free_size = nclst * fs_p->csize / 2;
  127. // // 读下一个文件
  128. // res_sd = f_readdir(&logdir, &fno);
  129. //}
  130. //_sd_init_ok = 1;
  131. //// 关闭文件夹
  132. //res_sd = f_closedir(&logdir);
  133. }
  134. #endif