Selectați interfața SD pentru ESP32: 12 pași (cu imagini)
Selectați interfața SD pentru ESP32: 12 pași (cu imagini)
Anonim
Selectați Interfață SD pentru ESP32
Selectați Interfață SD pentru ESP32

Acest instructable arată ceva despre selectarea unei interfețe SD pentru proiectul dvs. ESP32.

Pasul 1: Interfață SD

În biblioteca originală Arduino SD, interfața SD utilizează modul de transfer SD SPI bus.

SD are de fapt mai mult mod de transfer:

  • Mod bus SPI: ESP32 are mai mult de 1 bus SPI, se poate personaliza în timpul inițializării
  • Mod magistrală SD 1-bit / 4 biți: ESP32 dedică o altă bibliotecă numită SD_MMC pentru a implementa API modul SD bus
  • Mod SD UHS-II: ESP32 nu este acceptat

Ref.:

www.arduino.cc/en/reference/SD

en.wikipedia.org/wiki/SD_card

docs.espressif.com/projects/esp-idf/en/lat…

Pasul 2: Maparea pinilor ESP32 GPIO

Iată maparea implicită a pinilor ESP32 GPIO:

PIN-ul cardului SD Pin microSD Nume Magistrală SD pe 4 biți Magistrală SD pe 1 biți Autobuz SPI (pini HSPI / VSPInative)
1 2 D3 13 - SS (15/5)
2 3 CMD 15 15 MOSI (13/23)
3 - VSS GND GND GND
4 4 VDD 3,3V 3,3V 3,3V
5 5 CLK 14 14 SCK (14/18)
6 6 VSS GND GND GND
7 7 D0 2 2 MISO (12/19)
8 8 D1 4 - -
9 1 D2 12 - -

Asocierea pinilor GPIO a magistralei SD 1-bit / 4-bit nu poate fi modificată.

Apel simplu SD_MMC begin () la modul inițial de magistrală SD pe 4 biți:

SD_MMC.begin ();

Modul de magistrală SD pe 1 biți poate fi selectat la metoda SD_MMC begin (), de ex.

SD_MMC.begin („/ cdcard”, adevărat);

Autobuzul SPI (HSPI sau VSPI) poate fi selectat în timp ce creați instanța SPIClass, de ex.

SPIClass spi = SPIClass (HSPI);

După cum puteți vedea, pinii de magistrală SD de 1 bit / 4 biți partajează pinii cu HSPI, dar maparea pinilor cardului SD nu este aceeași. Deci, dacă hardware-ul este conectat conform hărții pinului magistralei SD, nu poate utiliza în mod direct pinii nativi HSPI. Pinii GPIO pot fi suprascriși la metoda SPIClass begin (), de ex.

SPIClass spi = SPIClass (HSPI);

spi.begin (14 / * SCK * /, 2 / * MISO * /, 15 / * MOSI * /, 13 / * SS * /);

Și, de asemenea, biblioteca SD poate suprascrie pinul SS, magistrala SPI și frecvența magistralei la metoda SD begin (), de ex.

SD.begin (13 / * SS * /, spi, 80000000);

Pasul 3: Cerințe de extragere SD

Dacă doriți să utilizați modul de magistrală SD pe 4 biți, vă rugăm să respectați cerințele de pull-up ESP32 SD, în special:

  • Conflicte pull-up pe GPIO13
  • Conflicte între Bootstrap și SDIO pe DAT2

Ref.:

docs.espressif.com/projects/esp-idf/en/lat…

Pasul 4: Diverse componente hardware

Diverse hardware
Diverse hardware

ESP32 au o mulțime de kit-uri și placă de dezvoltare, unele dintre ele au slot pentru card MicroSD încorporat.

