Existe um equívoco popular de que resistores de pull-up são necessários ou indispensáveis nas linhas de um barramento SPI. Estou aqui para dizer inequivocamente que resistores de pull-up não são necessários em um barramento SPI para realizar sua função básica de enviar e receber dados digitais.
O buffer em uma interface SPI possui uma topologia push-pull que (em um nível alto) envolve MOSFETs de comutação de lado alto e lado baixo, formando essencialmente um inversor CMOS. Como veremos neste artigo, a presença de resistores de pull-up não tem impacto na funcionalidade de um barramento push-pull.
Isso dito, existem casos em que faz sentido colocar um resistor de pull-up em um barramento push-pull, e em algumas folhas de dados um fabricante de componentes irá recomendá-lo ou exigí-lo. Vamos olhar para essas situações e como isso afeta o comportamento do seu sistema. Embora possam existir soluções mais elaboradas que eliminam a necessidade de resistores de pull-up nessas situações, a colocação de um resistor de pull-up pode ser uma solução que mantém seu design simples e oferece um seguro de que a interface funcionará corretamente.
Vamos dar uma olhada no modelo típico de um buffer em uma interface SPI. Todos os buffers SPI possuem uma topologia push-pull que consiste em comutação de alta e baixa tensão que transmite um sinal para o barramento, e cada sinal no barramento SPI (CS, MOSI, MISO e SCLK) terá essa topologia. Um exemplo desse circuito é mostrado abaixo. Note que um buffer SPI real não é tão simples quanto dois MOSFETs, mas a mesma ideia se aplica em geral.
Inversor CMOS como um driver SPI. A saída se conecta a um traço (representado como elementos concentrados) e um circuito de carga (modelo equivalente RC).
A razão inteira para usar essa topologia é para as capacitâncias de descarga no circuito do buffer fornecerem taxas de transição de borda razoavelmente rápidas na saída, que serão muito menores do que o período do relógio no barramento. Isso é o que permite taxas de dados mais rápidas do que um protocolo de dreno aberto (por exemplo, I2C).
Um barramento SPI que inclui resistores de pull-up é essencialmente um driver inversor CMOS com um resistor em paralelo com o FET de alta no buffer de saída. Agora, vamos ver o que acontece durante cada estado de comutação no driver e podemos ver o que acontece no barramento.
Durante o estado de saída de lógica ALTA, o NMOS está DESLIGADO e o PMOS está LIGADO. VDDIO agora está fornecendo corrente para o traço conectado e carga. A capacitância no traço e na carga então começa a carregar até que a tensão vista na carga corresponda a VDDIO. Aqui, a resistência ON do PMOS é da ordem de mOhm, enquanto o resistor de pull-up é da ordem de 1 a 10 kOhms. Obviamente, o resistor de pull-up é tão grande que é essencialmente curto-circuitado pelo PMOS no estado de saída de lógica ALTA.
Como toda a corrente flui através do PMOS no estado de lógica ALTA, independentemente da presença do resistor de pull-up, as características de comutação serão inalteradas.
Agora, vamos considerar que o circuito mudou para o estado de saída lógica BAIXA. Neste estado, o NMOS está LIGADO e o PMOS está DESLIGADO, então o traço e a capacitância de carga estão descarregando através do NMOS para a rede GND. Como o PMOS está desligado, ele aparece como uma resistência muito alta (ordem de MOhms) que é muito maior do que o valor do resistor de pull-up (1 a 10 kOhms).
Como o pull-up é o resistor menor neste caso, ele permitirá um valor de corrente de VDDIO/R(pu) fluir para o NMOS. Para um resistor de pull-up de 1 a 10 kOhm e VDDIO = 3.3 V, a corrente de fuga para o NMOS seria de 0.33 a 3.3 mA. Isso é muito menor do que a corrente típica do SPI de ~50 mA, então, novamente, não notaremos quaisquer efeitos nas características de comutação. O tempo de queda no barramento será limitado pelas capacitâncias de carga e de traço, a impedância resistiva de saída do circuito de buffer e a resistência em estado ligado do NMOS.
Claramente, a colocação de um resistor de pull-up em uma linha SPI não afeta sua capacidade de transmitir um sinal para o barramento. Portanto, o pull-up deve estar desempenhando alguma outra função que não está relacionada à transmissão de dados, caso contrário, o resistor não seria utilizado.
As razões para usar um resistor de pull-up em uma ou mais linhas em uma interface SPI variam dependendo da situação proposta. Algumas situações em que resistores de pull-up são usados incluem:
A razão declarada para a colocação em qualquer uma dessas situações é definir o estado lógico em um dos componentes periféricos no barramento. A recomendação mais comum é colocar um resistor de pull-up no pino CS de um periférico para puxá-lo para alto. Se o periférico tem um pino de habilitação ativo em baixo, isso sempre puxará o pino para alto, a menos que o lado do driver do pull defina o pino como baixo.
Um exemplo de tal uso é mostrado abaixo. No layout da PCB, o resistor de pull-up seria colocado próximo ao pino CS deste periférico.
Colocação típica de um resistor de pull-up no pino CS de um barramento SPI.
Por que isso seria usado? A razão declarada é que durante a inicialização do sistema, o pino CS poderia estar flutuando em qualquer estado e isso criaria um risco de que ruídos possam corromper dados no barramento. Além disso, se o dispositivo hospedeiro iniciar antes do periférico e o pino CS se tornar habilitado involuntariamente, o hospedeiro poderia começar a manipular dados no periférico. Isso é às vezes citado como uma razão para colocar um pull-up em periféricos de memória.
Até o momento, não consigo encontrar uma razão convincente para colocar um resistor de pull-up na linha SCLK (clock). A razão é que o circuito lógico receptor não será ativado se outras condições (especificamente o estado da linha CS) não forem atendidas, independentemente da presença de um sinal de clock. Algumas notas de aplicação e folhas de dados recomendam os resistores de pull-up para MISO ou MOSI por várias razões, mas testar se isso funciona é simples e o resistor sempre pode ser dessoldado ao trabalhar no seu protótipo.
Por ser frequentemente citado como um problema com o estado do pino CS durante a inicialização do sistema, acredito que a sequência de energia entre periféricos e o host do sistema seria a melhor abordagem para prevenir esse problema durante a inicialização. Em sistemas menores, pode não haver espaço no dispositivo disponível para múltiplos reguladores ou para um sequenciador de energia que possa passar a energia necessária. É uma solução mais simples colocar um resistor de pull-up, mas entenda que esses resistores de pull-up não são necessários para que a interface funcione corretamente.
Seja para construir eletrônicos de potência confiáveis ou sistemas digitais avançados, use o conjunto completo de recursos de design de PCB e ferramentas CAD de classe mundial em Altium Designer. Para implementar a colaboração no ambiente interdisciplinar de hoje, empresas inovadoras estão usando a plataforma Altium 365 para compartilhar facilmente dados de design e colocar projetos em fabricação.
Apenas arranhamos a superfície do que é possível com Altium Designer no Altium 365. Comece seu teste gratuito do Altium Designer + Altium 365 hoje.