单片机读写SD卡

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

猜你喜欢

转载自blog.csdn.net/HeGuang68207/article/details/81814667
今日推荐