Índice:

Selecione a interface SD para ESP32: 12 etapas (com imagens)
Selecione a interface SD para ESP32: 12 etapas (com imagens)
Anonim
Selecione a interface SD para ESP32
Selecione a interface SD para ESP32

Estes instructables mostram algo sobre como selecionar uma interface SD para seu projeto ESP32.

Etapa 1: Interface SD

Na biblioteca Arduino SD original, a interface SD usa o modo de transferência de barramento SD SPI.

SD realmente tem mais modo de transferência:

  • Modo de barramento SPI: ESP32 tem mais de 1 barramento SPI, ele pode personalizar durante a inicialização
  • Modo de barramento SD de 1 bit / 4 bits: ESP32 dedica outra biblioteca chamada SD_MMC para implementar a API do modo de barramento SD
  • Modo SD UHS-II: ESP32 não compatível

Ref.:

www.arduino.cc/en/reference/SD

en.wikipedia.org/wiki/SD_card

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

Etapa 2: Mapeamento de pinos GPIO ESP32

Aqui está o mapeamento de pinos GPIO ESP32 padrão:

PIN do cartão SD Pino MicroSD Nome Bus SD de 4 bits Barramento SD de 1 bit Barramento SPI (pinos 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,3 V 3,3 V 3,3 V
5 5 CLK 14 14 SCK (14/18)
6 6 VSS GND GND GND
7 7 D0 2 2 MISO (19/12)
8 8 D1 4 - -
9 1 D2 12 - -

O mapeamento dos pinos GPIO do barramento SD de 1/4 bits não pode ser alterado.

Chamada simples SD_MMC begin () para o modo de barramento SD de 4 bits inicial:

SD_MMC.begin ();

O modo de barramento SD de 1 bit pode ser selecionado no método SD_MMC begin (), por exemplo

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

O barramento SPI (HSPI ou VSPI) pode ser selecionado ao criar a instância SPIClass, por exemplo, SPIClass spi = SPIClass (HSPI);

Como você pode ver, os pinos do barramento SD de 1/4 bits compartilham pinos com HSPI, mas o mapeamento dos pinos do cartão SD não é o mesmo. Portanto, se o hardware estiver conectado de acordo com o mapa de pinos do barramento SD, ele não poderá usar diretamente os pinos nativos HSPI. Os pinos GPIO podem ser substituídos no método SPIClass begin (), por exemplo, SPIClass spi = SPIClass (HSPI);

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

E também a biblioteca SD pode substituir o pino SS, barramento SPI e frequência de barramento no método SD begin (), por exemplo, SD.begin (13 / * SS * /, spi, 80000000);

Etapa 3: Requisitos de SD pull-up

Se você quiser usar o modo de barramento SD de 4 bits, siga os Requisitos de pull-up do SD ESP32, especialmente:

  • Conflitos de pull-up no GPIO13
  • Conflitos entre Bootstrap e SDIO em DAT2

Ref.:

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

Etapa 4: Vários Hardware

Vários Hardware
Vários Hardware

ESP32 tem toneladas de dev kit e dev board, alguns deles com slot de cartão MicroSD embutido.

Aqui estão alguns exemplos em minhas mãos:

  • TTGO T-Watch, é conectado aos pinos 2, 13, 14 e 15 do GPIO de acordo com o modo de barramento SD de 1 bit, para que possa usar o modo de barramento SD de 1 bit e o modo de barramento SPI
  • Série M5Stack, conectado aos pinos 4, 18, 19 e 23 GPIO de acordo com os pinos nativos VSPI, para que possa usar as configurações padrão da biblioteca SD [SD.begin (4)]
  • ODROID-GO, ele se conecta aos pinos GPIO 18, 19, 22 e 23 de acordo com os pinos nativos VSPI, para que possa usar as configurações padrão da biblioteca SD [SD.begin (22)]
  • ESP32-CAM, é conectado aos pinos 2, 4, 12, 13, 14 e 15 GPIO de acordo com o modo de barramento SD de 4 bits, para que possa usar todos os modos de barramento SD de 4 bits / 1 bit e SPI
  • Placa dev TTGO T8, conectada aos pinos GPIO 2, 13, 14 e 15 de acordo com o modo de barramento SD de 1 bit, para que possa usar o modo de barramento SD de 1 bit e o modo de barramento 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

Etapa 5: Placa de abertura do slot do cartão SD

Placa de fuga de slot de cartão SD
Placa de fuga de slot de cartão SD
Placa de fuga de slot de cartão SD
Placa de fuga de slot de cartão SD

A placa Dev com slot de cartão MicroSD integrado pode não conectar todos os pinos e a maioria não pode usar o modo de barramento SD de 4 bits. Uma placa de breakout de slot de cartão SD individual fornece melhor flexibilidade.

Ao mesmo tempo, muitas placas breakout de LCD também abrem um slot de cartão SD de tamanho completo. No entanto, a maioria deles apenas quebra os pinos do modo SPI. Não é suficiente usar como modo de barramento SD de 4 bits, mas você ainda pode usá-lo como modo de barramento SD de 1 bit por este mapeamento de conexão:

LCD -> ESP32

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

Etapa 6: desanexar GPIO 2 enquanto programa

Destacar GPIO 2 While Program
Destacar GPIO 2 While Program

A conexão do modo de barramento SD de 4 bits faz com que o ESP32 falhe ao entrar no modo de programa. Lembre-se de desconectar o GPIO 2 da placa de breakout do slot de cartão SD DAT0 antes de carregar o novo programa.

Etapa 7: Comparativo de mercado

Benchmark
Benchmark
Benchmark
Benchmark

Escrevi um programa Arduino simples para o benchmark:

github.com/moononournation/ESP32_SD_Benchm…

Aqui está o hardware para o benchmark:

ESP32

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

Slot para cartão SD

Uma placa de breakout de slot para cartão MicroSD

Cartão SD

Eu tenho um SanDisk 8 GB MicroSD e um antigo 128 MB MicroSD em mãos.

Etapa 8: Benchmark do modo SD_MMC de 4 bits

SanDisk 8 GB MicroSD

20: 27: 46.000 -> Gravação de teste /test_1k.bin

20: 27: 59.399 -> Arquivo de gravação usado: 13404 ms, 312,914368 KB / s 20: 27: 59.399 -> Gravação de teste /test_2k.bin 20: 28: 17,248 -> Arquivo de gravação usado: 17834 ms, 235,185822 KB / s 20: 28: 17.248 -> Gravação de teste /test_4k.bin 20: 28: 21.122 -> Arquivo de gravação usado: 3873 ms, 1082.959961 KB / s 20: 28: 21.122 -> Gravação de teste /teste_8k.bin 20: 28: 23,147 -> Arquivo de gravação usado: 2.024 ms, 2.072,284668 KB / s 20: 28: 23.147 -> Teste de gravação /test_16k.bin 20: 28: 27,237 -> Arquivo de gravação usado: 4.097 ms, 1.023,750061 KB / s 20: 28: 27,237 -> Teste write /test_32k.bin 20: 28: 30.088 -> Gravar arquivo usado: 2842 ms, 1475.828247 KB / s 20: 28: 30.088 -> Test write /test_64k.bin 20: 28: 31.882 -> Gravar arquivo usado: 1811 ms, 2316,015381 KB / s 20: 28: 31.882 -> Leitura de teste /teste_1k.bin 20: 28: 35.422 -> Arquivo de leitura usado: 3520 ms, 1191,563599 KB / s 20: 28: 35,422 -> Leitura de teste /teste_2k.bin 20: 28: 38.813 -> Arquivo de leitura usado: 3389 ms, 1237,622925 KB / s 20: 28: 38.813 -> Leitura de teste /test_4k.bin 20: 28: 42,273 -> Arquivo de leitura usado: 3474 ms, 1207,341431 KB / s 20:28: 42,273 -> Teste lido /test_8k.bin 20: 28: 45,752 - > Arquivo de leitura usado: 3487 ms, 1202,840210 KB / s 20: 28: 45,752 -> Leitura de teste /test_16k.bin 20: 28: 48,988 -> Arquivo de leitura usado: 3213 ms, 1305,416748 KB / s 20: 28: 48,988 -> Teste de leitura /test_32k.bin 20: 28: 52.077 -> Arquivo de leitura usado: 3093 ms, 1356,063354 KB / s 20: 28: 52.077 -> Teste de leitura /test_64k.bin 20: 28: 55,141 -> Arquivo de leitura usado: 3080 ms, 1361,786987 KB / s

MicroSD antigo de 128 MB

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

20: 30: 43.309 -> Falha na montagem do cartão

Etapa 9: Benchmark do modo SD_MMC de 1 bit

SanDisk 8 GB MicroSD

20: 31: 45,194 -> Gravação de teste /test_1k.bin

20: 31: 59.506 -> Arquivo de gravação usado: 14325 ms, 292,796082 KB / s 20: 31: 59.506 -> Gravação de teste /test_2k.bin 20: 32: 17.686 -> Arquivo de gravação usado: 18163 ms, 230,925735 KB / s 20: 32: 17.686 -> Gravação de teste /test_4k.bin 20: 32: 21,291 -> Arquivo de gravação usado: 3611 ms, 1161.535278 KB / s 20: 32: 21,291 -> Gravação de teste /teste_8k.bin 20: 32: 23,939 -> Arquivo de gravação usado: 2.652 ms, 1581,562622 KB / s 20: 32: 23,939 -> Teste de gravação /test_16k.bin 20: 32: 28,397 -> Arquivo de gravação usado: 4448 ms, 942,964050 KB / s 20: 32: 28,397 -> Teste write /test_32k.bin 20: 32: 31.835 -> Gravar arquivo usado: 3429 ms, 1223,185791 KB / s 20: 32: 31.835 -> Test write /test_64k.bin 20: 32: 33.882 -> Gravar arquivo usado: 2058 ms, 2038,048584 KB / s 20: 32: 33,882 -> Leitura de teste /test_1k.bin 20: 32: 38,031 -> Arquivo de leitura usado: 4146 ms, 1011,650757 KB / s 20: 32: 38,031 -> Leitura de teste /test_2k.bin 20: 32: 42.062 -> Arquivo de leitura usado: 4019 ms, 1043,618774 KB / s 20: 32: 42.062 -> Leitura de teste /test_4k.bin 20: 32: 46.170 -> Arquivo de leitura usado: 4106 ms, 1021,506104 KB / s 20:32: 46.170 -> Leitura de teste /test_8k.bin 20: 32: 50.288 -> Arquivo de leitura usado: 4121 ms, 1017,787903 KB / s 20: 32: 50,288 -> Teste lido /test_16k.bin 20: 32: 54,112 -> Arquivo lido usado: 3840 ms, 1092,266724 KB / s 20: 32: 54,112 -> Teste ler /test_32k.bin 20: 32: 57.840 -> Ler arquivo usado: 3739 ms, 1121.771606 KB / s 20: 32: 57.840 -> Teste ler /test_64k.bin 20: 33: 01.568 -> Ler arquivo usado: 3711 ms, 1130,235474 KB / s

MicroSD antigo de 128 MB

20: 33: 27.366 -> Gravação de teste /test_1k.bin

20: 33: 42.386 -> Arquivo de gravação usado: 15020 ms, 279,247925 KB / s 20: 33: 42.386 -> Gravação de teste /test_2k.bin 20: 33: 57.927 -> Arquivo de gravação usado: 15515 ms, 270,338654 KB / s 20: 33: 57.927 -> Gravação de teste /teste_4k.bin 20: 34: 13.108 -> Arquivo de gravação usado: 15195 ms, 276,031860 KB / s 20: 34: 13.108 -> Gravação de teste /teste_8k.bin 20: 34: 28,162 -> Arquivo de gravação usado: 15048 ms, 278,728333 KB / s 20: 34: 28,162 -> Teste de gravação /test_16k.bin 20: 34: 43.287 -> Arquivo de gravação usado: 15142 ms, 276,998016 KB / s 20: 34: 43,287 -> Teste write /test_32k.bin 20: 34: 58,278 -> Gravar arquivo usado: 14964 ms, 280,292969 KB / s 20: 34: 58,278 -> Test write /test_64k.bin 20: 35: 13.370 -> Gravar arquivo usado: 15101 ms, 277,750092 KB / s 20: 35: 13,370 -> Leitura de teste /teste_1k.bin 20: 35: 17.563 -> Arquivo de leitura usado: 4197 ms, 999,357666 KB / s 20: 35: 17,563 -> Leitura de teste /teste_2k.bin 20: 35: 21.746 -> Arquivo de leitura usado: 4191 ms, 1000,788330 KB / s 20: 35: 21.746 -> Leitura de teste /test_4k.bin 20: 35: 25.942 -> Arquivo de leitura usado: 4181 ms, 1003,182007 KB / s 20:35: 25.942 -> Leitura de teste /test_8k.bin 20: 35: 30.101 -> Arquivo de leitura usado: 4176 ms, 1004,383118 KB / s 20: 35: 30.101 -> Teste lido /test_16k.bin 20: 35: 34,279 -> Arquivo lido usado: 4174 ms, 1004,864380 KB / s 20: 35: 34,279 -> Teste ler /test_32k.bin 20: 35: 38.462 -> Ler arquivo usado: 4173 ms, 1005.105225 KB / s 20: 35: 38.462 -> Teste ler /test_64k.bin 20: 35: 42.612 -> Ler arquivo usado: 4173 ms, 1005,105225 KB / s

Etapa 10: Modo SD SPI em HSPI Bus Benchmark

SanDisk 8 GB MicroSD

08: 41: 19.703 -> Gravação de teste /test_1k.bin

08: 41: 53.458 -> Arquivo de gravação usado: 33743 ms, 124,301453 KB / s 08: 41: 53.458 -> Gravação de teste /test_2k.bin 08: 42: 10.000 -> Arquivo de gravação usado: 16540 ms, 253,585495 KB / s 08: 42: 10.000 -> Gravação de teste /test_4k.bin 08: 42: 17.269 -> Arquivo de gravação usado: 7298 ms, 574,719666 KB / s 08: 42: 17.308 -> Gravação de teste /teste_8k.bin 08: 42: 22.640 -> Arquivo de gravação usado: 5345 ms, 784,715454 KB / s 08: 42: 22,640 -> Gravação de teste /test_16k.bin 08: 42: 32,285 -> Arquivo de gravação usado: 9662 ms, 434,103088 KB / s 08: 42: 32,285 -> Teste write /test_32k.bin 08: 42: 36.659 -> Gravar arquivo usado: 4355 ms, 963.100830 KB / s 08: 42: 36.659 -> Test write /test_64k.bin 08: 42: 39.594 -> Gravar arquivo usado: 2949 ms, 1422,280151 KB / s 08: 42: 39,594 -> Leitura de teste /test_1k.bin 08: 42: 44,774 -> Arquivo de leitura usado: 5192 ms, 807,839783 KB / s 08: 42: 44,774 -> Leitura de teste /test_2k.bin 08: 42: 49,969 -> Arquivo de leitura usado: 5189 ms, 808,306824 KB / s 08: 42: 49,969 -> Leitura de teste /test_4k.bin 08: 42: 55.123 -> Arquivo de leitura usado: 5161 ms, 812,692139 KB / s 08:42: 55.158 -> Leitura de teste /test_8k.bin 08: 43: 00.300 -> Leitura arquivo usado: 5176 ms, 810,336914 KB / s 08: 43: 00.334 -> Leitura de teste /test_16k.bin 08: 43: 05.277 -> Arquivo de leitura usado: 4948 ms, 847,676636 KB / s 08: 43: 05,277 -> Leitura de teste /test_32k.bin 08: 43: 10.028 -> Arquivo de leitura usado: 4773 ms, 878,756348 KB / s 08: 43: 10.028 -> Leitura de teste /test_64k.bin 08: 43: 14.760 -> Arquivo de leitura usado: 4731 ms, 886.557617 KB / s

MicroSD antigo de 128 MB

08: 43: 47.777 -> Teste de gravação /test_1k.bin

08: 44: 04.148 -> Arquivo de gravação usado: 16.490 ms, 255.906281 KB / s 08: 44: 04.183 -> Gravação de teste /test_2k.bin 08: 44: 20.648 -> Arquivo de gravação usado: 16494 ms, 254,292709 KB / s 08: 44: 20.648 -> Gravação de teste /test_4k.bin 08: 44: 36.674 -> Arquivo de gravação usado: 16001 ms, 262.127625 KB / s 08: 44: 36.674 -> Gravação de teste /test_8k.bin 08: 44: 52.849 -> Arquivo de gravação usado: 16175 ms, 259,307831 KB / s 08: 44: 52,849 -> Teste de gravação /test_16k.bin 08: 45: 09,225 -> Arquivo de gravação usado: 16397 ms, 255,797043 KB / s 08: 45: 09,225 -> Teste write /test_32k.bin 08: 45: 25.363 -> Gravar arquivo usado: 16143 ms, 259,821838 KB / s 08: 45: 25.397 -> Test write /test_64k.bin 08: 45: 41.632 -> Gravar arquivo usado: 16263 ms, 257,904694 KB / s 08: 45: 41,632 -> Leitura de teste /test_1k.bin 08: 45: 46,488 -> Arquivo lido usado: 4856 ms, 863,736389 KB / s 08: 45: 46,488 -> Leitura de teste /test_2k.bin 08: 45: 51.332 -> Arquivo de leitura usado: 4840 ms, 866.591736 KB / s 08: 45: 51.332 -> Leitura de teste /test_4k.bin 08: 45: 56.163 -> Arquivo de leitura usado: 4834 ms, 867.667358 KB / s 08:45: 56.163 -> Leitura de teste /test_8k.bin 08: 46: 00.998 -> R Arquivo ead usado: 4827 ms, 868,925598 KB / s 08: 46: 00.998 -> Teste lido /test_16k.bin 08: 46: 05.808 -> Arquivo lido usado: 4825 ms, 869,285828 KB / s 08: 46: 05,843 -> Teste read /test_32k.bin 08: 46: 10.637 -> Ler arquivo usado: 4824 ms, 869,466003 KB / s 08: 46: 10.637 -> Teste ler /test_64k.bin 08: 46: 15.478 -> Ler arquivo usado: 4825 ms, 869,285828 KB / s

Etapa 11: Modo SD SPI no VSPI Bus Benchmark

SanDisk 8 GB MicroSD

08: 54: 17.412 -> Gravação de teste /test_1k.bin

08: 54: 48.398 -> Arquivo de gravação usado: 30994 ms, 135,326324 KB / s 08: 54: 48.398 -> Gravação de teste /test_2k.bin 08: 55: 06.079 -> Arquivo de gravação usado: 17677 ms, 237,274658 KB / s 08: 55: 06.079 -> Gravação de teste /test_4k.bin 08: 55: 13.357 -> Arquivo de gravação usado: 7274 ms, 576.615906 KB / s 08: 55: 13.357 -> Gravação de teste /teste_8k.bin 08: 55: 18.691 -> Arquivo de gravação usado: 5323 ms, 787,958679 KB / s 08: 55: 18.691 -> Teste de gravação /test_16k.bin 08: 55: 28,336 -> Arquivo de gravação usado: 9669 ms, 433,788818 KB / s 08: 55: 28,336 -> Teste write /test_32k.bin 08: 55: 32.646 -> Gravar arquivo usado: 4309 ms, 973.382202 KB / s 08: 55: 32.646 -> Test write /test_64k.bin 08: 55: 35.551 -> Gravar arquivo usado: 2.915 ms, 1438,869263 KB / s 08: 55: 35,584 -> Leitura de teste /test_1k.bin 08: 55: 40,745 -> Arquivo de leitura usado: 5183 ms, 809,242554 KB / s 08: 55: 40,745 -> Leitura de teste /test_2k.bin 08: 55: 45,916 -> Arquivo de leitura usado: 5182 ms, 809,398682 KB / s 08: 55: 45,949 -> Leitura de teste /test_4k.bin 08: 55: 51,091 -> Arquivo de leitura usado: 5162 ms, 812,534668 KB / s 08:55: 51.091 -> Leitura de teste /test_8k.bin 08: 55: 56.257 -> Leitura arquivo usado: 5177 ms, 810,180420 KB / s 08: 55: 56,293 -> Teste lido /test_16k.bin 08: 56: 01,244 -> Arquivo lido usado: 4956 ms, 846,308289 KB / s 08: 56: 01,244 -> Teste lido /test_32k.bin 08: 56: 06.006 -> Arquivo de leitura usado: 4764 ms, 880.416443 KB / s 08: 56: 06.006 -> Leitura de teste /test_64k.bin 08: 56: 10.716 -> Arquivo de leitura usado: 4728 ms, 887.120117 KB / s

MicroSD antigo de 128 MB

08: 51: 01.939 -> Gravação de teste /test_1k.bin

08: 51: 18.358 -> Arquivo de gravação usado: 16422 ms, 255,407623 KB / s 08: 51: 18.358 -> Gravação de teste /test_2k.bin 08: 51: 34.529 -> Arquivo de gravação usado: 16173 ms, 259,339874 KB / s 08: 51: 34.529 -> Gravação de teste /test_4k.bin 08: 51: 50.911 -> Arquivo de gravação usado: 16372 ms, 256,187653 KB / s 08: 51: 50.911 -> Gravação de teste /test_8k.bin 08: 52: 07.056 -> Arquivo de gravação usado: 16137 ms, 259,918457 KB / s 08: 52: 07.056 -> Teste de gravação /test_16k.bin 08: 52: 23.383 -> Arquivo de gravação usado: 16351 ms, 256,516663 KB / s 08: 52: 23,383 -> Teste write /test_32k.bin 08: 52: 39.533 -> Gravar arquivo usado: 16128 ms, 260.063507 KB / s 08: 52: 39.533 -> Gravar teste /test_64k.bin 08: 52: 55.764 -> Gravar arquivo usado: 16250 ms, 258,111023 KB / s 08: 52: 55,764 -> Leitura de teste /test_1k.bin 08: 53: 00.645 -> Arquivo de leitura usado: 4855 ms, 863,914307 KB / s 08: 53: 00,645 -> Leitura de teste /test_2k.bin 08: 53: 05.459 -> Arquivo de leitura usado: 4839 ms, 866,770813 KB / s 08: 53: 05.459 -> Leitura de teste /test_4k.bin 08: 53: 10.306 -> Arquivo de leitura usado: 4833 ms, 867,846863 KB / s 08:53: 10.306 -> Leitura de teste /test_8k.bin 08: 53: 15.127 -> R Arquivo ead usado: 4827 ms, 868,925598 KB / s 08: 53: 15,127 -> Teste lido /test_16k.bin 08: 53: 19,963 -> Arquivo lido usado: 4826 ms, 869,105652 KB / s 08: 53: 19,963 -> Teste read /test_32k.bin 08: 53: 24.758 -> Ler arquivo usado: 4824 ms, 869,466003 KB / s 08: 53: 24.792 -> Teste ler /test_64k.bin 08: 53: 29.592 -> Ler arquivo usado: 4824 ms, 869,466003 KB / s

Etapa 12: arredondamento

O modo de barramento SD de 4 bits tem melhor desempenho, o modo de barramento SD de 1 bit é cerca de 20% mais lento e o modo SPI é cerca de 50% mais lento. Um dos principais motivos é que a camada de protocolo SD_MMC não implementa nenhum tipo de bloqueio, mas o SPI sim. E também o modo de barramento SD de 4 bits tem linhas de dados duplas, então, teoricamente, o dobro da velocidade. Mas meu antigo MicroSD não suporta o modo de barramento SD de 4 bits.

Recomendarei o modo de barramento SD de 1 bit na maioria dos casos, porque:

  • Boa performance
  • melhor compatibilidade com cartão SD
  • requisitos mais flexíveis de SD Pull-up
  • apenas 3 pinos GPIO necessários
  • menor configuração de código
  • muitos dev kit, dev board e breakout board podem usar este modo

Recomendado: