Se você está construindo uma placa de desenvolvimento para o seu projeto ou usando um MCU comum, encontrará muitos protocolos para a comunicação com outros componentes ativos. Padrões como USB e Ethernet são incorporados na maioria dos controladores para trabalhar com periféricos de computador. No entanto, protocolos como I2C, SPI, UART, entre outros, são usados para interfacear com MCUs downstream ou ICs programáveis. As diferenças entre os barramentos SPI vs. I2C vs. UART são simples, e qualquer designer trabalhando com um MCU deve saber como seguir as diretrizes de roteamento e layout para esses protocolos.
Esses protocolos são padrões de sinalização de velocidade mais baixa, então quase sempre você não precisará se preocupar com coisas como controle de impedância ou comportamento de linha de transmissão se estiver trabalhando com esses protocolos. No entanto, alguns pontos de design importantes devem ser considerados para garantir que os sinais das suas linhas de ônibus sejam lidos corretamente pelos seus receptores. Há também a questão do endereçamento, mas o produto específico e o seu código podem lidar com esse ponto. Por agora, vamos ver como esses três protocolos comuns podem ser usados no layout da sua PCB, estabelecer algumas diretrizes de layout/roteamento e tocar em alguns pontos importantes para manter a integridade do sinal.
Tudo, desde MCUs de 8 bits até 32 bits, usará pelo menos um desses protocolos junto com GPIOs para programabilidade e envio de sinais para periféricos simples. Esses três protocolos seriais são protocolos de barramento; I2C e UART usam esquemas de endereçamento, enquanto SPI é sem endereço. Embora SPI seja sem endereço, é um protocolo de barramento e ainda pode ser usado para selecionar dispositivos downstream para receber dados.
O I2C (pronunciado I ao quadrado C, ou às vezes IIC para circuito integrado interno) usa duas linhas (modos padrão, rápido e rápido-plus) para controlar outros dispositivos; uma linha é uma linha de relógio (SCL), enquanto a outra é uma linha de dados (SDA). Ele vem em três modos, que são resumidos na tabela abaixo. Note que os valores de tempo de subida/queda assumem que os resistores de série típicos estão instalados nos I/Os.
Modo |
Taxa de dados/velocidade do relógio |
Tempo máximo de subida/queda |
Tempo mínimo de subida/queda |
Direcionalidade |
Padrão |
100 kHz |
1000 ns |
- |
Bidirecional |
Rápido |
400 kHz |
300 ns |
20 ns* |
Bidirecional |
Rápido-plus |
1 MHz |
300 ns |
20 ns* |
Bidirecional |
Alta velocidade |
3,4 MHz (bus de 100 pF) 1,7 MHz (bus de 400 pF) |
120 ns** |
15 ns** |
Bidirecional |
Ultra-rápido |
5 MHz |
50 ns |
25 ns |
Unidirecional |
*Assume VDD/VCC = 5,5 V. Reduz proporcionalmente se VDD/VCC for menor
**Divida esses valores por 2 para a linha de relógio
Note que o modo ultra-rápido é o único modo onde a comunicação é usada apenas para operações de escrita downstream. Este modo também é importante pois nos ajuda a ver quando a impedância do barramento precisará ser casada, o que, em termos práticos, é quase nunca. Se tomarmos um limite muito conservador de 10% no comprimento crítico da linha, descobrimos que o comprimento crucial nessas linhas é de 0,32 m, o que é muito mais longo do que o tamanho da maioria das placas que usarão I2C. Se usarmos a frequência de corte para o tempo mínimo de subida/queda com um limite de 10% no comprimento crítico, chegamos a um valor muito mais longo de 0,92 m. Devemos tomar o número mais conservador de 0,32 m para o modo ultra-rápido; qualquer linha I2C mais curta do que este valor não se comportará como uma linha de transmissão, e só precisamos nos preocupar com o esquema de terminação.
Os pontos importantes na terminação são selecionar os resistores de pull-up e série corretos. Os resistores de pull-up e a capacitância da linha do barramento VDD/VCC formam um circuito RC de descarga e carga, que é o que fornece um sinal ao receptor quando o driver alterna. Os valores dos resistores de pull-up (Rp) para as linhas de sinal e de relógio devem obedecer à seguinte desigualdade:
Note que o número no denominador acima é definido para um tempo de transição de 30% a 70%, que é o padrão na especificação I2C. Para um tempo de transição de 10% a 90%, substitua 0.8473 por 2.2. Isso limitará ainda mais o valor dos resistores de pull-up.
A capacitância do barramento é determinada usando as fórmulas padrão para a impedância do barramento VCC, que pode ser calculada usando as mesmas equações que você usaria para uma linha de transmissão (seja microstrip ou stripline). Você pode então resolver para a capacitância do barramento usando a impedância e o atraso de propagação da linha. Se você não estiver com vontade de fazer esse cálculo, existem calculadoras de capacitância do barramento I2C que você pode encontrar online. Finalmente, os resistores em série são opcionais sob o padrão I2C, embora possam ser incluídos para proteger os dispositivos contra picos de tensão e diminuir os tempos de subida/descida. Veja a Fig. 46 na página 59 do padrão I2C para determinar o valor correto do resistor em série para combinar com o valor do seu resistor de pull-up.
O protocolo SPI é semelhante ao I2C. Um total de 4 linhas são usadas neste barramento, e os componentes podem ser organizados em dois modos possíveis. Se um único dispositivo controlador é usado para acionar um único dispositivo a jusante, a topologia é simplesmente ponto a ponto. Acionar múltiplos dispositivos depende do número de saídas de seleção de chip fornecidas pelo driver (modo padrão). O segundo modo usa o encadeamento em série, onde uma única saída de seleção de dispositivo aciona sucessivamente cada dispositivo na cadeia.
No exemplo acima, nosso controlador tem duas saídas de seleção de chip que são usadas para acionar quando os periféricos receberão e aceitarão dados do host. Quando dados seriais são emitidos pelo controlador, o periférico requerido também precisa ser ativado pelo controlador durante um quadro de dados para que o periférico aceite e leia os dados. Isso é programado na lógica do controlador. Por exemplo, se um microcontrolador ou FPGA é usado como o controlador, isso será implementado no código para a aplicação do dispositivo.
Ao contrário do I2C, os vários parâmetros de sinalização no SPI são altamente configuráveis. O método de descarga RC com a capacitância de traço mostrada acima pode controlar a corrente de saída e os tempos de subida/queda da sua interface. O SPI é uma interface push-pull, e a energia não é retirada através de um resistor de pull-up. O tempo de subida é dominado pela capacitância externa e pela impedância de saída do driver. A especificação SPI no seu controlador host pode fornecer um tempo de subida específico para um determinado consumo de corrente no barramento para uma capacitância total específica (talvez 50 ou 100 pF). Por exemplo, no barramento SPI de um MCU PIC32, o tempo de transição de saída é especificado como 5 ns para uma capacitância externa de 50 pF. Então, se reduzirmos para 10 pF, esperaríamos que o tempo de subida caísse para 1 ns para uma determinada saída de corrente e nível de tensão. Nesse caso, você agora tem uma permissão de comprimento de 0,6 polegadas (aproximação bastante conservadora com um limite de 10% em comprimentos não correspondidos). Você pode então usar um resistor em série para terminar a saída de baixa impedância do driver no caso da linha se tornar muito longa para um tempo de subida curto.
O protocolo transmissor receptor assíncrono universal (UART) é semelhante ao I2C e SPI. Essas interfaces têm uma taxa de dados máxima de ~5 Mbps. Os dispositivos UART também são fáceis de trabalhar, pois não há um relógio enviado entre os dispositivos; tudo é assíncrono. Note que o relógio interno (sistema) de cada dispositivo UART deve funcionar em algum múltiplo da taxa de baud (ou seja, cada bit é amostrado N vezes). Apenas dois fios são usados para comunicação entre um único dispositivo controlador e um único dispositivo a jusante.
Note que o formato de dados, os níveis de sinal e a taxa de baud de um dispositivo UART são configuráveis com um circuito de driver externo. Se você observará ou não comportamento de sinal de alta velocidade depende se você está transmitindo com níveis de sinal RS-232 ou RS-485. Sinais UART em níveis RS-232 normalmente são feitos sem terminação porque as taxas de transição são lentas. No entanto, RS-485 com sinais UART normalmente requer resistores de terminação. Siga as diretrizes de design de alta velocidade padrão para determinar quando a terminação é necessária, olhando para a transição para o comportamento da linha de transmissão (veja o artigo que eu linkei acima).
Um método de terminação típico para reduzir o overshoot, caso ocorra, é aplicar a terminação em série. Note que o UART pode ficar inativo em níveis altos ou baixos, e resistores de pull-up podem ser necessários para definir o nível de inatividade requerido; certifique-se de verificar as especificações do seu componente antes de adicionar resistores de pull-up.
Você pode ler mais sobre a diferença entre o temporização em barramentos síncronos e assíncronos na apresentação de 2018 do AltiumLive por Max Seeley.
Se as regras de SPI e UART parecem um pouco vagas, é porque você tem mais liberdade para projetar sua interface no nível do firmware. Uma vez que qualquer um desses padrões opere em taxas de borda rápidas, eles são suscetíveis a diafonia, assim como os padrões de sinalização de alta velocidade. No entanto, como você tem bastante flexibilidade na sua especificação, você geralmente pode projetar trilhas para ter menor indutância e reduzir a diafonia indutiva. Você tem alguma flexibilidade no roteamento desses sinais e torná-los muito fáceis de trabalhar no seu próximo sistema digital.
Ao projetar sistemas digitais com padrões de sinalização comuns, você pode projetar levando em conta as diferenças entre as diretrizes de layout I2C vs. SPI vs. UART com as regras de design em Altium Designer. O Gerenciador de Pilhas de Camadas e o solucionador de campo 3D integrado da Simberian usam a geometria da sua placa e a geometria das trilhas para extrair os parasitas em suas linhas de sinal e ajudá-lo a determinar as impedâncias se seus sinais tiverem comprimentos muito longos ou altas velocidades.
Altium Designer no Altium 365 oferece um nível sem precedentes de integração à indústria eletrônica, até então relegado ao mundo do desenvolvimento de software, permitindo que os designers trabalhem de casa e alcancem níveis de eficiência sem precedentes.
Apenas arranhamos a superfície do que é possível fazer com Altium Designer no Altium 365. Você pode verificar a página do produto para uma descrição mais aprofundada das funcionalidades ou um dos Webinars Sob Demanda.