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 |
Os sinais marcados com asterisco (*) aparecem no módulos Escravos.
Uma rede com três Escravos montada com esse protocolo pode ser vista abaixo:
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.
Fonte: Folha de Informações da On Semiconductor
O CI mais conhecido para implementar uma conexão Tri State é o 74LS125 (existem muitas outras denominações, com letras diferentes de LS, e que são de tecnologias mais recentes, mas com função semelhante). A pinagem de um deles é mostrada ao lado.
Como se pode ver, é um buffer não inversor com entrada D (Data) e saída O (Out) e com um terceiro pino (E) de controle. Quando este pino é ligado ao nível lógico zero, o sinal de entrada aparece na saída; se o pino E for ligado ao nível lógico 1, a saída O fica em Tri State.
Com este tipo de dispositivo, é possível fazer algo proibido em lógica digital: interligar saídas, como mostrado a seguir.
Fonte: Autor
Neste circuito, U1 e U2 são buffers Tri State. U3 é uma porta inversora convencional. O sinal CNT (Control) determina qual dos sinais, IN#1 ou IN#2 aparecerá na saída, conforme mostra a tabela abaixo:
CNT |
OUT |
0 |
IN#1 |
1 |
IN#2 |
Quando CNT for 0 lógico, o pino de seleção de U1 faz com que este CI fique habilitado, e o sinal IN#1 apareça na saída; já U2 recebe nível lógico 1 em seu pino de seleção (o sinal CNT invertido pela porta U3), que faz com que sua saída fique em Tri State.
Quando CNT for 1 lógico, a situação anterior se inverte, desabilitando U1 e habilitando U2, fazendo com que o sinal IN#2 apareça na saída.
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.
Fonte: Internet e Autor
Num primeiro teste para solucionar o problema, conectei uma das portas de um 74LS125 externamente, como mostrado ao lado, o que funcionou perfeitamente. O problema era ter de usar mais um CI, e apenas ¼ (uma das quatro portas disponíveis) dele. O resistor de 2,2KΩ é um pull-up, para manter a linha do sinal MISO em nível lógico 1 e evitar interferências elétricas.
Finalmente, optei pela solução mostrada a seguir, que usa apenas um transistor PNP BC328 e um resistor de polarização de base. O sistema está funcionando há semanas sem apresentar falhas, quer de gravação de dados quer de leitura de temperaturas. Toda a implementação é externa ao cartão, não sendo necessárias técnicas arriscadas de cortar trilhas e levantar terminais.
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.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!