摘要:本文介紹SD和TF卡模塊的使用方法
前面介紹了非易失性存儲的使用方法,由于空間和本身只支持鍵值對的限制,非易失性存儲只適用于少量數(shù)據(jù)的記錄。而不適用于各種聲音、圖片、大量數(shù)據(jù)等情況的使用。這時候就需要有文件系統(tǒng)或者更大容量存儲空間的支持。SD卡(Secure Digital Memory Card)和TF卡(Trans-flash Card,也叫Micro SD卡)就是擴展存儲空間的不錯的選擇,因為這兩種卡都支持SPI模式,也就是可以通過SPI通信協(xié)議直接訪問,因此這兩種卡成了很多移動設(shè)備擴展存儲空間的不二選擇。
SD卡通常有兩種工作模式:SDIO模式和SPI模式。其實這也是兩種通信協(xié)議,也就是說SD卡支持SDIO和SPI兩種通信方式。SPI通信協(xié)議在前面已經(jīng)介紹過了。SDIO是安全數(shù)字輸入輸出接口(Secure Digital Input and Output)的縮寫,是從SD內(nèi)存卡接口的基礎(chǔ)上演化出來的一種外設(shè)接口。SDIO接口兼容以前的SD內(nèi)存卡,并且可以連接支持SDIO接口的設(shè)備。SDIO接口有4根數(shù)據(jù)線,數(shù)據(jù)傳輸速度非??臁S信d趣的可以進一步的了解SDIO的詳細信息。
下面來看一下SD卡和TF卡的接口定義:
通過上面的接口可知,應(yīng)該有兩種方法用來讀取SD卡上的數(shù)據(jù),一種是通過SDIO接口,一種是SPI接口,為了簡單方便,現(xiàn)在大部分訪問SD卡都使用SPI的方式,市面上能買到的SD開模塊,也都是SPI接口的。
雖然可以直接把SD卡與ESP32單片機相連接來進行數(shù)據(jù)的讀寫操作,但接線不是那么方便,因此還是使用的功能模塊來進行實驗,通常的功能模塊都是只支持SPI模式的,將SD卡的SPI數(shù)據(jù)線引出到了接線排針上。因為現(xiàn)在TF卡更普遍一些,因此這次使用的是TF卡模塊,其使用方法與SD卡功能模塊沒有任何區(qū)別。模塊的樣子如下圖所示:
熟悉SPI協(xié)議的應(yīng)該對上圖中的引腳非常的屬性了,應(yīng)該不需要再進一步的解釋了,不了解的可以看之前關(guān)于SPI通信協(xié)議的文章。下面就把TF卡模塊連接到我們的ESP32單片機引腳上。
ESP32芯片共有3個SPI接口,其中一個被用作片上SPI Flash使用,另外兩個可以給開發(fā)人員使用,其引腳定義如下:
Pin Name |
HSPI(GPIO Number) |
VSPI(GPIO Number) |
CSO* |
15 |
5 |
SCLK |
14 |
18 |
MISO |
12 |
19 |
MOSI |
13 |
23 |
QUADWP |
2 |
22 |
QUADHD |
4 |
21 |
其中的QUADWP為寫保護信號,QUADHD為保持信號。這兩個引腳只用于4位傳輸。
在設(shè)計電路的時候,可以盡量使用默認的引腳,這樣在開發(fā)中就不需要再進行額外的配置了。當然,ESP32在強大的GPIO交換矩陣的支持下,基本上可以用任意的引腳來連接到SPI控制器,實現(xiàn)使用任意引腳與外部SPI設(shè)備的連接。我所使用的連接方法如下表所示:
TF卡模塊 |
ESP32擴展板 |
GND |
GND |
VCC |
+5V |
MISO |
P19 |
MOSI |
P23 |
SCK |
P18 |
CS |
P5 |
這是使用VSPI默認引腳的連接方法。SPI通信協(xié)議中有明顯的主從設(shè)備定義,因此收發(fā)引腳也明確了主從,這樣連接起來就非常的方便,不容易接錯。回想前面UART通信協(xié)議中,收發(fā)引腳都是站在自身的角度來說的,因此在與其他設(shè)備通信的時候,就應(yīng)該自己的接收與對方的發(fā)送相連接,對方的接收與自己的發(fā)送相連接。這點不同之處要關(guān)注一下,很容易搞錯了。
接下來就來看一下在Arduino IDE中,如何讀寫SD卡中的內(nèi)容,這其中會包含非默認引腳的處理方法。下面來看一下主要的操作過程。
1. 引入頭文件
#include?"SD.h"
#include?"SPI.h"
2. 配置SPI通信引腳
如果使用HSPI的默認引腳,那么可以忽略本步驟,直接進入到下一步。否則,就需要使用這里列舉的幾種方法來配置SPI的通信引腳。通常有下面兩種方法:
(1)調(diào)用SPI實例的begin()方法來指定SPI通信的引腳,該方法的定義如下:
void?begin(int8_t?sck = -1, int8_t?miso = -1, int8_t?mosi = -1, int8_t?ss = -1)
這個方法有4個參數(shù),依次是:sck、miso、mosi和ss。
(2)創(chuàng)建一個新的SPIClass的實例
SPIClass spi = SPIClass(VSPI);
創(chuàng)建的時候可以指定使用VSPI控制器,也可以使用默認的HSPI控制器。如果這個時候恰好使用的就是VSPI的默認引腳,那么就不用再進行任何操作了,如果是自己隨意選擇的幾個引腳,那么同樣可以調(diào)用begin()方法來指定每一個引腳。具體方法同前一種一樣,默認的SPI實例就是SPIClass類型的。
3. 初始化SD實例
SD是SDFS類的實例。其初始化方法begin()的定義如下:
bool?begin(uint8_t?ssPin = SS, SPIClass &spi = SPI,
uint32_t?frequency = 4000000, const?char?*mountpoint = "/sd",
uint8_t?max_files = 5, bool?format_if_empty = false)
這個begin()方法的參數(shù)比較多,重點關(guān)注前兩個,第一個是片選引腳。第二個就是前面創(chuàng)建的SPIClass類的配置信息。默認值是SPI,如果自己生成了新的SPIClass對象的實例,那么把它作為第二個參數(shù)傳遞給begin()方法。
這個begin()方法返回值位布爾類型的,true表示成功,false表示初始化失敗。這時,應(yīng)檢查接線是否牢固、正確。前邊的初始化配置與接線是否相符合。
4. 得到卡的類型
調(diào)用SD.cardType()方法可以得到卡的類型。該方法返回一個枚舉類型的變量,該枚舉類型可以有以下幾個數(shù)值:
? ? CARD_NONE 無卡
? ? CARD_MMC MMC卡
? ? CARD_SD SD卡
? ? CARD_SDHC SDHC卡
? ? CARD_UNKNOWN 未知
下面再說一下SD卡類型的小知識。目前SD卡分為三種,分別是SD、SDHC和SDXC卡。這三者的區(qū)別是容量上限的不同,其次在傳輸速度上有的有些差別,但傳輸速度不是劃分的標準。SD卡是由MMC卡發(fā)展而來的,最早的SD卡由于FAT16文件系統(tǒng)的限制,其最大容量只有2GB,所以在開發(fā)中,小于2GB容量的SD卡,就叫SD卡。容量在2GB至32GB之間的稱為SDHC(Secure Digital High Capacity),也就是高容量的SD卡。它使用了FAT32文件系統(tǒng),能夠支持大于2G的文件。相比之下,SDXC(Secure Digital eXtended Capacity)卡的容量更大,可以達到2TB(2048GB)。它是為需要更高容量的設(shè)備設(shè)計的,并且支持更快的讀寫速度。SDXC使用了FAT32或者EXFAT文件系統(tǒng)。
設(shè)備讀取SD卡是向下兼容的,支持高容量的設(shè)備是可以讀取低容量SD卡的,只支持低容量SD卡的設(shè)備,則無法讀寫高容量SD卡中的內(nèi)容。這里所說的容量的高低是以2GB和32GB為分界線的。文章來源:http://www.zghlxwxcb.cn/news/detail-834581.html
之后,利用SD實例就可以對SD卡中的目錄和文件進行各種操作了。這將在下一篇中進行介紹。文章來源地址http://www.zghlxwxcb.cn/news/detail-834581.html
到了這里,關(guān)于一起玩兒物聯(lián)網(wǎng)人工智能小車(ESP32)——63 SD和TF卡模塊的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!