Considerações sobre terminação de barramento SPI

22

Portanto, na minha pergunta anterior , perguntei sobre o uso do barramento SPI a uma curta distância para comunicação entre placas. Fui recomendado para experimentar resistores de terminação. Coloquei um resistor próximo ao destino (mas não exatamente lá, havia uma distância de 1 cm) e aterrei [como era uma placa sem pegadas de resistores de terminação, tive que improvisar. Não pude soldar o resistor no dispositivo, pois é um TQFP e possui pinos delicados.]

Em alguns testes básicos, descobri que um resistor de 1K mal reduziu o overshoot. 470 Ohms e 180 Ohms funcionaram melhor. Quanto mais baixo eu fui, melhor funcionou. Com 180 Ohms, o overshoot era cerca de um volt ou um pouco menor. Agora, infelizmente, não posso diminuir muito mais do que isso porque a corrente é mais do que meu MCU pode suportar. Corrigi o problema, na revisão atual da placa, usando uma resistência de 330 Ohm em série. Isso elevou a superação para 3,7 V e o tempo de subida foi de 10 ou 11 ns. Mas eu realmente gostaria de uma solução 'adequada' na próxima revisão. Meus requisitos de frequência permanecem os mesmos: 2 MHz, mas preferem 4 MHz.

Então achei que deveria perguntar aqui: na próxima revisão do quadro, devo colocar amortecedores fortes nas linhas? Encontrar um buffer não é realmente um problema, mas o consumo atual aumentará significativamente - eu tenho 8 dispositivos no SPI que precisam de terminação e 3 linhas sempre ativas vão para cada um. Um exemplo, o SCK vai para todos os 8 dispositivos. Cada dispositivo terá, por exemplo, um resistor de terminação de 100 Ohm. Portanto, esse é um consumo atual de 12 * 3,3 / 100 = 390 mA!

Então, qual é o melhor recurso aqui? Devo optar por 'terminação ativa' usando diodos Schottky como grampos?

EDIT: Em relação à impedância da linha: Como mencionei anteriormente, a intenção é conectar 4 placas externas. A distância pad a pad é a mesma para todos (12 polegadas). No entanto, também existem dispositivos na mesma placa que o MCU - mas estes não precisam de terminações - os comprimentos são de cerca de uma polegada (ou menos) e há muito pouco excedente (300 ou mV). Os traços que vão para as placas externas são ásperos do mesmo comprimento e largura. A segunda camada do meu painel é um plano de terra ininterrupto.

Saad
fonte
Um método comum é colocar um resistor em série que corresponda à impedância da linha. Tente algo como uma terminação serial de 50ohm. Ajudaria se você projetasse seus rastreamentos e conexões como uma impedância fixa. Tente terminações seriais inferiores e veja o que você encontra. Ele sugeriu uma terminação para aterramento de 32 ohms, você pode realmente fazer isso com uma potência muito menor, bem menos 3dB, colocando 64 ohm no trilho de potência e 64 ohm no trilho de terra.
Kortuk
@Kortuk Um resistor de 32 Ohm, infelizmente, não reduziu significativamente a superação. No entanto, a pegada também estava no lugar errado (nunca foi concebido para ser o terminador) e não está na fonte, portanto pode ser que eu não tenha certeza. Em relação à impedância da linha, todas as linhas têm aproximadamente o mesmo comprimento e largura. Todos eles correm sobre um terreno completo de um avião, que fica na 2ª camada.
Saad
1
A terminação da série está na fonte, se você a colocar na carga, ela não fará nada. Tente colocar 50ohm diretamente na sua fonte em série para ver o efeito.
Kortuk
Você pode pensar nisso como stevenvh descrito, existe toda a linha atuando como um capacitor e esse resistor atua como o R com ele para uma passagem baixa, se você pensar nele como um modelo agrupado. Um resistor correspondente lá, se você olhar para o modelo da linha de transmissão, significa que você tem metade da amplitude da onda percorrida e, em seguida, quando atinge a outra extremidade e reflete que atinge o valor máximo.
Kortuk

Respostas:

32

