/*
程序名称:SD_Test
描述:
1. 所需硬件:
- Arduino Uno开发板 *1
- 面包板 *1
- 杜邦线 *若干
- TF卡模块 *1
- TF卡 *1
2. 接线方式(具体请查看接线图):
-
作者:ChantionLAB·开物室
*/
/*--------------------------------------------------------------------------1--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------本程序所引用库--------------------------------------------------------------------*/
#include <SPI.h> // 引入 SPI 库以便与 SPI 设备进行通信
#include <SD.h> // 引入 SD 库以便操作 SD 卡文件系统
/*--------------------------------------------------------------------------2--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------声明定义-----------------------------------------------------------------------*/
/*****************************< 常量声明 >*****************************/
// 无
/*****************************< 引脚定义 >*****************************/
const int SD_CS_Pin = 10; // 定义 SD 卡片选引脚为 10
/*****************************< 变量定义 >*****************************/
// 无
/*****************************< 对象声明 >*****************************/
Sd2Card card; // 创建 Sd2Card 对象,用于与 SD 卡进行通信
SdVolume volume; // 创建 SdVolume 对象,用于管理 SD 卡的卷(volume)
SdFile root; // 创建 SdFile 对象,用于操作文件
/*****************************< 函数声明 >*****************************/
// 无
/*--------------------------------------------------------------------------3--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------setup()程序初始化------------------------------------------------------------------*/
void setup() {
/******************************< 启动串口通讯 >******************************/
Serial.begin(9600); // 初始化串口通信,并设置波特率为9600
/*******************************< SD卡初始化 >******************************/
init_SD();
/******************************< 打印SD卡信息 >******************************/
print_SD_Information();
}
/*--------------------------------------------------------------------------4--------------------------------------------------------------------------*/
/*-------------------------------------------------------------------loop()基础循环体-------------------------------------------------------------------*/
void loop() {
}
/*--------------------------------------------------------------------------5--------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------函数定义-----------------------------------------------------------------------*/
void init_SD() {
Serial.print("SD卡初始化……");
if (!card.init(SPI_HALF_SPEED, SD_CS_Pin)) { // 调用 card 对象的 init 方法进行初始化,使用 SPI_HALF_SPEED 和 CS 引脚
Serial.println("初始化失败。请检查 卡是否插入 / 接线是否正确 ,然后重新运行");
while (1)
;
} else {
Serial.println("成功!");
}
}
void print_SD_Information() {
// 根据卡的类型输出相应的字符串
Serial.print("卡类型: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1: Serial.println("SD1"); break;
case SD_CARD_TYPE_SD2: Serial.println("SD2"); break;
case SD_CARD_TYPE_SDHC: Serial.println("SDHC"); break;
default: Serial.println("未知");
}
// 尝试打开卷(volume),应该是 FAT16 或 FAT32 文件系统
if (!volume.init(card)) {
// 如果卷初始化失败,输出错误信息并进入死循环
Serial.println("找不到FAT16/FAT32分区。\n确保您已经格式化了卡");
while (1)
;
}
// 输出卷的信息,包括簇数和每簇的块数
Serial.print("簇数: ");
Serial.println(volume.clusterCount());
Serial.print("每簇块数: ");
Serial.println(volume.blocksPerCluster());
Serial.print("总块数: ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
// 打印第一个FAT类型卷的类型和大小
uint32_t volumesize; // 定义卷大小变量
Serial.print("卷类型: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster(); // 计算卷的初始大小,基于每簇块数
volumesize *= volume.clusterCount(); // 我们将有很多簇,计算总簇数
volumesize /= 2; // SD卡块始终为512字节(2块为1KB)
Serial.print("卷大小(KB): ");
Serial.println(volumesize);
Serial.print("卷大小(MB): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("卷大小(GB): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\n卡上找到的文件(名称、日期和大小(字节)):");
root.openRoot(volume); // 打开根目录
// 列出卡上的所有文件及其日期和大小
root.ls(LS_R | LS_DATE | LS_SIZE); // 使用 ls 函数列出文件
}