Arduino ESP32 之 SD卡讀寫

2022-09-19 23:18:14 字數 3474 閱讀 5220

背景知識:

esp32有兩種使用sd卡的方法,一種是使用spi介面訪問sd卡,另一種是使用sdmmc介面訪問sd卡 。

arduino core for the esp32中spi方式占用4個io口,sdmmc方式占用6個io口,一般來說sdmmc方式速度要比spi方式快。

esp32雖然有兩組sdmmc介面,但arduino core for the esp32中只用到了其中一組,io口連線為:dat2 - io12dat3 - io13cmd - io15clk - io14dat0 - io2dat1 - io4

bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)

掛載儲存卡,輸入引數分別為掛載點、是否使用一線模式;

void end()

取消掛載;

sdcard_type_t cardtype()   返回儲存卡型別,0、1、2、3、4,分別如下:

card_none          未連線儲存卡;

card_mmc            mmc卡;

card_sd                sd卡,最大2g;

card_sdhc           sdhc卡,最大32g;

card_unknown  未知儲存卡;

uint64_t cardsize()      返回儲存卡大小位元組數;

uint64_t totalbytes()    返回檔案系統總位元組數;

uint64_t usedbytes()   返回檔案系統已用位元組數;

2. 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 - io5、di - io23、sclk - io18、do - io19;

void end()

取消掛載;

sdcard_type_t cardtype()    返回儲存卡型別,0、1、2、3、4,分別如下:

card_none         未連線儲存卡;

card_mmc           mmc卡;

card_sd               sd卡,最大2g;

card_sdhc          sdhc卡,最大32g;

card_unknown  未知儲存卡;

uint64_t cardsize()      返回儲存卡大小位元組數;

uint64_t totalbytes()     返回檔案系統總位元組數;

uint64_t usedbytes();   返回檔案系統已用位元組數

3. 我的實驗

我手頭的esp32_cam板子的原理圖

右圖可知,我的sd卡接到了esp32的gpio12 13 14 15 2 4 這6個腳上,根據前述,這符合sdmmc方式的io連線。所以,我在軟體上需要使用sdmmc方式來驅動sd卡。

新建arduino專案檔案,複製黏貼如下**,即可以sdmmc方式驅動sd卡

//

引用相關庫

//#include "fs.h"

#include "

sd_mmc.h"//

介面連線如下:

//sd卡 - esp32

//------------

//dat2 - io12

//dat3 - io13

//cmd - io15

//clk - io14

//dat0 - io2

//dat1 - io4

void

setup()

uint8_t cardtype =sd_mmc.cardtype();

if (cardtype ==card_none)

else

if (cardtype ==card_mmc)

else

if (cardtype ==card_sd)

else

if (cardtype ==card_sdhc)

else

//開啟/建立 並寫入資料

file file = sd_mmc.open("

/test.txt

", file_write);

if(file)

char data = "

hello world\r\n";

file.write((uint8_t *)data, strlen(data));

file.close();

//重新命名檔案

if (sd_mmc.rename("

/test.txt

", "

/retest.txt"))

//讀取檔案資料

file = sd_mmc.open("

/retest.txt

", file_read);

if(file)}//

列印儲存卡資訊

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()

4. 實驗效果

5.補充,如果不追求讀寫sd卡的速率,那麼可以spi方式來進行sd卡的讀寫,那麼這樣就可以省下esp32寶貴的2個gpio作其他用途。

其實,這些例程在我們安裝好arduino的esp32支援包以後,我們電腦本地已經有了,參考下面的路徑可以找到這些例程。

STM32 SPI方式讀寫SD卡

前段時間在51上模擬spi實現了對sd卡的讀取,效果還算不錯,最近將其移植到stm32上,不過使用硬體spi和使用軟體spi還是有差別的。如下 void user spiinit void spi初始化以後就可以寫spi讀寫函式了,以下兩個函式參照了網上的資料,出處找不到了,但是這兩個函式幫了我大忙...

STM32掛載SD卡記錄日誌

stm32掛載sd卡記錄日誌 程式主要是在前一篇的基礎上進行。使用cube配置stm32掛載tf卡,請看 記錄日誌主要是將執行中的資料轉換為字串,然後再寫入到sd卡。需要解決兩個問題 程式中各種格式的資料變數轉換為字串 sd卡檔案關閉後再次開啟繼續接著寫。解決第乙個問題是使用函式sprintf 函式...

嵌入式系統學習 STM32之SD卡(上)

sdio,全稱 secure digital input and output 即安全數字輸入輸出介面。它是在sd卡介面的基礎上發展而來,它可以相容之前的sd卡,並可以連線sdio介面裝置,比如 藍芽 wifi 照相機等。sdio和sd卡規範間的乙個重要區別是增加了低速標準。低速卡的目標應用是以最小...