Iată câteva exemple în mâna mea:

  • TTGO T-Watch, s-a conectat la pinii GPIO 2, 13, 14 și 15 conform modului de magistrală SD pe 1 biți, deci poate folosi modul de magistrală SD pe 1 biți și modul SPI de magistrală
  • Seria M5Stack, s-a conectat la pinii GPIO 4, 18, 19 și 23 conform pinilor nativi VSPI, deci poate folosi setările implicite ale bibliotecii SD [SD.begin (4)]
  • ODROID-GO, s-a conectat la pinii GPIO 18, 19, 22 și 23 conform pinilor nativi VSPI, deci poate folosi setările implicite ale bibliotecii SD [SD.begin (22)]
  • ESP32-CAM, s-a conectat la pinii GPIO 2, 4, 12, 13, 14 și 15 conform modului de magistrală SD pe 4 biți, astfel încât să poată utiliza toate modurile de magistrală SD pe 4 biți / 1 biți și modul de magistrală SPI
  • Placa dev TTGO T8, s-a conectat la pinii GPIO 2, 13, 14 și 15 conform modului de magistrală SD pe 1 biți, deci poate utiliza modul de magistrală SD pe 1 biți și modul de magistrală SPI

www.lilygo.cn/prod_view.aspx?Id=1123

docs.m5stack.com/

wiki.odroid.com/odroid_go/odroid_go

wiki.ai-thinker.com/esp32-cam

github.com/LilyGO/TTGO-T8-ESP32

Pasul 5: Placă de separare a slotului cardului SD

Placă de separare a slotului pentru card SD
Placă de separare a slotului pentru card SD
Placă de separare a slotului pentru card SD
Placă de separare a slotului pentru card SD

Este posibil ca placa Dev cu slot pentru card MicroSD încorporat să nu conecteze toți pinii și majoritatea nu pot utiliza modul de magistrală SD pe 4 biți. O placă individuală de separare a slotului cardului SD oferă o flexibilitate mai bună.

În același timp, multe plăci LCD de rupere, de asemenea, rupe un slot pentru card SD de dimensiuni complete. Cu toate acestea, majoritatea dintre ele sparg doar pinii modului SPI. Nu este suficient să îl folosiți ca mod de magistrală SD pe 4 biți, dar îl puteți folosi în continuare ca mod de magistrală SD pe 1 biți prin această mapare a conexiunii:

LCD -> ESP32

SD_CS -> zero SD_MOSI -> 15 SD_MISO -> 2 SD_SCK -> 14

Pasul 6: Desprindeți GPIO 2 în timp ce programați

Desprindeți GPIO 2 în timp ce programați
Desprindeți GPIO 2 în timp ce programați

Conexiunea modului de magistrală SD pe 4 biți face ca ESP32 să nu intre în modul program. Vă rugăm să nu uitați să detașați GPIO 2 de pe placa de separare a slotului cardului DAT0 înainte de a încărca un nou program.

Pasul 7: Benchmark

Etalon
Etalon
Etalon
Etalon

Am scris un program Arduino simplu pentru etalon:

github.com/moononournation/ESP32_SD_Benchm…

Iată hardware-ul pentru benchmark:

ESP32

NodeMCU ESP32-32S V1.1 (WROOM-32)

Slot pentru card SD

O placă de separare a slotului pentru card MicroSD

Card SD

Am un SanDisk 8 GB MicroSD și un vechi 128 MB MicroSD în mână.

Pasul 8: Benchmark mod SD_MMC pe 4 biți

SanDisk 8 GB MicroSD

20: 27: 46.000 -> Test de scriere / test_1k.bin

20: 27: 59.399 -> Scrieți fișierul utilizat: 13404 ms, 312.914368 KB / s 20: 27: 59.399 -> Scriere test /test_2k.bin 20: 28: 17.248 -> Scrieți fișierul utilizat: 17834 ms, 235.185822 KB / s 20: 28: 17.248 -> Test de scriere /test_4k.bin 20: 28: 21.122 -> Scriere fișier utilizat: 3873 ms, 1082.959961 KB / s 20: 28: 21.122 -> Test de scriere /test_8k.bin 20: 28: 23.147 -> Scrieți fișierul utilizat: 2024 ms, 2072.284668 KB / s 20: 28: 23.147 -> Scriere test /test_16k.bin 20: 28: 27.237 -> Scrieți fișierul utilizat: 4097 ms, 1023.750061 KB / s 20: 28: 27.237 -> Test write /test_32k.bin 20: 28: 30.088 -> Scriere fișier utilizat: 2842 ms, 1475.828247 KB / s 20: 28: 30.088 -> Test write /test_64k.bin 20: 28: 31.882 -> Scriere fișier utilizat: 1811 ms, 2316.015381 KB / s 20: 28: 31.882 -> Test citire /test_1k.bin 20: 28: 35.422 -> Citire fișier utilizat: 3520 ms, 1191.563599 KB / s 20: 28: 35.422 -> Test citire /test_2k.bin 20: 28: 38.813 -> Citire fișier utilizat: 3389 ms, 1237.622925 KB / s 20: 28: 38.813 -> Citire test /test_4k.bin 20: 28: 42.273 -> Citire fișier utilizat: 3474 ms, 1207.341431 KB / s 20:28: 42.273 -> Test citit /test_8k.bin 20: 28: 45.752 - > Citire fișier utilizat: 3487 ms, 1202.840210 KB / s 20: 28: 45.752 -> Citire test /test_16k.bin 20: 28: 48.988 -> Citire fișier utilizat: 3213 ms, 1305.416748 KB / s 20: 28: 48.988 -> Test citire /test_32k.bin 20: 28: 52.077 -> Citire fișier utilizat: 3093 ms, 1356.063354 KB / s 20: 28: 52.077 -> Test citire /test_64k.bin 20: 28: 55.141 -> Citire fișier utilizat: 3080 ms, 1361.786987 KB / s

Vechi 128 MB MicroSD

20: 30: 43.309 -> E (274) sdmmc_sd: sdmmc_check_scr: send_scr returnat 0x109

20: 30: 43.309 -> Montarea cardului nu a reușit

Pasul 9: Benchmark de mod SD_MMC pe 1 bit

SanDisk 8 GB MicroSD

20: 31: 45.194 -> Test de scriere / test_1k.bin

20: 31: 59.506 -> Scriere fișier folosit: 14325 ms, 292.796082 KB / s 20: 31: 59.506 -> Test de scriere /test_2k.bin 20: 32: 17.686 -> Scriere fișier utilizat: 18163 ms, 230.925735 KB / s 20: 32: 17.686 -> Test de scriere /test_4k.bin 20: 32: 21.291 -> Scriere fișier utilizat: 3611 ms, 1161.535278 KB / s 20: 32: 21.291 -> Test de scriere /test_8k.bin 20: 32: 23.939 -> Scrieți fișierul utilizat: 2652 ms, 1581.562622 KB / s 20: 32: 23.939 -> Scriere test /test_16k.bin 20: 32: 28.397 -> Scrieți fișierul utilizat: 4448 ms, 942.964050 KB / s 20: 32: 28.397 -> Test write /test_32k.bin 20: 32: 31.835 -> Scriere fișier folosit: 3429 ms, 1223.185791 KB / s 20: 32: 31.835 -> Test write /test_64k.bin 20: 32: 33.882 -> Scriere fișier utilizat: 2058 ms, 2038.048584 KB / s 20: 32: 33.882 -> Test citire /test_1k.bin 20: 32: 38.031 -> Citire fișier utilizat: 4146 ms, 1011.650757 KB / s 20: 32: 38.031 -> Test citire /test_2k.bin 20: 32: 42.062 -> Citire fișier utilizat: 4019 ms, 1043.618774 KB / s 20: 32: 42.062 -> Test citire /test_4k.bin 20: 32: 46.170 -> Citire fișier utilizat: 4106 ms, 1021.506104 KB / s 20:32: 46.170 -> Test citit /test_8k.bin 20: 32: 50.288 -> Citire fișier folosit: 4121 ms, 1017.787903 KB / s 20: 32: 50.288 -> Citire test /test_16k.bin 20: 32: 54.112 -> Citire fișier utilizat: 3840 ms, 1092.266724 KB / s 20: 32: 54.112 -> Test citire /test_32k.bin 20: 32: 57.840 -> Citire fișier utilizat: 3739 ms, 1121.771606 KB / s 20: 32: 57.840 -> Test citire /test_64k.bin 20: 33: 01.568 -> Citire fișier utilizat: 3711 ms, 1130.235474 KB / s

Vechi 128 MB MicroSD

20: 33: 27.366 -> Test de scriere / test_1k.bin

