使用Arduino開發ESP32(13):SD卡的使用

目的

對於嵌入式設備來說SD卡也是個比較好用的功能,比如用來存放設備的配置文件、日誌文件、執行腳本、應用數據等。ESP32有兩種使用SD卡的方法,一種是使用SPI接口訪問SD卡,另一種是使用SDMMC接口訪問SD卡 。Arduino core for the ESP32中SPI方式佔用4個IO口,SDMMC方式佔用6個IO口,一般來說SDMMC方式速度要比SPI方式快。

在Arduino core for the ESP32中使用SD卡和之前文章 《使用Arduino開發ESP32(12):文件和文件系統使用(基於SPIFFS)》 中內容比較相似,在這裏SD卡相當於具體的文件系統,而真正的操作則是文件本身的操作,這和SD卡本身又沒太多關係了。在看這篇文章可以先看前面的文章做個瞭解。
在這裏插入圖片描述

SDMMC方式

常用方法

  • bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)
    掛載存儲卡,輸入參數分別爲掛載點、是否使用一線模式;
    ESP32雖然有兩組SDMMC接口,但Arduino core for the ESP32中只用到了其中一組,IO口連接爲:DAT2 - IO12DAT3 - IO13CMD - IO15CLK - IO14DAT0 - IO2DAT1 - IO4
  • void end()
    取消掛載;
  • sdcard_type_t cardType()
    返回存儲卡類型,0、1、2、3、4分別如下:
    CARD_NONE未連接存儲卡;
    CARD_MMC mmc卡;
    CARD_SD sd卡,最大2G;
    CARD_SDHCsdhc卡,最大32G;
    CARD_UNKNOWN未知存儲卡;
  • uint64_t cardSize()
    返回存儲卡大小字節數;
  • uint64_t totalBytes()
    返回文件系統總字節數;
  • uint64_t usedBytes()
    返回文件系統已用字節數;

使用示例

可以使用下面代碼進行簡單測試:

//引用相關庫
#include "FS.h"
#include "SD_MMC.h"

// 接口連接如下:
// SD卡 - ESP32
// ------------
// DAT2 - IO12
// DAT3 - IO13
// CMD  - IO15
// CLK  - IO14
// DAT0 - IO2
// DAT1 - IO4

void setup()
{
  Serial.begin(115200);
  Serial.println();

  //掛載文件系統
  if (!SD_MMC.begin())
  {
    Serial.println("存儲卡掛載失敗");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();

  if (cardType == CARD_NONE)
  {
    Serial.println("未連接存儲卡");
    return;
  }
  else 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("掛載了未知存儲卡");
  }

  //打開/建立 並寫入數據
  File file = SD_MMC.open("/test.txt", FILE_WRITE);
  if (file)
  {
    Serial.println("打開/建立 根目錄下 test.txt 文件!");
  }

  char data[] = "hello world\r\n";
  file.write((uint8_t *)data, strlen(data));
  file.close();

  //重命名文件
  if (SD_MMC.rename("/test.txt", "/retest.txt"))
  {
    Serial.println("test.txt 重命名爲 retest.txt !");
  }

  //讀取文件數據
  file = SD_MMC.open("/retest.txt", FILE_READ);
  if (file)
  {
    Serial.print("文件內容是:");
    while (file.available())
    {
      Serial.print((char)file.read());
    }
  }

  //打印存儲卡信息
  Serial.printf("存儲卡總大小是: %lluMB \n", SD_MMC.cardSize() / (1024 * 1024)); // "/ (1024 * 1024)"可以換成">> 20"
  Serial.printf("文件系統總大小是: %lluB \n", SD_MMC.totalBytes());
  Serial.printf("文件系統已用大小是: %lluB \n", SD_MMC.usedBytes());
}

void loop()
{
}

在這裏插入圖片描述
上面示例只是基本的使用測試,很多方面都不完善,對於文件操作來說比較重要的是檢查文件系統或文件對象是否可用、是否規範,這個可以參考文後鏈接中包含的例程,例程中各個關鍵點的檢查都很完善。

SPI方式

常用方法

  • bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5)
    掛載存儲卡,輸入參數分別爲SS引腳號、SPI對象、時鐘頻率、掛載點、文件最大同時打開數;
    默認IO口連接爲:CS - IO5DI - IO23SCLK - IO18DO - IO19
  • void end()
    取消掛載;
  • sdcard_type_t cardType()
    返回存儲卡類型,0、1、2、3、4分別如下:
    CARD_NONE未連接存儲卡;
    CARD_MMC mmc卡;
    CARD_SD sd卡,最大2G;
    CARD_SDHCsdhc卡,最大32G;
    CARD_UNKNOWN未知存儲卡;
  • uint64_t cardSize()
    返回存儲卡大小字節數;
  • uint64_t totalBytes()
    返回文件系統總字節數;
  • uint64_t usedBytes();
    返回文件系統已用字節數;

使用示例

使用SPI方式訪問SD卡用起來和上面的也沒差太多,不復雜的,可以參考文後鏈接中官方示例。

注意事項

代碼上來說使用SD卡是比較簡單的,但是這裏需要特別注意下的是關於電路方面的—— 總線上下拉電阻
官方推薦的是總線上全部接上50K的上拉電阻,這是比較通用的方法:

CMD and DATA lines D0-D3 of the slave should be pulled up by 50KOhm resistor even in 1-bit mode or SPI mode. The pullups of the slave cards should be connected even if they’re not connected to the host.

其實這裏最關鍵的是ESP32的IO12,這個IO口上上電時的電平會決定外部flash(存放程序的那顆)的工作電壓,上電時該腳爲高則認爲flash工作於1.8V,爲低則認爲flash工作於3.3V。
常用的像是Wroom-32系列模塊該腳內部已下拉,即flash是工作於3.3V的,若外部電路接強上拉則可能導致模塊工作異常(接弱上拉不影響,比如上面說的50K,或者乾脆不接上拉電阻);而像是WROVER模塊該腳是內部上拉的,flash工作於1.8V,外部上拉不影響模塊運行。

可以參考下面內容:
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/sd_pullup_requirements.html

總結

Arduino core for the ESP32中使用SD卡還是比較簡單的,用上SD卡就可以用來製作更多有意思的東西,後面可能會再介紹一些基於SD卡的應用。

更多內容可以參考:
https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC
https://github.com/espressif/arduino-esp32/tree/master/libraries/SD
https://blog.csdn.net/qq_27114397/article/details/84107441

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章