



Os módulos para cartões de memória SD (Secure Digital, algo como Digital e Seguro) utilizados em sistemas microcontrolados como Arduino, ESP32, PIC, etc., são necessários geralmente quando se deseja armazenar dados, como em um data logger (registrador de dados). Esse tipo de cartão de memória utiliza exclusivamente tensões de 3,3V, tanto para alimentação como para sinais de comunicação (existem diversos blogs que mostram como interligar dispositivos de 3,3V como estes ao Arduino ou ao PIC, que trabalham com 5V; ligações diretas a 5V danificam esses dispositivos!). O protocolo de comunicação utilizado é o SPI (Serial Peripheral Interface ou Interface Serial para Periféricos). Quando se pretende utilizar esse tipo de módulo juntamente com outros dispositivos SPI, podem ocorrer problemas, que serão descritos a seguir, juntamente com uma possível solução.
Em primeiro lugar, vamos apresentar de forma rápida como funciona o protocolo de comunicação SPI, que é composto de dois sinais de comunicação (MISO e MOSI) um de sincronismo ou clock (SCK) e um de seleção (CS). O SPI é um método de comunicação serial que permite implementar uma rede entre um único microcontrolador (denominado Master - Mestre) e um ou mais periféricos (denominados Slaves – Escravos). O conceito de Mestre e Escravo é simples: nenhum Escravo toma a iniciativa de falar com o Mestre; é sempre o Mestre quem solicita ou envia algo para o Escravo. Sua utilização é restrita a curtas distâncias, geralmente dentro de um mesmo equipamento (como nos sistemas embarcados). Os sinais de comunicação e sincronismo são partilhados por todos os dispositivos da rede, mas existe um sinal único de seleção (CS) para cada Escravo. Mais detalhes sobre esse tipo de interface podem ser encontrados no link abaixo:
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface
São utilizados basicamente dois tipo de nomenclatura para os sinais deste protocolo:|
MISO SDO* |
Master In Slave Out Serial Data Out |
Entrada do Mestre Saída do Escravo Dados Seriais de Saída do Escravo |
Sinal único de entrada do Mestre, que recebe dados enviados pelos Escravos |
|
MOSI SDI* |
Master Out Slave In Serial Data In |
Saída do Mestre Entrada do Escravo Dados Seriais de Entrada do Escravo |
Sinal único de saída do Mestre, que enviada dados para os Escravos |
|
SCK SCLK* |
Serial Clock (Out) Serial Clock (In) |
Sinal de Sincronismo Pode aparecer também como CLK |
Sinal único enviado pelo Mestre, utilizado para sincronizar a comunicação entre o Mestre e os Escravos |
|
SS CS* |
Slave Select Chip Select |
Seleção de Escravo Seleção de Dispositivo |
Existe um sinal deste tipo para cada um dos Escravos utilizados |
Como os sinais MOSI e MISO são comuns a todos os dispositivos é necessário selecionar com qual Escravo o Mestre quer falar, o que é feito através dos sinais SS. Uma forma de compreender esse processo é descrita a seguir.
Imagine que você está em uma sala com mais três pessoas, e que todas têm relógios. Se você perguntar “Que horas são?” corre o risco de receber três respostas, e pode não compreende-las, pois as palavras estarão embaralhadas. Mas se você perguntar “João, que horas são?” você direcionou a pergunta a apenas uma das pessoas, e deverá ter apenas uma resposta. Isso é o que faz o sinal de seleção SS: habilita apenas um dos dispositivos SPI Escravos conectados à rede para enviar respostas para o Mestre. Embora todos “escutem” a pergunta feita pelo Mestre, apenas um estará habilitado (selecionado) para responder. A forma utilizada para isolar os dispositivos Escravos é uma técnica chamada Tri State no sentido de Terceiro Estado lógico. Como sabemos, os dois estados lógicos são 0 (terra ou zero volt) e 1 (Vcc, 5V ou, no caso de cartões SD, 3,3V). O Terceiro Estado é uma situação de alta impedância (geralmente representada por Z) ou alta isolação, tanto do terra quanto de Vcc. Esses três estados podem ser associados às três posições de um interruptor como o mostrado abaixo:
Em resumo: quando um dispositivo está em Tri State ele está isolado eletricamente do sistema ao qual está ligado. Todos os dispositivos SPI Escravos, se não forem habilitados por um sinal de seleção (SS ou CS), têm (ou deveriam ter) seus terminais MOSI, MISO e SCK em Tri State, ou seja, completamente isolados dos outros módulos.


|
CNT |
OUT |
|
0 |
IN#1 |
|
1 |
IN#2 |
Em meu projeto, eu precisava interligar dois módulos MAX31865 (interfaces de sensores de temperatura tipo Pt100) e um módulo para cartão SD, todos SPI. Isoladamente, os dois módulos MAX31865 funcionavam normalmente, assim como o módulo SD. Mas se os três fossem ligados juntos, os módulos MAX31865 deixavam de funcionar.
Após muita pesquisa, encontrei blogs que relatavam problemas semelhantes e mostravam o diagrama interno do módulo SD e algumas soluções:
https://forum.arduino.cc/t/spi-sd-card-reader-other-spi-device-not-working-together/447006
https://forum.arduino.cc/t/solved-nrf24-mirf-lib-micro-sd-card-works-ok-together/347787/16
Analisando o diagrama do módulo do cartão SD, podemos entender porque aconteceu a interferência deste módulo nos outros.
Seria de esperar que os sinais de habilitação (pinos 1, 4, 10 e 13) das portas de IC1, 74LVC125A (equivalente em função ao 74LS125) fossem controlados pelo CS fornecido pelo microcontrolador, conforme o diagrama mostrado anteriormente, ou seja, só quando o módulo fosse solicitado os terminais MISO, MOSI e CLK seriam efetivamente interligados ao microcontrolador. Da forma como o circuito foi implementado, com o pino de habilitação ligado ao terra, as portas estão sempre habilitadas, e servem apenas como conversor de nível de 5V para 3,3V e vice versa.
Para os sinais de entrada dos módulos (MOSI e CLK) isso não causava problema. No entanto o sinal de saída (MISO) desse módulo fica permanentemente em nível baixo, o que afetava os sinais de saída dos módulos MAX31865 (ver oscilogramas mais adiante), que por isso deixavam de se comunicar com o microcontrolador (a linha de comunicação MISO ficava sempre em nível baixo).
Algumas das soluções que encontrei na Internet recomendavam que fossem feitas alterações no módulo SD (desconectar o pino 13 de IC1 do terra e ligá-lo ao CS foi a mais adequada), mas isso é um pouco difícil em um cartão com componentes SMD.

A forma como o transistor foi utilizado não é muito convencional, pois ele é polarizado apenas quando os sinais (MISO/SDO e CS) ocorrem, mas o funcionamento foi adequado. Ficou faltando testar com um transistor MOS canal P, que eu tinha disponível no momento.
Os oscilogramas a seguir demonstram o problema e o funcionamento correto após a solução.

Vimos nesse artigo aprendemos bastante sobre comunicação SPI, Tristate e como solucionar o problema que ocorre com o módulo cartão SD. Caso a leitura tenha sido útil para você, e você deseja mais dicas como esta, nos siga no instagram @eletrogate. Lá você vai encontrar muitos conteúdos como este. Se você caiu de paraquedas e não conhece o blog da Eletrogate, te recomendo a visitar outros posts. Temos vários outros posts muito ricos de informação. Muito obrigado por ter lido até aqui, Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
Você já tentou utilizar um cartão SD juntamente com outros componentes SPI e eles não funcionaram? Este post é para você!
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200