20: 33: 42.386 -> Scriere fișier utilizat: 15020 ms, 279.247925 KB / s 20: 33: 42.386 -> Test scriere /test_2k.bin 20: 33: 57.927 -> Scriere fișier utilizat: 15515 ms, 270.338654 KB / s 20: 33: 57.927 -> Test de scriere /test_4k.bin 20: 34: 13.108 -> Scriere fișier utilizat: 15195 ms, 276.031860 KB / s 20: 34: 13.108 -> Test de scriere /test_8k.bin 20: 34: 28.162 -> Scrieți fișierul utilizat: 15048 ms, 278.728333 KB / s 20: 34: 28.162 -> Scriere test /test_16k.bin 20: 34: 43.287 -> Scrieți fișierul utilizat: 15142 ms, 276.998016 KB / s 20: 34: 43.287 -> Test write /test_32k.bin 20: 34: 58.278 -> Write file used: 14964 ms, 280.292969 KB / s 20: 34: 58.278 -> Test write /test_64k.bin 20: 35: 13.370 -> Write file used: 15101 ms, 277.750092 KB / s 20: 35: 13.370 -> Test citit /test_1k.bin 20: 35: 17.563 -> Citire fișier utilizat: 4197 ms, 999.357666 KB / s 20: 35: 17.563 -> Test citit /test_2k.bin 20: 35: 21.746 -> Citire fișier utilizat: 4191 ms, 1000.788330 KB / s 20: 35: 21.746 -> Test citire /test_4k.bin 20: 35: 25.942 -> Citire fișier utilizat: 4181 ms, 1003.182007 KB / s 20:35: 25.942 -> Test citit /test_8k.bin 20: 35: 30.101 -> Citire fișier folosit: 4176 ms, 1004.383118 KB / s 20: 35: 30.101 -> Citire test /test_16k.bin 20: 35: 34.279 -> Citire fișier utilizat: 4174 ms, 1004.864380 KB / s 20: 35: 34.279 -> Test citire /test_32k.bin 20: 35: 38.462 -> Citire fișier utilizat: 4173 ms, 1005.105225 KB / s 20: 35: 38.462 -> Test citire /test_64k.bin 20: 35: 42.612 -> Citire fișier utilizat: 4173 ms, 1005.105225 KB / s

Pasul 10: Mod SD SPI la HSPI Bus Benchmark

SanDisk 8 GB MicroSD

08: 41: 19.703 -> Test de scriere / test_1k.bin

08: 41: 53.458 -> Scrieți fișierul utilizat: 33743 ms, 124.301453 KB / s 08: 41: 53.458 -> Scriere test /test_2k.bin 08: 42: 10.000 -> Scrieți fișierul utilizat: 16540 ms, 253.585495 KB / s 08: 42: 10.000 -> Test de scriere /test_4k.bin 08: 42: 17.269 -> Scriere fișier utilizat: 7298 ms, 574.719666 KB / s 08: 42: 17.308 -> Test de scriere /test_8k.bin 08: 42: 22.640 -> Scrieți fișierul utilizat: 5345 ms, 784.715454 KB / s 08: 42: 22.640 -> Scriere test /test_16k.bin 08: 42: 32.285 -> Scrieți fișierul utilizat: 9662 ms, 434.103088 KB / s 08: 42: 32.285 -> Test write /test_32k.bin 08: 42: 36.659 -> Scriere fișier folosit: 4355 ms, 963.100830 KB / s 08: 42: 36.659 -> Test write /test_64k.bin 08: 42: 39.594 -> Scriere fișier folosit: 2949 ms, 1422.280151 KB / s 08: 42: 39.594 -> Test citit /test_1k.bin 08: 42: 44.774 -> Citire fișier utilizat: 5192 ms, 807.839783 KB / s 08: 42: 44.774 -> Test citit /test_2k.bin 08: 42: 49.969 -> Citire fișier utilizat: 5189 ms, 808.306824 KB / s 08: 42: 49.969 -> Citire test /test_4k.bin 08: 42: 55.123 -> Citire fișier utilizat: 5161 ms, 812.692139 KB / s 08:42: 55.158 -> Test citit /test_8k.bin 08: 43: 00.300 -> Citit fișier folosit: 5176 ms, 810.336914 KB / s 08: 43: 00.334 -> Test citit /test_16k.bin 08: 43: 05.277 -> Citire fișier utilizat: 4948 ms, 847.676636 KB / s 08: 43: 05.277 -> Test citit /test_32k.bin 08: 43: 10.028 -> Citire fișier utilizat: 4773 ms, 878.756348 KB / s 08: 43: 10.028 -> Test citire /test_64k.bin 08: 43: 14.760 -> Citire fișier utilizat: 4731 ms, 886.557617 KB / s

