背景知識:
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 - io12
、dat3 - io13
、cmd - io15
、clk - io14
、dat0 - io2
、dat1 - 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卡
//4. 實驗效果引用相關庫
//#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()
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卡規範間的乙個重要區別是增加了低速標準。低速卡的目標應用是以最小...