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.