3.21. Fundamentos do SPI#
O SPI (Serial Peripheral Interface) é um barramento serial síncrono projetado para enlaces de curta distância e alta velocidade entre um controlador e um ou mais dispositivos periféricos na mesma placa. É a interface padrão para cartões SD, displays, memória flash, ADCs e DACs, além de uma ampla variedade de sensores.
Enquanto o UART não tinha um clock compartilhado e recuperava a temporização a partir da própria linha de dados, o SPI utiliza um fio de clock junto com os fios de dados. O controlador conduz o clock na taxa que desejar, e todos os demais dispositivos do barramento amostram os dados em sincronia com esse clock. Não há adivinhação de taxa de transmissão (baud rate) nem sobrecarga de enquadramento – apenas bordas de clock e bits.
3.21.1. Os quatro fios#
Um barramento SPI full-duplex possui quatro fios:
SCK (clock serial). Conduzido pelo controlador. Cada bit é deslocado para dentro ou para fora em uma borda desse sinal.
MOSI (saída do controlador, entrada do periférico). A linha de saída do controlador; o periférico amostra os bits a partir dela.
MISO (entrada do controlador, saída do periférico). A linha de saída do periférico; o controlador amostra os bits a partir dela.
CS (chip select), às vezes chamado de SS (peripheral select). Uma linha separada por periférico. O controlador puxa o CS para nível baixo para iniciar uma transação e novamente para nível alto para encerrá-la; qualquer periférico com seu CS desativado ignora o barramento por completo e para de conduzir sua saída MISO.
Um byte SPI: o CS vai para nível baixo para selecionar o periférico, o SCK gera oito bits, e MOSI e MISO transferem um byte cada em direções opostas.#
Cada borda de clock move um bit em cada direção ao mesmo tempo. Um único pulso de SCK envia simultaneamente um bit no MOSI e recebe um bit no MISO – o SPI é full-duplex no nível do fio. O software não precisa usar ambas as direções: transações somente de escrita e somente de leitura são comuns, com a linha não utilizada sendo ignorada ou mantida em nível alto.
3.21.2. Polaridade e fase do clock#
Dois bits de configuração decidem exatamente qual borda de clock move os dados:
Polaridade do clock (
polarity, às vezesCPOL) – o estado ocioso do SCK.0significa que o clock fica ocioso em nível baixo e pulsa em nível alto;1significa que o clock fica ocioso em nível alto e pulsa em nível baixo.Fase do clock (
phase, às vezesCPHA) – qual borda amostra os dados.0amostra na primeira borda de cada pulso de clock (borda de subida);1amostra na segunda borda (borda de descida).
Juntos, esses bits geram quatro modos, convencionalmente chamados de Modo 0 a Modo 3. O Modo 0 (polarity=0, phase=0) é o mais comum e um padrão seguro para dispositivos desconhecidos.
A regra crucial é que ambas as extremidades devem concordar quanto ao modo. Modos incompatíveis geram dados corrompidos mesmo que as linhas de clock e de dados estejam conectadas corretamente; se um dispositivo retornar dados sem sentido na primeira transação, o modo é a primeira coisa a verificar.
3.21.3. Múltiplos periféricos#
Vários periféricos podem compartilhar as mesmas linhas SCK, MOSI e MISO, desde que cada um tenha sua própria linha CS conduzida pelo controlador:
Todos os periféricos veem o mesmo clock e os mesmos dados, mas cada um observa o seu próprio CS. Com o CS desativado (nível alto), o periférico ignora completamente SCK e MOSI e deixa o MISO em estado de alta impedância, de modo que não disputa a linha com outros dispositivos.
O controlador ativa exatamente um CS por vez, executa a transação e desativa o CS para liberar o barramento.
Um microcontrolador com um único bloco de hardware SPI pode se comunicar com tantos periféricos quantos forem os pinos GPIO livres disponíveis para as linhas CS – não há endereçamento no próprio barramento.
3.21.4. Pontos fortes e fracos#
Os pontos fortes e fracos do SPI decorrem ambos do seu projeto:
Rápido. Dezenas de megahertz são alcançáveis em traços curtos com tradução de nível simples. Leitores de cartão SD e displays SPI usam isso.
Simples no nível do fio. Sem endereçamento, sem reconhecimentos (acknowledgements), sem condições especiais de início/parada – apenas bits nos fios sincronizados com um clock.
Faminto por pinos. Três linhas compartilhadas mais um CS por periférico. Uma placa com cinco dispositivos SPI usa oito pinos (três + cinco).
Curto alcance. O SPI pressupõe bordas limpas e rápidas, o que significa traços curtos na mesma placa. Para enlaces mais longos, o I2C ou um dos barramentos enquadrados é mais adequado.