Falar sobre o término do sinal é como abrir uma lata de vermes. Este é um assunto enorme que é difícil de resumir em apenas algumas centenas de palavras. Portanto, não vou. Vou deixar uma quantidade enorme de coisas fora desta resposta. Mas também darei um grande aviso: há muita informação incorreta sobre resistores de terminação na rede. Na verdade, eu diria que a maior parte do que é encontrado na rede é errado ou enganoso. Algum dia, escreverei algo grande e publicarei no meu blog, mas não hoje.

A primeira coisa a observar é que o valor do resistor a ser usado para sua terminação deve estar relacionado à sua impedância de rastreamento. Na maioria das vezes, o valor do resistor é igual à sua impedância de rastreamento. Se você não sabe qual é a impedância de rastreamento, deve descobrir isso. Existem muitas calculadoras de impedância online disponíveis. Uma pesquisa no Google trará mais dezenas.

A maioria dos traços de PCB tem uma impedância de 40 a 120 ohms, e é por isso que você descobriu que um resistor de terminação de 1k não fazia quase nada e um resistor de 100-ish ohm era muito melhor.

Existem muitos tipos de terminação, mas podemos colocá-los aproximadamente em duas categorias: terminação de origem e final. A terminação de origem está no driver, a finalização está no final. Dentro de cada categoria, existem muitos tipos de rescisão. Cada tipo é melhor para usos diferentes, sem um tipo bom para tudo.

Sua terminação, um único resistor de aterramento no extremo oposto, na verdade não é muito bom. De fato, está errado. As pessoas fazem isso, mas não é o ideal. Idealmente, esse resistor iria para um trilho de força diferente na metade do seu trilho de força. Portanto, se a tensão de E / S for 3,3v, esse resistor não irá para GND, mas outro trilho de energia a metade de 3,3v (também conhecido como 1,65v). O regulador de tensão para esse trilho precisa ser especial porque precisa fornecer E reduzir a corrente, onde a maioria dos reguladores apenas fornece corrente. Os reguladores que trabalham para esse uso mencionarão algo sobre rescisão na primeira página da folha de dados.

O grande problema com a maioria das terminações finais é que elas consomem muita corrente. Há uma razão para isso, mas não vou entrar nisso. Para uso com baixa corrente, devemos considerar o término da fonte. A forma mais fácil e comum de finalização da fonte é um resistor em série simples na saída do driver. O valor desse resistor é o mesmo que a impedância de rastreamento.

O encerramento da fonte funciona de maneira diferente do encerramento final, mas o efeito líquido é o mesmo. Ele funciona controlando as reflexões do sinal, não impedindo as reflexões em primeiro lugar. Por esse motivo, ele só funciona se uma saída de driver estiver alimentando uma única carga. Se houver várias cargas, outra coisa deve ser feita (como o uso da terminação final ou de vários resistores de terminação da fonte). O grande benefício do encerramento de origem é que ele não carrega o driver como o encerramento final.

Eu disse anteriormente que o resistor em série para terminação da fonte deve estar localizado no driver e deve ter o mesmo valor da sua impedância de rastreamento. Isso foi uma simplificação excessiva. Há um detalhe importante a saber sobre isso. A maioria dos drivers tem alguma resistência em sua saída. Essa resistência geralmente está na faixa de 10 a 30 ohm. A soma da resistência de saída e seu resistor deve ser igual à sua impedância de rastreamento. Digamos que seu traço seja de 50 ohms e seu motorista tenha 20 ohms. Nesse caso, seu resistor seria de 30 ohms desde 30 + 20 = 50. Se as folhas de dados não disserem qual é a impedância / resistência de saída do driver, você poderá assumir que são 20 ohms - observe os sinais na placa de circuito impresso e veja se ela precisa ser ajustada.

Outra coisa importante: quando você olha para esses sinais em um osciloscópio, você DEVE sondar no receptor. Sondar em qualquer outro lugar provavelmente lhe dará uma forma de onda distorcida e o levará a pensar que as coisas são piores do que realmente são. Além disso, verifique se o clipe de terra é o mais curto possível.

Conclusão: Mude para a terminação da fonte com um resistor de 33 a 50 ohm e você deve estar bem. As advertências usuais aplicam-se.


