You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
4.7KB

  1. /*
  2. * Example use of two SPI ports on an STM32 board.
  3. * Note SPI speed is limited to 18 MHz.
  4. */
  5. #include <SPI.h>
  6. #include "SdFat.h"
  7. #include "FreeStack.h"
  8. #error See new Version 2 STM32 example
  9. // set ENABLE_EXTENDED_TRANSFER_CLASS non-zero to use faster EX classes
  10. // Use first SPI port
  11. SdFat sd1;
  12. // SdFatEX sd1;
  13. const uint8_t SD1_CS = PA4; // chip select for sd1
  14. // Use second SPI port
  15. SPIClass SPI_2(2);
  16. SdFat sd2(&SPI_2);
  17. // SdFatEX sd2(&SPI_2);
  18. const uint8_t SD2_CS = PB12; // chip select for sd2
  19. const uint8_t BUF_DIM = 100;
  20. uint8_t buf[BUF_DIM];
  21. const uint32_t FILE_SIZE = 1000000;
  22. const uint16_t NWRITE = FILE_SIZE/BUF_DIM;
  23. //------------------------------------------------------------------------------
  24. // print error msg, any SD error codes, and halt.
  25. // store messages in flash
  26. #define errorExit(msg) errorHalt(F(msg))
  27. #define initError(msg) initErrorHalt(F(msg))
  28. //------------------------------------------------------------------------------
  29. void setup() {
  30. Serial.begin(9600);
  31. // Wait for USB Serial
  32. while (!Serial) {
  33. }
  34. // fill buffer with known data
  35. for (size_t i = 0; i < sizeof(buf); i++) {
  36. buf[i] = i;
  37. }
  38. Serial.println(F("type any character to start"));
  39. while (!Serial.available()) {
  40. }
  41. Serial.print(F("FreeStack: "));
  42. Serial.println(FreeStack());
  43. // initialize the first card
  44. if (!sd1.begin(SD1_CS, SD_SCK_MHZ(18))) {
  45. sd1.initError("sd1:");
  46. }
  47. // create Dir1 on sd1 if it does not exist
  48. if (!sd1.exists("/Dir1")) {
  49. if (!sd1.mkdir("/Dir1")) {
  50. sd1.errorExit("sd1.mkdir");
  51. }
  52. }
  53. // initialize the second card
  54. if (!sd2.begin(SD2_CS, SD_SCK_MHZ(18))) {
  55. sd2.initError("sd2:");
  56. }
  57. // create Dir2 on sd2 if it does not exist
  58. if (!sd2.exists("/Dir2")) {
  59. if (!sd2.mkdir("/Dir2")) {
  60. sd2.errorExit("sd2.mkdir");
  61. }
  62. }
  63. // list root directory on both cards
  64. Serial.println(F("------sd1 root-------"));
  65. sd1.ls();
  66. Serial.println(F("------sd2 root-------"));
  67. sd2.ls();
  68. // make /Dir1 the default directory for sd1
  69. if (!sd1.chdir("/Dir1")) {
  70. sd1.errorExit("sd1.chdir");
  71. }
  72. // remove test.bin from /Dir1 directory of sd1
  73. if (sd1.exists("test.bin")) {
  74. if (!sd1.remove("test.bin")) {
  75. sd2.errorExit("remove test.bin");
  76. }
  77. }
  78. // make /Dir2 the default directory for sd2
  79. if (!sd2.chdir("/Dir2")) {
  80. sd2.errorExit("sd2.chdir");
  81. }
  82. // remove rename.bin from /Dir2 directory of sd2
  83. if (sd2.exists("rename.bin")) {
  84. if (!sd2.remove("rename.bin")) {
  85. sd2.errorExit("remove rename.bin");
  86. }
  87. }
  88. // list current directory on both cards
  89. Serial.println(F("------sd1 Dir1-------"));
  90. sd1.ls();
  91. Serial.println(F("------sd2 Dir2-------"));
  92. sd2.ls();
  93. Serial.println(F("---------------------"));
  94. // set the current working directory for open() to sd1
  95. sd1.chvol();
  96. // create or open /Dir1/test.bin and truncate it to zero length
  97. SdFile file1;
  98. if (!file1.open("test.bin", O_RDWR | O_CREAT | O_TRUNC)) {
  99. sd1.errorExit("file1");
  100. }
  101. Serial.println(F("Writing test.bin to sd1"));
  102. // write data to /Dir1/test.bin on sd1
  103. for (uint16_t i = 0; i < NWRITE; i++) {
  104. if (file1.write(buf, sizeof(buf)) != sizeof(buf)) {
  105. sd1.errorExit("sd1.write");
  106. }
  107. }
  108. // set the current working directory for open() to sd2
  109. sd2.chvol();
  110. // create or open /Dir2/copy.bin and truncate it to zero length
  111. SdFile file2;
  112. if (!file2.open("copy.bin", O_WRONLY | O_CREAT | O_TRUNC)) {
  113. sd2.errorExit("file2");
  114. }
  115. Serial.println(F("Copying test.bin to copy.bin"));
  116. // copy file1 to file2
  117. file1.rewind();
  118. uint32_t t = millis();
  119. while (1) {
  120. int n = file1.read(buf, sizeof(buf));
  121. if (n < 0) {
  122. sd1.errorExit("read1");
  123. }
  124. if (n == 0) {
  125. break;
  126. }
  127. if ((int)file2.write(buf, n) != n) {
  128. sd2.errorExit("write2");
  129. }
  130. }
  131. t = millis() - t;
  132. Serial.print(F("File size: "));
  133. Serial.println(file2.fileSize());
  134. Serial.print(F("Copy time: "));
  135. Serial.print(t);
  136. Serial.println(F(" millis"));
  137. // close test.bin
  138. file1.close();
  139. file2.close();
  140. // list current directory on both cards
  141. Serial.println(F("------sd1 -------"));
  142. sd1.ls("/", LS_R | LS_DATE | LS_SIZE);
  143. Serial.println(F("------sd2 -------"));
  144. sd2.ls("/", LS_R | LS_DATE | LS_SIZE);
  145. Serial.println(F("---------------------"));
  146. Serial.println(F("Renaming copy.bin"));
  147. // rename the copy
  148. if (!sd2.rename("copy.bin", "rename.bin")) {
  149. sd2.errorExit("sd2.rename");
  150. }
  151. // list current directory on both cards
  152. Serial.println(F("------sd1 -------"));
  153. sd1.ls("/", LS_R | LS_DATE | LS_SIZE);
  154. Serial.println(F("------sd2 -------"));
  155. sd2.ls("/", LS_R | LS_DATE | LS_SIZE);
  156. Serial.println(F("---------------------"));
  157. Serial.println(F("Done"));
  158. }
  159. //------------------------------------------------------------------------------
  160. void loop() {}