Vechi 128 MB MicroSD

08: 43: 47.777 -> Test de scriere / test_1k.bin

08: 44: 04.148 -> Scriere fișier utilizat: 16390 ms, 255.906281 KB / s 08: 44: 04.183 -> Test scriere /test_2k.bin 08: 44: 20.648 -> Scriere fișier utilizat: 16494 ms, 254.292709 KB / s 08: 44: 20.648 -> Test de scriere /test_4k.bin 08: 44: 36.674 -> Scriere fișier utilizat: 16001 ms, 262.127625 KB / s 08: 44: 36.674 -> Test de scriere /test_8k.bin 08: 44: 52.849 -> Scrieți fișierul utilizat: 16175 ms, 259.307831 KB / s 08: 44: 52.849 -> Scriere test /test_16k.bin 08: 45: 09.225 -> Scrieți fișierul utilizat: 16397 ms, 255.797043 KB / s 08: 45: 09.225 -> Test write /test_32k.bin 08: 45: 25.363 -> Scrierea fișierului utilizat: 16143 ms, 259.821838 KB / s 08: 45: 25.397 -> Test write /test_64k.bin 08: 45: 41.632 -> Scrierea fișierului utilizat: 16263 ms, 257.904694 KB / s 08: 45: 41.632 -> Test citit /test_1k.bin 08: 45: 46.488 -> Citire fișier folosit: 4856 ms, 863.736389 KB / s 08: 45: 46.488 -> Test citit /test_2k.bin 08: 45: 51.332 -> Citire fișier utilizat: 4840 ms, 866.591736 KB / s 08: 45: 51.332 -> Test citire /test_4k.bin 08: 45: 56.163 -> Citire fișier utilizat: 4834 ms, 867.667358 KB / s 08:45: 56.163 -> Test citit /test_8k.bin 08: 46: 00.998 -> R ead fișier utilizat: 4827 ms, 868.925598 KB / s 08: 46: 00.998 -> Test citit /test_16k.bin 08: 46: 05.808 -> Citire fișier utilizat: 4825 ms, 869.285828 KB / s 08: 46: 05.843 -> Test citire /test_32k.bin 08: 46: 10.637 -> Citire fișier utilizat: 4824 ms, 869.466003 KB / s 08: 46: 10.637 -> Test citire /test_64k.bin 08: 46: 15.478 -> Citire fișier utilizat: 4825 ms, 869.285828 KB / s

Pasul 11: Mod SD SPI la VSPI Bus Benchmark

SanDisk 8 GB MicroSD

08: 54: 17.412 -> Test de scriere / test_1k.bin

08: 54: 48.398 -> Scriere fișier folosit: 30994 ms, 135.326324 KB / s 08: 54: 48.398 -> Test scriere /test_2k.bin 08: 55: 06.079 -> Scriere fișier utilizat: 17677 ms, 237.274658 KB / s 08: 55: 06.079 -> Test de scriere /test_4k.bin 08: 55: 13.357 -> Scriere fișier utilizat: 7274 ms, 576.615906 KB / s 08: 55: 13.357 -> Test de scriere /test_8k.bin 08: 55: 18.691 -> Scrieți fișierul utilizat: 5323 ms, 787.958679 KB / s 08: 55: 18.691 -> Scriere test /test_16k.bin 08: 55: 28.336 -> Scrieți fișierul utilizat: 9669 ms, 433.788818 KB / s 08: 55: 28.336 -> Test write /test_32k.bin 08: 55: 32.646 -> Scriere fișier folosit: 4309 ms, 973.382202 KB / s 08: 55: 32.646 -> Test write /test_64k.bin 08: 55: 35.551 -> Scriere fișier utilizat: 2915 ms, 1438.869263 KB / s 08: 55: 35.584 -> Test citit /test_1k.bin 08: 55: 40.745 -> Citire fișier utilizat: 5183 ms, 809.242554 KB / s 08: 55: 40.745 -> Test citit /test_2k.bin 08: 55: 45.916 -> Citire fișier utilizat: 5182 ms, 809.398682 KB / s 08: 55: 45.949 -> Citire test /test_4k.bin 08: 55: 51.091 -> Citire fișier utilizat: 5162 ms, 812.534668 KB / s 08:55: 51.091 -> Test citit /test_8k.bin 08: 55: 56.257 -> Citit fișier utilizat: 5177 ms, 810.180420 KB / s 08: 55: 56.293 -> Test citit /test_16k.bin 08: 56: 01.244 -> Citire fișier utilizat: 4956 ms, 846.308289 KB / s 08: 56: 01.244 -> Test citit /test_32k.bin 08: 56: 06.006 -> Citire fișier utilizat: 4764 ms, 880.416443 KB / s 08: 56: 06.006 -> Test citire /test_64k.bin 08: 56: 10.716 -> Citire fișier utilizat: 4728 ms, 887.120117 KB / s

Vechi 128 MB MicroSD

08: 51: 01.939 -> Test de scriere / test_1k.bin

08: 51: 18.358 -> Scrieți fișierul utilizat: 16422 ms, 255.407623 KB / s 08: 51: 18.358 -> Scriere test /test_2k.bin 08: 51: 34.529 -> Scrieți fișierul utilizat: 16173 ms, 259.339874 KB / s 08: 51: 34.529 -> Test de scriere /test_4k.bin 08: 51: 50.911 -> Scriere fișier utilizat: 16372 ms, 256.187653 KB / s 08: 51: 50.911 -> Test de scriere /test_8k.bin 08: 52: 07.056 -> Scrieți fișierul utilizat: 16137 ms, 259.918457 KB / s 08: 52: 07.056 -> Scriere test /test_16k.bin 08: 52: 23.383 -> Scrieți fișierul utilizat: 16351 ms, 256.516663 KB / s 08: 52: 23.383 -> Test write /test_32k.bin 08: 52: 39.533 -> Scriere fișier folosit: 16128 ms, 260.063507 KB / s 08: 52: 39.533 -> Test write /test_64k.bin 08: 52: 55.764 -> Scriere fișier utilizat: 16250 ms, 258.111023 KB / s 08: 52: 55.764 -> Test citit /test_1k.bin 08: 53: 00.645 -> Citire fișier utilizat: 4855 ms, 863.914307 KB / s 08: 53: 00.645 -> Test citit /test_2k.bin 08: 53: 05.459 -> Citire fișier utilizat: 4839 ms, 866.770813 KB / s 08: 53: 05.459 -> Test citire /test_4k.bin 08: 53: 10.306 -> Citire fișier utilizat: 4833 ms, 867.846863 KB / s 08:53: 10.306 -> Test citit /test_8k.bin 08: 53: 15.127 -> R ead fișier utilizat: 4827 ms, 868.925598 KB / s 08: 53: 15.127 -> Test citit /test_16k.bin 08: 53: 19.963 -> Citire fișier utilizat: 4826 ms, 869.105652 KB / s 08: 53: 19.963 -> Test citire /test_32k.bin 08: 53: 24.758 -> Citire fișier utilizat: 4824 ms, 869.466003 KB / s 08: 53: 24.792 -> Test citire /test_64k.bin 08: 53: 29.592 -> Citire fișier utilizat: 4824 ms, 869,466003 KB / s

Pasul 12: Rotunjește

Modul de magistrală SD pe 4 biți are cele mai bune performanțe, modul de magistrală SD pe 1 biți este cu 20% mai lent, iar modul SPI este cu aproximativ 50% mai lent. Unul dintre motivele principale este că stratul de protocol SD_MMC nu implementează niciun fel de blocare, dar SPI o face. Și, de asemenea, modul de magistrală SD pe 4 biți are linii de date duble, deci teoretic dublează viteza. Dar vechiul meu MicroSD nu poate suporta modul de magistrală SD pe 4 biți.

Voi recomanda modul de magistrală SD pe 1 biți în majoritatea cazurilor, deoarece:

  • performanță bună
  • compatibilitate mai bună a cardului SD
  • cerințe SD Pull-up mai slabe
  • sunt necesare doar 3 pini GPIO
  • configurație de cod mai mică
  • multe kit-uri dev, bord dev și bord breakout pot folosi acest mod

Recomandat: