generated from m5stack/M5Template-C-CPP
-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
568caa3
commit a38e2e4
Showing
4 changed files
with
257 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,249 @@ | ||
/** | ||
* @file AtomicTFCard.ino | ||
* @author SeanKwok ([email protected]) | ||
* @brief M5AtomS3 Atomic TFCard Base Test | ||
* @version 0.1 | ||
* @date 2023-12-14 | ||
* | ||
* | ||
* @Hardwares: M5AtomS3 + Atomic TFCard Base + MicroSD Card | ||
* @Platform Version: Arduino M5Stack Board Manager v2.0.9 | ||
* @Dependent Library: | ||
* M5GFX: https://github.com/m5stack/M5GFX | ||
* M5Unified: https://github.com/m5stack/M5Unified | ||
* M5AtomS3: https://github.com/m5stack/M5AtomS3 | ||
*/ | ||
|
||
#include "M5AtomS3.h" | ||
#include <Arduino.h> | ||
#include <SPI.h> | ||
#include "FS.h" | ||
#include "SD.h" | ||
|
||
#define SCK 7 | ||
#define MISO 8 | ||
#define MOSI 6 | ||
|
||
// Listing directory. 列出目录 | ||
void listDir(fs::FS &fs, const char *dirname, uint8_t levels) { | ||
Serial.printf("Listing directory: %s\n", dirname); | ||
|
||
File root = fs.open(dirname); | ||
if (!root) { | ||
Serial.println("Failed to open directory"); | ||
return; | ||
} | ||
if (!root.isDirectory()) { | ||
Serial.println("Not a directory"); | ||
return; | ||
} | ||
|
||
File file = root.openNextFile(); | ||
while (file) { | ||
if (file.isDirectory()) { | ||
Serial.print(" DIR : "); | ||
Serial.println(file.name()); | ||
if (levels) { | ||
listDir(fs, file.name(), levels - 1); | ||
} | ||
} else { | ||
Serial.print(" FILE: "); | ||
Serial.print(file.name()); | ||
Serial.print(" SIZE: "); | ||
Serial.println(file.size()); | ||
} | ||
file = root.openNextFile(); | ||
} | ||
} | ||
|
||
// Creating Dir. 创建目录 | ||
void createDir(fs::FS &fs, const char *path) { | ||
Serial.printf("Creating Dir: %s\n", path); | ||
if (fs.mkdir(path)) { | ||
Serial.println("Dir created"); | ||
} else { | ||
Serial.println("mkdir failed"); | ||
} | ||
} | ||
|
||
// Removing Dir. 删除目录 | ||
void removeDir(fs::FS &fs, const char *path) { | ||
Serial.printf("Removing Dir: %s\n", path); | ||
if (fs.rmdir(path)) { | ||
Serial.println("Dir removed"); | ||
} else { | ||
Serial.println("rmdir failed"); | ||
} | ||
} | ||
|
||
// Reading file. 读取文件 | ||
void readFile(fs::FS &fs, const char *path) { | ||
Serial.printf("Reading file: %s\n", path); | ||
|
||
File file = fs.open(path); | ||
if (!file) { | ||
Serial.println("Failed to open file for reading"); | ||
return; | ||
} | ||
|
||
Serial.print("Read from file: "); | ||
while (file.available()) { | ||
Serial.write(file.read()); | ||
} | ||
file.close(); | ||
} | ||
|
||
// Writing file 写入文件 | ||
void writeFile(fs::FS &fs, const char *path, const char *message) { | ||
Serial.printf("Writing file: %s\n", path); | ||
|
||
File file = fs.open(path, FILE_WRITE); | ||
if (!file) { | ||
Serial.println("Failed to open file for writing"); | ||
return; | ||
} | ||
if (file.print(message)) { | ||
Serial.println("File written"); | ||
} else { | ||
Serial.println("Write failed"); | ||
} | ||
file.close(); | ||
} | ||
|
||
// Appending to file 添加到文件 | ||
void appendFile(fs::FS &fs, const char *path, const char *message) { | ||
Serial.printf("Appending to file: %s\n", path); | ||
|
||
File file = fs.open(path, FILE_APPEND); | ||
if (!file) { | ||
Serial.println("Failed to open file for appending"); | ||
return; | ||
} | ||
if (file.print(message)) { | ||
Serial.println("Message appended"); | ||
} else { | ||
Serial.println("Append failed"); | ||
} | ||
file.close(); | ||
} | ||
|
||
// Renaming file 重命名文件 | ||
void renameFile(fs::FS &fs, const char *path1, const char *path2) { | ||
Serial.printf("Renaming file %s to %s\n", path1, path2); | ||
if (fs.rename(path1, path2)) { | ||
Serial.println("File renamed"); | ||
} else { | ||
Serial.println("Rename failed"); | ||
} | ||
} | ||
|
||
// Deleting file 删除文件 | ||
void deleteFile(fs::FS &fs, const char *path) { | ||
Serial.printf("Deleting file: %s\n", path); | ||
if (fs.remove(path)) { | ||
Serial.println("File deleted"); | ||
} else { | ||
Serial.println("Delete failed"); | ||
} | ||
} | ||
|
||
void testFileIO(fs::FS &fs, const char *path) { | ||
File file = fs.open(path); | ||
static uint8_t buf[512]; | ||
size_t len = 0; | ||
uint32_t start = millis(); | ||
uint32_t end = start; | ||
if (file) { | ||
len = file.size(); | ||
size_t flen = len; | ||
start = millis(); | ||
while (len) { | ||
size_t toRead = len; | ||
if (toRead > 512) { | ||
toRead = 512; | ||
} | ||
file.read(buf, toRead); | ||
len -= toRead; | ||
} | ||
end = millis() - start; | ||
Serial.printf("%u bytes read for %u ms\n", flen, end); | ||
file.close(); | ||
} else { | ||
Serial.println("Failed to open file for reading"); | ||
} | ||
|
||
file = fs.open(path, FILE_WRITE); | ||
if (!file) { | ||
Serial.println("Failed to open file for writing"); | ||
return; | ||
} | ||
|
||
size_t i; | ||
start = millis(); | ||
for (i = 0; i < 2048; i++) { | ||
file.write(buf, 512); | ||
} | ||
end = millis() - start; | ||
Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); | ||
file.close(); | ||
} | ||
void setup() { | ||
auto cfg = M5.config(); | ||
AtomS3.begin(cfg); | ||
|
||
AtomS3.Display.setTextColor(GREEN); | ||
AtomS3.Display.setTextDatum(middle_center); | ||
AtomS3.Display.setTextFont(&fonts::FreeSerifItalic12pt7b); | ||
AtomS3.Display.setTextSize(1); | ||
AtomS3.Display.drawString("MicroSD", AtomS3.Display.width() / 2, 20); | ||
|
||
SPI.begin(SCK, MISO, MOSI, -1); | ||
if (!SD.begin()) { | ||
Serial.println("Card Mount Failed"); | ||
return; | ||
} | ||
uint8_t cardType = SD.cardType(); | ||
|
||
if (cardType == CARD_NONE) { | ||
Serial.println("No SD card attached"); | ||
return; | ||
} | ||
|
||
Serial.print("SD Card Type: "); | ||
if (cardType == CARD_MMC) { | ||
Serial.println("MMC"); | ||
} else if (cardType == CARD_SD) { | ||
Serial.println("SDSC"); | ||
} else if (cardType == CARD_SDHC) { | ||
Serial.println("SDHC"); | ||
} else { | ||
Serial.println("UNKNOWN"); | ||
} | ||
|
||
uint64_t cardSize = SD.cardSize() / (1024 * 1024); | ||
Serial.printf("SD Card Size: %lluMB\n", cardSize); | ||
|
||
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024)); | ||
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024)); | ||
|
||
AtomS3.Display.drawString(String(SD.usedBytes() / (1024 * 1024)) + " / " + | ||
String(SD.totalBytes() / (1024 * 1024)), | ||
AtomS3.Display.width() / 2, 60); | ||
AtomS3.Display.drawString("MB", AtomS3.Display.width() / 2, 100); | ||
|
||
listDir(SD, "/", 0); | ||
createDir(SD, "/mydir"); | ||
listDir(SD, "/", 0); | ||
removeDir(SD, "/mydir"); | ||
listDir(SD, "/", 2); | ||
writeFile(SD, "/hello.txt", "Hello "); | ||
appendFile(SD, "/hello.txt", "World!\n"); | ||
readFile(SD, "/hello.txt"); | ||
deleteFile(SD, "/foo.txt"); | ||
renameFile(SD, "/hello.txt", "/foo.txt"); | ||
readFile(SD, "/foo.txt"); | ||
testFileIO(SD, "/test.txt"); | ||
} | ||
|
||
void loop() { | ||
} |