Spisu treści:

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

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

Wideo: Wybierz interfejs SD dla ESP32: 12 kroków (ze zdjęciami)
Wideo: How to use ESP32 WiFi and Bluetooth with Arduino IDE full details with examples and code 2024, Listopad
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: