Wybierz interfejs SD dla ESP32: 12 kroków (ze zdjęciami)
Wybierz interfejs SD dla ESP32: 12 kroków (ze zdjęciami)
Anonim
Wybierz interfejs SD dla ESP32
Wybierz interfejs SD dla ESP32

Ta instrukcja pokazuje coś na temat wyboru interfejsu SD dla twojego projektu ESP32.

Krok 1: Interfejs SD

W oryginalnej bibliotece Arduino SD interfejs SD korzysta z trybu transferu magistrali SD SPI.

SD faktycznie ma więcej trybu transferu:

  • Tryb magistrali SPI: ESP32 ma więcej niż 1 magistralę SPI, można ją dostosować podczas inicjalizacji;
  • Tryb 1-bit / 4-bit szyny SD: ESP32 dedykuje inną bibliotekę o nazwie SD_MMC do implementacji API trybu szyny SD
  • Tryb SD UHS-II: ESP32 nie jest obsługiwany

Nr ref.:

www.arduino.cc/en/reference/SD

en.wikipedia.org/wiki/SD_card

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

Krok 2: Mapowanie pinów GPIO ESP32

Oto domyślne mapowanie pinów GPIO ESP32:

PIN karty SD Pin microSD Nazwa 4-bitowa magistrala SD 1-bitowa magistrala SD Magistrala SPI (piny 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 - -

Nie można zmienić mapowania pinów GPIO 1-bitowej / 4-bitowej szyny SD.

Proste wywołanie SD_MMC begin() do początkowego trybu 4-bitowej szyny SD:

SD_MMC.początek();

Tryb 1-bitowej szyny SD można wybrać w metodzie SD_MMC begin(), np.

SD_MMC.begin("/cdcard", prawda);

Magistralę SPI (HSPI lub VSPI) można wybrać podczas tworzenia instancji SPIClass, np.

SPIClass spi = SPIClass(HSPI);

Jak widać 1-bitowe / 4-bitowe piny magistrali SD współdzielą piny z HSPI, ale mapowanie pinów karty SD nie jest takie samo. Więc jeśli sprzęt jest podłączony zgodnie z mapą pinów magistrali SD, nie może bezpośrednio używać natywnych pinów HSPI. Piny GPIO można nadpisać w metodzie begin() SPIClass, np.

SPIClass spi = SPIClass(HSPI);

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

A także biblioteka SD może nadpisać pin SS, magistralę SPI i częstotliwość magistrali w metodzie SD begin(), np.

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

Krok 3: Wymagania dotyczące podciągania SD

Jeśli chcesz korzystać z 4-bitowego trybu szyny SD, postępuj zgodnie z wymaganiami ESP32 SD Pull-up, w szczególności:

  • Konflikty podciągania na GPIO13
  • Konflikty między Bootstrapem a SDIO na DAT2

Nr ref.:

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

Krok 4: Różny sprzęt

Różnego sprzętu
Różnego sprzętu

ESP32 ma mnóstwo zestawu deweloperskiego i płyty deweloperskiej, niektóre z nich mają wbudowane gniazdo kart MicroSD.

Oto kilka przykładów w mojej ręce:

  • TTGO T-Watch, podłączony do pinów 2, 13, 14 i 15 GPIO zgodnie z 1-bitowym trybem magistrali SD, dzięki czemu może korzystać z trybu 1-bitowej magistrali SD i magistrali SPI
  • Seria M5Stack, łączy się z pinami 4, 18, 19 i 23 GPIO zgodnie z natywnymi pinami VSPI, dzięki czemu może korzystać z domyślnych ustawień biblioteki SD [SD.begin(4)]
  • ODROID-GO, podłączony do pinów GPIO 18, 19, 22 i 23 zgodnie z natywnymi pinami VSPI, więc może używać domyślnych ustawień biblioteki SD [SD.begin(22)]
  • ESP32-CAM, jest podłączony do pinów GPIO 2, 4, 12, 13, 14 i 15 zgodnie z 4-bitowym trybem szyny SD, dzięki czemu może korzystać ze wszystkich 4-bitowych / 1-bitowych trybów szyny SD i trybu SPI
  • Płytka rozwojowa TTGO T8, podłączona do pinów 2, 13, 14 i 15 GPIO zgodnie z 1-bitowym trybem magistrali SD, dzięki czemu może korzystać z 1-bitowego trybu magistrali SD i trybu magistrali 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

Krok 5: Płytka zaciskowa gniazda kart SD

Płytka zaciskowa gniazda kart SD
Płytka zaciskowa gniazda kart SD
Płytka zaciskowa gniazda kart SD
Płytka zaciskowa gniazda kart SD

Płytka rozwojowa z wbudowanym gniazdem kart MicroSD może nie mieć podłączonych wszystkich pinów i większość z nich nie może korzystać z trybu 4-bitowej szyny SD. Płytka zaciskowa z indywidualnym gniazdem kart SD zapewnia większą elastyczność.

W tym samym czasie wiele tabliczek zaciskowych LCD zawiera również pełnowymiarowe gniazdo kart SD. Jednak większość z nich wyłamuje tylko piny trybu SPI. Nie wystarczy używać trybu 4-bitowej szyny SD, ale nadal możesz używać jej jako trybu 1-bitowej szyny SD za pomocą tego mapowania połączenia:

LCD -> ESP32

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

Krok 6: Odłącz GPIO 2 podczas programu

Odłącz GPIO 2 podczas programu
Odłącz GPIO 2 podczas programu

4-bitowe połączenie trybu magistrali SD sprawia, że ESP32 nie może wejść w tryb programowania. Pamiętaj o odłączeniu GPIO 2 od płytki zaciskowej gniazda karty SD DAT0 przed wgraniem nowego programu.

Krok 7: Benchmark

Reper
Reper
Reper
Reper

Napisałem prosty program Arduino do testu porównawczego:

github.com/mononournation/ESP32_SD_Benchm…

Oto sprzęt do testu porównawczego:

ESP32

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

Gniazdo kart SD

Płytka zaciskowa gniazda karty MicroSD

Karta SD

Mam w ręku kartę SanDisk 8 GB MicroSD i starą 128 MB MicroSD.

Krok 8: 4-bitowy test porównawczy trybu SD_MMC

SanDisk 8 GB MicroSD

20:27:46.000 -> Zapis testowy /test_1k.bin

20:27:59.399 -> Zapis używanego pliku: 13404 ms, 312.914368 KB/s 20:27:59.399 -> Zapis testowy /test_2k.bin 20:28:17.248 -> Zapis używanego pliku: 17834 ms, 235.185822 KB/s 20:28:17.248 -> Zapis testowy /test_4k.bin 20:28:21.122 -> Zapis używanego pliku: 3873 ms, 1082.959961 KB/s 20:28:21.122 -> Zapis testowy /test_8k.bin 20:28:23.147 -> Zapis używanego pliku: 2024 ms, 2072.284668 KB/s 20:28:23.147 -> Test zapisu /test_16k.bin 20:28:27.237 -> Zapis używanego pliku: 4097 ms, 1023.750061 KB/s 20:28:27.237 -> Test zapis /test_32k.bin 20:28:30.088 -> Zapis używanego pliku: 2842 ms, 1475.828247 KB/s 20:28:30.088 -> Zapis testowy /test_64k.bin 20:28:31.882 -> Zapis używanego pliku: 1811 ms, 2316.015381 KB/s 20:28:31.882 -> Odczyt testowy /test_1k.bin 20:28:35.422 -> Odczytany plik: 3520 ms, 1191.563599 KB/s 20:28:35.422 -> Odczyt testowy /test_2k.bin 20: 28:38.813 -> Odczytany plik: 3389 ms, 1237.622925 KB/s 20:28:38.813 -> Odczyt testowy /test_4k.bin 20:28:42.273 -> Odczytany plik: 3474 ms, 1207.341431 KB/s 20:28:42.273 -> Odczyt testowy /test_8k.bin 20:28:45.752 - > Odczytaj użyty plik: 3487 ms, 1202.840210 KB/s 20:28:45.752 -> Odczyt testowy /test_16k.bin 20:28:48.988 -> Odczytaj użyty plik: 3213 ms, 1305.416748 KB/s 20:28:48.988 -> Odczyt testowy /test_32k.bin 20:28:52.077 -> Odczytany plik: 3093 ms, 1356.063354 KB/s 20:28:52.077 -> Odczyt testowy /test_64k.bin 20:28:55.141 -> Odczytany plik: 3080 ms, 1361.786987 KB/s

Stare 128 MB MicroSD

20:30:43.309 -> E (274) sdmmc_sd: sdmmc_check_scr: send_scr zwrócił 0x109

20:30:43.309 -> Nieudane podłączenie karty

Krok 9: 1-bitowy test trybu SD_MMC

SanDisk 8 GB MicroSD

20:31:45.194 -> Zapis testowy /test_1k.bin

20:31:59.506 -> Zapis do pliku: 14325 ms, 292.796082 KB/s 20:31:59.506 -> Zapis testowy /test_2k.bin 20:32:17.686 -> Zapis do pliku: 18163 ms, 230.925735 KB/s 20:32:17.686 -> Zapis testowy /test_4k.bin 20:32:21.291 -> Zapis używanego pliku: 3611 ms, 1161.535278 KB/s 20:32:21.291 -> Zapis testowy /test_8k.bin 20:32:23.939 -> Zapis używanego pliku: 2652 ms, 1581,562622 KB/s 20:32:23.939 -> Zapis testowy /test_16k.bin 20:32:28.397 -> Zapis używanego pliku: 4448 ms, 942.964050 KB/s 20:32:28.397 -> Test zapis /test_32k.bin 20:32:31.835 -> Zapis używanego pliku: 3429 ms, 1223.185791 KB/s 20:32:31.835 -> Zapis testowy /test_64k.bin 20:32:33.882 -> Zapis używanego pliku: 2058 ms, 2038.048584 KB/s 20:32:33.882 -> Odczyt testowy /test_1k.bin 20:32:38.031 -> Odczytany plik: 4146 ms, 1011.650757 KB/s 20:32:38.031 -> Odczyt testowy /test_2k.bin 20: 32:42.062 -> Odczytaj użyty plik: 4019 ms, 1043.618774 KB/s 20:32:42.062 -> Odczytaj test /test_4k.bin 20:32:46.170 -> Odczytaj użyty plik: 4106 ms, 1021.506104 KB/s 20:32:46.170 -> Odczyt testowy /test_8k.bin 20:32:50.288 -> Użyty plik odczytu: 4121 ms, 1017.787903 KB/s 20:32:50.288 -> Odczyt testu /test_16k.bin 20:32:54.112 -> Użyty plik odczytu: 3840 ms, 1092.266724 KB/s 20:32:54.112 -> Test read /test_32k.bin 20:32:57.840 -> Odczytaj używany plik: 3739 ms, 1121.771606 KB/s 20:32:57.840 -> Test odczytu /test_64k.bin 20:33:01.568 -> Odczytaj używany plik: 3711 ms, 1130.235474 KB/s

Stare 128 MB MicroSD

20:33:27.366 -> Zapis testowy /test_1k.bin

20:33:42.386 -> Zapis do pliku: 15020 ms, 279,247925 KB/s 20:33:42.386 -> Zapis testowy /test_2k.bin 20:33:57.927 -> Zapis do pliku: 15515 ms, 270.338654 KB/s 20:33:57.927 -> Zapis testowy /test_4k.bin 20:34:13.108 -> Zapis używanego pliku: 15195 ms, 276.031860 KB/s 20:34:13.108 -> Zapis testowy /test_8k.bin 20:34:28.162 -> Zapis używanego pliku: 15048 ms, 278.728333 KB/s 20:34:28.162 -> Test zapisu /test_16k.bin 20:34:43.287 -> Zapis używanego pliku: 15142 ms, 276.998016 KB/s 20:34:43.287 -> Test zapis /test_32k.bin 20:34:58.278 -> Zapis używanego pliku: 14964 ms, 280.292969 KB/s 20:34:58.278 -> Zapis testowy /test_64k.bin 20:35:13.370 -> Zapis używanego pliku: 15101 ms, 277.750092 KB/s 20:35:13.370 -> Odczyt testowy /test_1k.bin 20:35:17.563 -> Odczytany plik: 4197 ms, 999.357666 KB/s 20:35:17.563 -> Odczyt testowy /test_2k.bin 20: 35:21.746 -> Odczytaj użyty plik: 4191 ms, 1000.788330 KB/s 20:35:21.746 -> Odczytaj test /test_4k.bin 20:35:25.942 -> Odczytaj użyty plik: 4181 ms, 1003.182007 KB/s 20:35:25.942 -> Odczyt testowy /test_8k.bin 20:35:30.101 -> Użyty plik odczytu: 4176 ms, 1004.383118 KB/s 20:35:30.101 -> Odczyt testu /test_16k.bin 20:35:34.279 -> Użyty plik odczytu: 4174 ms, 1004.864380 KB/s 20:35:34.279 -> Test read /test_32k.bin 20:35:38.462 -> Odczytaj użyty plik: 4173 ms, 1005.105225 KB/s 20:35:38.462 -> Odczytaj test /test_64k.bin 20:35:42.612 -> Odczytaj użyty plik: 4173 ms, 1005.105225 KB/s

Krok 10: Tryb SD SPI w HSPI Bus Benchmark

SanDisk 8 GB MicroSD

08:41:19.703 -> Zapis testowy /test_1k.bin

08:41:53.458 -> Zapis używanego pliku: 33743 ms, 124.301453 KB/s 08:41:53.458 -> Zapis testowy /test_2k.bin 08:42:10.000 -> Zapis używanego pliku: 16540 ms, 253.585495 KB/s 08::42:10.000 -> Zapis testowy /test_4k.bin 08:42:17.269 -> Zapis używanego pliku: 7298 ms, 574.719666 KB/s 08:42:17.308 -> Zapis testowy /test_8k.bin 08:42:22.640 -> Zapis używanego pliku: 5345 ms, 784.715454 KB/s 08:42:22.640 -> Test zapisu /test_16k.bin 08:42:32.285 -> Zapis używanego pliku: 9662 ms, 434.103088 KB/s 08:42:32.285 -> Test zapis /test_32k.bin 08:42:36.659 -> Zapis do pliku: 4355 ms, 963.100830 KB/s 08:42:36.659 -> Zapis testowy /test_64k.bin 08:42:39.594 -> Zapis do pliku: 2949 ms, 1422.280151 KB/s 08:42:39.594 -> Odczyt testowy /test_1k.bin 08:42:44.774 -> Odczytany plik: 5192 ms, 807.839783 KB/s 08:42:44.774 -> Odczyt testowy /test_2k.bin 08: 42:49.969 -> Odczytaj użyty plik: 5189 ms, 808.306824 KB/s 08:42:49.969 -> Odczytaj test /test_4k.bin 08:42:55.123 -> Odczytaj użyty plik: 5161 ms, 812.692139 KB/s 08:42:55.158 -> Odczyt testowy /test_8k.bin 08:43:00.300 -> Odczyt użyty plik: 5176 ms, 810.336914 KB/s 08:43:00.334 -> Odczyt testowy /test_16k.bin 08:43:05.277 -> Odczytany plik: 4948 ms, 847.676636 KB/s 08:43:05.277 -> Odczyt testowy /test_32k.bin 08:43:10.028 -> Odczytaj użyty plik: 4773 ms, 878.756348 KB/s 08:43:10.028 -> Odczytaj test /test_64k.bin 08:43:14.760 -> Odczytaj użyty plik: 4731 ms, 886.557617 KB/s

Stare 128 MB MicroSD

08:43:47.777 -> Zapis testowy /test_1k.bin

08:44:04.148 -> Zapis do pliku: 16390 ms, 255.906281 KB/s 08:44:04.183 -> Zapis testowy /test_2k.bin 08:44:20.648 -> Zapis do pliku: 16494 ms, 254.292709 KB/s 08:44:20.648 -> Zapis testowy /test_4k.bin 08:44:36.674 -> Zapis używany plik: 16001 ms, 262.127625 KB/s 08:44:36.674 -> Zapis testowy /test_8k.bin 08:44:52.849 -> Używany plik zapisu: 16175 ms, 259.307831 KB/s 08:44:52.849 -> Zapis testowy /test_16k.bin 08:45:09.225 -> Używany plik zapisu: 16397 ms, 255.797043 KB/s 08:45:09.225 -> Test zapis /test_32k.bin 08:45:25.363 -> Zapis używanego pliku: 16143 ms, 259.821838 KB/s 08:45:25.397 -> Zapis testowy /test_64k.bin 08:45:41.632 -> Zapis używanego pliku: 16263 ms, 257,904694 KB/s 08:45:41.632 -> Odczyt testowy /test_1k.bin 08:45:46.488 -> Odczytany plik: 4856 ms, 863.736389 KB/s 08:45:46.488 -> Odczyt testowy /test_2k.bin 08: 45:51.332 -> Odczytany plik: 4840 ms, 866.591736 KB/s 08:45:51.332 -> Odczyt testowy /test_4k.bin 08:45:56.163 -> Odczytany plik: 4834 ms, 867,667358 KB/s 08:45:56.163 -> Odczyt testowy /test_8k.bin 08:46:00.998 -> R Wykorzystany plik ead: 4827 ms, 868.925598 KB/s 08:46:00.998 -> Odczyt testu /test_16k.bin 08:46:05.808 -> Wykorzystany plik odczytu: 4825 ms, 869.285828 KB/s 08:46:05.843 -> Test read /test_32k.bin 08:46:10.637 -> Odczytaj użyty plik: 4824 ms, 869.466003 KB/s 08:46:10.637 -> Odczytaj test /test_64k.bin 08:46:15.478 -> Odczytaj użyty plik: 4825 ms, 869,285828 KB/s

Krok 11: Tryb SD SPI w VSPI Bus Benchmark

SanDisk 8 GB MicroSD

08:54:17.412 -> Zapis testowy /test_1k.bin

08:54:48.398 -> Zapis do pliku: 30994 ms, 135.326324 KB/s 08:54:48.398 -> Zapis testowy /test_2k.bin 08:55:06.079 -> Zapis do pliku: 17677 ms, 237.274658 KB/s 08:55:06.079 -> Zapis testowy /test_4k.bin 08:55:13.357 -> Zapis używany plik: 7274 ms, 576.615906 KB/s 08:55:13.357 -> Zapis testowy /test_8k.bin 08:55:18.691 -> Zapis używanego pliku: 5323 ms, 787,958679 KB/s 08:55:18.691 -> Test zapisu /test_16k.bin 08:55:28.336 -> Zapis używanego pliku: 9669 ms, 433.788818 KB/s 08:55:28.336 -> Test zapis /test_32k.bin 08:55:32.646 -> Zapis używanego pliku: 4309 ms, 973.382202 KB/s 08:55:32.646 -> Zapis testowy /test_64k.bin 08:55:35.551 -> Zapis używanego pliku: 2915 ms, 1438,869263 KB/s 08:55:35.584 -> Odczyt testowy /test_1k.bin 08:55:40.745 -> Odczytany plik: 5183 ms, 809.242554 KB/s 08:55:40.745 -> Odczyt testowy /test_2k.bin 08: 55:45.916 -> Odczytaj użyty plik: 5182 ms, 809.398682 KB/s 08:55:45.949 -> Odczytaj test /test_4k.bin 08:55:51.091 -> Odczytaj użyty plik: 5162 ms, 812.534668 KB/s 08:55:51.091 -> Odczyt testowy /test_8k.bin 08:55:56.257 -> Odczyt używany plik: 5177 ms, 810.180420 KB/s 08:55:56.293 -> Odczyt testowy /test_16k.bin 08:56:01.244 -> Odczyt używany plik: 4956 ms, 846.308289 KB/s 08:56:01.244 -> Odczyt testowy /test_32k.bin 08:56:06.006 -> Odczytaj użyty plik: 4764 ms, 880.416443 KB/s 08:56:06.006 -> Odczytaj test /test_64k.bin 08:56:10.716 -> Odczytaj użyty plik: 4728 ms, 887.120117 KB/s

Stare 128 MB MicroSD

08:51:01.939 -> Zapis testowy /test_1k.bin

08:51:18.358 -> Zapis do pliku: 16422 ms, 255.407623 KB/s 08:51:18.358 -> Zapis testowy /test_2k.bin 08:51:34.529 -> Zapis do pliku: 16173 ms, 259,339874 KB/s 08::51:34.529 -> Zapis testowy /test_4k.bin 08:51:50.911 -> Zapis używanego pliku: 16372 ms, 256.187653 KB/s 08:51:50.911 -> Zapis testowy /test_8k.bin 08:52:07.056 -> Używany plik zapisu: 16137 ms, 259.918457 KB/s 08:52:07.056 -> Zapis testowy /test_16k.bin 08:52:23.383 -> Używany plik zapisu: 16351 ms, 256.516663 KB/s 08:52:23.383 -> Test zapis /test_32k.bin 08:52:39.533 -> Zapis do pliku: 16128 ms, 260.063507 KB/s 08:52:39.533 -> Zapis testowy /test_64k.bin 08:52:55.764 -> Zapis do pliku: 16250 ms, 258.111023 KB/s 08:52:55.764 -> Odczyt testowy /test_1k.bin 08:53:00.645 -> Odczytany plik: 4855 ms, 863.914307 KB/s 08:53:00.645 -> Odczyt testowy /test_2k.bin 08: 53:05.459 -> Odczytaj użyty plik: 4839 ms, 866.770813 KB/s 08:53:05.459 -> Odczytaj test /test_4k.bin 08:53:10.306 -> Odczytaj użyty plik: 4833 ms, 867.846863 KB/s 08:53:10.306 -> Odczyt testu /test_8k.bin 08:53:15.127 -> R Wykorzystany plik ead: 4827 ms, 868.925598 KB/s 08:53:15.127 -> Odczyt testu /test_16k.bin 08:53:19.963 -> Użyty plik odczytu: 4826 ms, 869.105652 KB/s 08:53:19.963 -> Test read /test_32k.bin 08:53:24.758 -> Odczytany plik: 4824 ms, 869.466003 KB/s 08:53:24.792 -> Odczyt testowy /test_64k.bin 08:53:29.592 -> Odczytany plik: 4824 ms, 869.466003 KB/s

Krok 12: Zaokrąglaj

4-bitowy tryb szyny SD ma najlepszą wydajność, 1-bitowy tryb szyny SD jest o około 20% wolniejszy, a tryb SPI jest o około 50% wolniejszy. Jednym z głównych powodów jest to, że warstwa protokołu SD_MMC nie implementuje żadnego rodzaju blokowania, ale SPI tak. A także 4-bitowy tryb magistrali SD ma podwójne linie danych, więc teoretycznie podwaja prędkość. Ale mój stary MicroSD nie obsługuje trybu 4-bitowej szyny SD.

W większości przypadków będę polecał 1-bitową magistralę SD, ponieważ:

  • dobry występ
  • lepsza kompatybilność kart SD
  • luźniejsze wymagania SD Pull-up
  • wymagane tylko 3 piny GPIO
  • mniejsza konfiguracja kodu
  • wiele zestawów deweloperskich, tablic deweloperskich i tabliczek typu breakout może korzystać z tego trybu

Zalecana: