SD卡(Secure Digital Memory Card):
又叫安全数码卡,是一种基于半导体闪存工艺的存储卡,被广泛应用于便携式电子设备。
SD卡已成为目前消费数码设备中应用最广泛的一种存储卡,具有大容量、高性能、安全等多种特点。
今天小楊就来试验一下通过单片机读写SD卡。
实验材料
1、普通PC一台;
2、SD/TF卡至少一张(推荐2GB以内);
3、禾灮Young_SD读卡模块一块,配原理图;
4、普通读卡器一个;
5、禾灮Young_AVR智能机器人控制板一块(兼容Arduino代码)(附Atmel官方MCU说明书一份)。
5、杜邦线若干。
读卡模块原理图
当然了,发烟测试第一步,通过最简单的代码实现功能:
Arduino代码:
/*
***此例子展示记录串口输入数据到SD卡
* SD卡与控制板使用SPI总线连接
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SD.h>
const int chipSelect = 4; //设定CS引脚为D4,这里也沿用官方默认设置
void setup(){
Serial.begin(9600); //设置串口通信波特率为9600
Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...
if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.
}
void loop(){
String dataString = Serial..readStringUntil("\n");
// 打开文件,注意在同一时间只能有一个文件被打开
// 如果你要打开另一个文件,就需要先关闭前一个
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// 打开datalog.txt文件,读写状态,位置在文件末尾。
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// 数组dataString输出到串口
// Serial.println(dataString);
}else { // 如果无法打开文件,串口输出错误信息error opening datalog.txt
Serial.println("error opening datalog.txt");
}
}
关闭开发板电源后把SD卡取出并接入电脑。可以看到SD卡中有一个datalog.txt文件,打开后有可以看到,此文件中的信息就是记录下的串口输入数据。
/*
***这个例子展示从SD卡中读取一个文件,并且把数据通过串口发送
*/
#include <SD.h>
const int chipSelect = 4; //设定CS接口
void setup(){
Serial.begin(9600); //设置串口通信波特率为9600
Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...
if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not present
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.
File dataFile = SD.open("datalog.txt"); //打开datalog.txt文件
if (dataFile) {
while (dataFile.available()) { //检查是否dataFile是否有数据
Serial.write(dataFile.read()); //如果有数据则把数据发送到串口
}
dataFile.close(); //关闭dataFile
}else {
Serial.println("error opening datalog.txt"); //如果文件无法打开串口发送信息error opening datalog.txt
}
}
void loop(){
}
可以看到,datalog.txt文件中的数据都通过串口发送回了电脑。
/*
***此例子展示如何在SD卡中创建于删除文件
*/
#include <SD.h>
File myFile;
void setup(){
Serial.begin(9600); //设置串口通信波特率为9600
Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...
if (!SD.begin(4)) { //如果从CS口与SD卡通信失败,串口输出信息initialization failed!
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done."); //CS口与SD卡通信成功,串口输出信息initialization done.
if (SD.exists("example.txt")) { //检查example.txt文件是否存在
Serial.println("example.txt exists."); //如果存在输出信息example.txt exists.至串口
}else {
Serial.println("example.txt doesn't exist."); //不存在输出信息example.txt doesn't exist.至串口
}
Serial.println("Creating example.txt...");
myFile = SD.open("example.txt", FILE_WRITE); //打开example.txt,如果没有自动创建,写入状态
myFile.close(); //关闭文件
if (SD.exists("example.txt")) {
Serial.println("example.txt exists.");
}else {
Serial.println("example.txt doesn't exist.");
}
Serial.println("Removing example.txt...");
SD.remove("example.txt"); //删除文件example.txt
if (SD.exists("example.txt")){
Serial.println("example.txt exists.");
}else {
Serial.println("example.txt doesn't exist.");
}
}
void loop(){
}
串口监视器显示文件创建于删除的过程。
#include <SD.h>
File myFile;
void setup(){
Serial.begin(9600);
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
myFile.close();
Serial.println("done.");
} else {
Serial.println("error opening test.txt");
}
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
} else {
Serial.println("error opening test.txt");
}
}
void loop(){
}
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。
感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。
禾灮,感谢有你。
未来,我们将一如既往,砥砺前行。
禾灮·小楊
2018.08.16