fonte
David, muito obrigado por uma resposta exaustiva. Tudo isso fazia sentido, mas acho que há mais uma complicação no meu sistema - as linhas SPI vão de uma placa para outra. Portanto, estimar a impedância da linha pode ser difícil - o sinal é trocado por cerca de 3 "na placa principal, passa por um cabo de fita de 6" e viaja ao longo de um traço de 3 "até chegar ao seu destino. Os fios do cabo de fita são alternados . chão (como SCK, GND, MOSI, GND etc.) Será que o seu 30-20 Ohm recomendação ainda estão de pé?
Saad
@ Saad O que eu fiz em casos como esse (e fiz muito isso) é usar um único resistor no driver e ajustar seu valor depois que o protótipo for construído. É um compromisso, mas funciona. Atualmente, tenho vários sistemas que executam SPI em cabos de 1 pé com traços de 3 a 6 polegadas em cada PCB. Alguns deles estão rodando a 30 MHz! Sim, comece com 33 ou 47 ohms e ajuste a partir daí.
3
Já está marcado com +1, mas um diagrama mostrando como conectar uma terminação de origem (isto é, em série, não da linha ao solo) seria muito útil.
O Photon
16

Como você está percorrendo distâncias curtas, não acho que os resistores de terminação sejam uma boa ideia. Como você descobriu, eles precisam ser muito baixos para fazer o trabalho e, em seguida, a linha consome muita corrente e a tensão é atenuada por 2 se você também dirige a linha com a mesma impedância.

Sua taxa de clock não é tão alta, então as frequências que você precisa para suportar até 4 MHz não são as que causam o problema. O problema é que você tem arestas rápidas dirigindo as linhas, que têm harmônicos nos 100s de MHz, que causam o problema. Nas frequências desejadas, você tem um sistema concentrado, não uma linha de transmissão. Isso torna as coisas consideravelmente mais fáceis.

A solução, portanto, é atenuar as altas frequências que você realmente não precisa, mas causar o problema. Isso pode ser feito com um simples filtro passa-baixa RC imediatamente após qualquer coisa que direcione uma linha. Isso é em parte o que os resistores de 330 are estão fazendo agora. Eles formam um filtro passa-baixo com a capacitância parasitária da linha. Aparentemente, isso não é suficiente e / ou não é previsível o suficiente. Isso pode ser corrigido com alguma capacitância deliberada em cada linha.

Você deseja rodar o barramento a 4 MHz, o que significa que o sinal mais rápido necessário para suportar é uma onda quadrada de 4 MHz. Isso significa que o comprimento de cada nível é de 125 ns. Digamos que queremos que sejam pelo menos 4 constantes de tempo, o que implica 98% do tempo de acomodação. Isso significa que a constante de tempo máxima que queremos permitir é 31 ns. 31ns / 330Ω = 94 pF. Essa é a carga total nos resistores da série 330 you que você precisa para manter a constante de tempo de 31 ns. Sempre haverá alguma capacitância parasitária que você não pode prever, então eu veria como as coisas ficam com 47 pF. Isso deixa espaço para 10-20 pF de capacitância oculta, sem exceder o tempo máximo permitido constante.

Os resistores em série devem estar o mais próximo possível de todos os pinos que acionam o barramento. Isso pressupõe que todos os outros pinos no barramento serão entradas CMOS quando um estiver dirigindo. Para linhas que apenas são acionadas por um único pino (como a linha do relógio, que é acionada apenas pelo mestre), coloque os 47 pF o mais próximo possível do resistor. Para linhas que podem ser acionadas por pinos diferentes em momentos diferentes (como o MISO), coloque o 47 pF em algum lugar perto do meio de todos os drivers. Cada linha recebe apenas um único capacitor de 47 pF, não importa quantos drivers, mas existe um resistor para cada driver.

Os cálculos acima devem ser um bom guia para começar. Alguns parâmetros não podem ser conhecidos e, portanto, foram contabilizados antecipadamente. Comece com o 330 Ω em série e 47 pF no chão, mas não tenha medo de mudar as coisas com base nos resultados reais observados.

Olin Lathrop
fonte
2

Na ausência de qualquer terminação, quando um sinal é enviado de uma fonte de impedância muito baixa para um receptor de impedância muito alta, o sinal salta para frente e para trás repetidamente; a fase do sinal será invertida 180 graus em cada ida e volta.

