PROBLEMA COM 2 DISPOSITIVOS SPI TRABALHANDO JUNTOS

Boa noite,

Estou montando uma aplicação com usando um CI medidor de potência o CS 5463, e um gravador de cartão SD para criar um log das leituras, o modelo do shield é este: http://blog.filipeflop.com/modulos/cartao-sd-com-arduino.html

Fiz as ligações da seguinte forma:

A princípio funcionou perfeitamente, consegui gravar logs, como por exemplo este em anexo.

Mas agora começou a apresentar erro, com o módulo conectado e sem o cartão o sistema mostra as leituras no display perfeitamente, ao inserir o cartão SD quando realiza a primeira gravação (está configurado para gravar a cada 10s) as leituras ficam completamente descontroladas oscilando em valores absurdos.

Já verifiquei os pinos CS e parece que estão corretos cada um fica ativo em um tempo sem ficarem ativos juntos.

Tentei ligar usando divisores de tensão em cada pino, mas também não funcionou. Percebi que o pino MISO do SD fica sempre em nível auto, mesmo colocando o pino CS em nível alto, que deveria desativar o SD. Li em um site que poderia utilizar um buffer triestate, ainda não testei pois tenho que comprar o CI 74LS125.
Se alguém tiver uma ideia ou dica agradeço a ajuda, já não sei mais o que testar pra isso funcionar.

LEITURAS.TXT (4.06 KB)

O que canal verde do osciloscópio? Isso não será bug no código, uma vez que já funcionou e depois deixou de funcionar?

O canal verde é o pino CS do módulo SD, o amarelo é o pino CS do CS5463 como estou acessando 6 registradores ele tem 6 ativações.
Também pensei no código, que eu poderia ter alterado alguma coisa acidentalmente, mas testei com uma versão anterior do código que funcionava perfeitamente, porém também não funcionou, testei também com outro CS5463 novo.

Quando dizes as leituras referes-te as leituras no cartao? Ou as leituras que envias para o display?

Uma coisa que a mim me parece obvia e o facto de, se comecares o sistema com o cartao inserido, o Arduino corre algum codigo de setup uma vez no cartao e continua feliz da vida.

Se iniciares o sistema sem o cartao e depois inserires um cartao, esse mesmo codigo de setup pode nao ser executado.
Eu nao vi o codigo, logo isto pode ou nao ser verdade... mas nada como experimentares ou reveres o que se passa com a inicializacao do cartao.

Então o código é enorme está em anexo, vamos as partes que dizem respeito ao cartão.

O que é gravado no cartão são as leituras que estão sendo escritas no display, que estão nas variáveis. Eu coloco o cartão e dou um reset no arduino para começar a gravar, eu queria realmente que gravasse sem precisar do reset, ligar o sistema e depois colocar o cartão mas não consegui isso.
Se eu ligo o sistema sem o cartão, as leituras ficam normais, quando coloco o cartão e dou reset ou quando coloco o cartão e ligo o sistema, as leituras ficam normais nos primeiros 10 segundos, acredito que seja antes da primeira gravação no cartão, depois disso ficam todas embaralhadas no display, o log é criado no cartão porém com os valores iguais aos do display.

esse é parte do código:

#include <SD.h>//biblioteca para o gravador de cartao
.
.
.

File myFile;
.
.
.
SD.begin(CS);
.
.
.
pinMode(CS, OUTPUT); //Define o pino 9 como CS do cartão SD
digitalWrite(CS, HIGH); //Define o pino como nível alto para manter o SD desativado
.
.
.

int grava_log(){ //função que grava o log

myFile = SD.open("LEITURAS.txt", FILE_WRITE);

 if (myFile) {
 myFile.print(Tensao*M_Tensao);
 myFile.print("V      ");
 myFile.print(Corrente*M_Corrente);
 myFile.print("A      ");
 myFile.print(P_Real*M_P_Real);
 myFile.print("W      ");
 myFile.print(FP*M_FP);
 myFile.print("    ");
 myFile.print(rtc.getDateStr(FORMAT_SHORT));
 myFile.print("    ");
 myFile.print(rtc.getTimeStr());
 myFile.print("    ");

    if (digitalRead(b1)==HIGH){
     myFile.print("B1 ");
    }
    else if (digitalRead(b1)==LOW){
       myFile.print("   ");
    }

    if (digitalRead(b2)==HIGH){
     myFile.print("B2 ");
    }
    else if (digitalRead(b2)==LOW){
     myFile.print("   ");
    }

    if (digitalRead(b3)==HIGH){
     myFile.println("B3 ");
    }
    else if (digitalRead(b3)==LOW){
     myFile.println("   ");
    }
    
  myFile.close();

  }

  temposalvo1 = millis();

}

Agora uma dúvida que estou, quando o dispositivo SPI estiver inativo (pino CS em nível alto) qual o comportamento de suas linhas MISO e MOSI, elas devem ficar com nível 0 ou não?

MEU_CODIGO_COM_DISPLAY__RTC_E_SD_V.1.7.1.ino (15.4 KB)