Ir ao conteúdo

Posts recomendados

Postado
Pessoal, resolvi aprender como SPI funciona, escolhi um componente aleatório (TC72 sensor de temperatura) no proteus e comecei a fazer a biblioteca para ele, tudo funcionou tudo OK. 

 

Quando eu adicionei outro componente ao barramento o proteus mostrou uma mensagem de curto circuito, ao isolar o TC72 percebi que após o mestre realizar uma leitura (ler o TC72) pino SDO (do TC72) não volta ao estado HIGH Z.

 

 

O datasheet diz que quando o TC72 é desabilitado (pino CE=0) o pino SDO ficará em HIGH Z após 40nS.


SqhT5SG.png


 

Antes do mestre ler SDO = HIGH Z


48VYzSu.png


 

Após o mestre ler SDO = ZERO (em vez de HIGH Z)


wQHDwZu.png


 

Será que eu não estou enxergando algo ou esquecendo alguma coisa? Nas imagens retirei todos os outros componentes para eles não causarem o SDO=ZERO...

 

Faz uns 2 dias que estou tentando achar o problema e até agora nada... :(  

 

Obrigado por qualquer sugestão ou resposta.

  • Membro VIP
Postado

Amigo não mexo com spi mas esta é a interface mais simples que existe.

Se as linhas CE forem pra cada chip, creio que basta ativá-la individualmente. Sugiro também dar um tempinho antes de acessar o chip. Algo como

CE0=1;asm("nop");//asm("nop");asm("nop");//depende do mca=leSPI0();CE0=0;CE1=1;asm("nop");//asm("nop");asm("nop");//depende do mcescreveSPI1(a);CE1=0;

você também deve garantir que as linhas (ou pinos) SPI não estejam sendo modificados/manipulados em alguma interrupção ou algo do gênero

Finalmente alguns chip´s têm SPI por hw lhe poupando um trabalho razoável. Ah lembrei... é só pra você aprender. ok!

sugiro usar spoiler só pra textos grandes. Pra figura nem precisa pois o site redimensiona ... acho

abç

Postado
Sim até que é simples (pra você com certeza, pra mim nem tanto HAHAHA)...
No início estava usando o 74138 mas resolvi usar um pino para cada escravo.
Dei o tempinho:

CKE=0;                           output_high(ce_tc72);delay_us(1);               // <---- TEMPINHO  spi_escrever(0x02);                 buffer[0]=spi_ler(0x00);                                          buffer[1]=spi_ler(0x00);              output_low(ce_tc72);
 
O código não possui interrupções.
Eu usei SPI por hardware do 877A:
 

void spi_escrever(int valor){   SSPBUFF=valor;                     do{}while(SSPIF==0);              SSPIF=0;                        } int spi_ler(int valor){   SSPBUFF=valor;                     do{}while(SSPIF==0);               SSPIF=0;                             return(sspbuff);                 }
 
Enfim, a memória 24AA010 (que é o outro dispositivo do barramento) coloca sua saída em alta impedância após a leitura, já o TC72 não o faz apesar do datasheet dizer que faz, queria saber o porquê... Talvez é um problema no proteus, fiz um arranjo técnico (gamb...) colocando uma porta tri-state na saída SDO do TC72. Dessa forma se o CE=0 o SDO do TC72 não interfere no barramento...
 
GHgQt5V.png
 
Ok vou usar o spoiler somente em textos grandes!!!!
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!