Se não se deseja que os sinais sejam refletidos quando atingem o destino, pode-se usar a terminação final. Isso fará com que o sinal seja absorvido de maneira limpa no destino sem ser refletido, mas muitas implementações comuns farão com que a fonte veja uma carga CC significativa.

Em muitos casos, pode-se obter resultados que são praticamente úteis se inserir um resistor em série na fonte de sinal. Se não houver receptor no extremo da linha, o sinal será refletido quando chegar lá, mas qualquer reflexão será absorvida pela fonte e não refletida novamente. Observe também que o término da fonte não impõe uma carga DC no dispositivo que está dirigindo a linha.

Na ausência de terminação, se uma linha for acionada por uma baixa impedância e recebida com uma alta impedância, o dispositivo receptor poderá ver uma tensão maior que a tensão de acionamento (em teoria, até o dobro da tensão, se a impedância de acionamento da fonte for zero e a impedância de recebimento é infinita). Se a fonte ou o receptor tiver terminado corretamente, a tensão recebida será quase igual à tensão do inversor (se uma fonte de impedância zero estiver acionando um receptor de impedância adequada ou se uma fonte de impedância adequada estiver acionando um receptor de impedância infinita, tensão recebida será igual à tensão do inversor). Se ambos forem terminados corretamente, a tensão de recebimento será metade da tensão do inversor.

A simulação aqui demonstra isso. Ele inclui um gerador de pulsos que produz uma cadeia de pulsos aproximadamente 49 vezes por segundo, duas linhas de retardo de 5ms em série (tempo de ida e volta de 1/50 segundo) e resistores de terminação comutáveis ​​nas duas extremidades.

O circuito inclui três comutadores SPDT; clique em um para alterar seu estado. Os dois comutadores inferiores controlam a terminação de origem e destino. Para aqueles, "para cima" representa boa terminação e "para baixo" representa ruim. O interruptor superior controla se a linha deve ser acionada por um gerador de pulsos automático ou por uma entrada lógica manual. Para enviar pulsos pela linha manualmente, mude a chave superior para "baixo" e, em seguida, gire o "L" ao lado dela.

Os sinais que chegam ao destino será limpo se quer a origem ou o destino está devidamente encerrado. Se ambos forem terminados corretamente, a tensão do sinal recebido será metade da tensão do inversor. Se um for terminado adequadamente, mas o outro não, a tensão recebida será de cerca de 91% da tensão do inversor (os resistores "ruins" são "errados" por um fator de dez e, portanto, não absorvem cerca de (10/11) da energia). Se nenhum deles terminar, a tensão recebida será inicialmente cerca de 1,656 vezes a tensão do inversor, mas reflexos estranhos aparecerão a cada 20ms.

supercat
fonte
1

Tente uma terminação CA (por exemplo, um capacitor de 470 pF em série com um resistor de 110 Ohm) e conecte esta combinação de séries na saída do destino SPI Clock ao terra. A terminação consumirá cerca de 30 mA pela duração do tempo de borda, algo que pode ser feito facilmente, mas, caso contrário, zero corrente. Para a linha de dados bidirecional, fica um pouco mais complicado. Coloquei uma terminação de 470 pF, 220 Ohm CA na extremidade mestre e escrava da linha de dados SPI e isso funciona, ou seja, superação e subvenção aceitáveis.

Congratulo-me com comentários sobre isso.

ken
fonte
0

Não entrando em detalhes demais, pois os posts anteriores atingiram a unha na cabeça. Tudo se resume a SPI sendo linhas desequilibradas. Mesmo se você tiver uma frequência de relógio baixa, as bordas rápidas do relógio ns precisam ser respeitadas. No meu caso, encontrei um resistor de 470 ohm em série com a linha SPI CLK no lado Master. Removendo esse resistor e implementando a solução recomendada para linhas desequilibradas da Lattice e as sugestões postadas acima (eu só conseguia implementar metade da solução do lado escravo, ajustando as tampas do filtro de acordo). 10cm a 160cm sem erros de comunicação:

Melhorando a imunidade a ruídos para interface serial : um white paper sobre Lattice Semiconductor (julho de 2014)

Ben
fonte