As comunicações síncronas são importantes na transmissão de dados entre dois dispositivos. E uma delas é a SPI, que será o assunto deste post.

Recomendo a leitura do post sobre comunicação serial assíncrona. Além disto, eis alguns posts complementares ao conteúdo: I2C, RS-485, Modbus RTU.


Definição

SPI significa Serial Peripheral Interface (Interface Periférica Serial) e ela é uma comunicação serial síncrona para pequenas distâncias. Isto é, ela utiliza uma linha para sincronizar os dados entre o dispositivo que envia e o dispositivo que o recebe, assim como a I2C.

A SPI é uma comunicação do tipo mestre-escravo, em que pode existir apenas um mestre (quem controla a comunicação) e que podem existir inúmeros escravos (quem é controlado).

Ao contrário do I2C, a SPI não define um protocolo para interpretar os dados enviados/recebidos. Sendo assim, fica a critério de quem cria os dispositivos decidir como isso será feito.


Barramentos

A ligação da SPI constitui-se de no mínimo 4 canais diferentes:

MOSI

MOSI, ou Master Out Slave In (Saída do Mestre Entrada do Escravo), é o canal utilizado pelo mestre para enviar dados aos escravos. O próprio nome já deixa isto claro.

MISO

MISO, ou Master In Slave Out (Entrada do Mestre Saída do Escravo), é o contrário do canal anterior: é utilizado pelo escravo para enviar dados ao mestre. Novamente, o próprio nome já deixa isto claro.

Como o MISO de todos os escravos estão interligados, é necessário que o pino de cada escravo seja de três estados (nível alto, nível baixo e alta impedância). Isso serve para que um escravo não interfira na comunicação quando ele não estiver sendo “chamado”.

SCLK

SCLK, ou Serial Clock, é o canal utilizado para sincronizar a transmissão de dados.

SS

SS, ou Slave Select, é o canal utilizado para selecionar o escravo. E o mestre deve possuir um canal SS para cada escravo. Com isto, o mestre seleciona qual escravo ele quer se comunicar mandando um sinal de nível baixo* no canal SS daquele escravo. E isto exige um resistor de pull-up entre o canal SS e o positivo da fonte.

Portanto, podem haver infinitos escravos no barramento, desde que o mestre possua um canal para cada um deles. Por isto, falei que o mínimo que a SPI precisa são 4 canais, pois é o mínimo para o mestre comunicar com 1 dispositivo.

E o canal SS do primeiro escravo pode ser chamado de SS1, do segundo de SS2 e assim em diante. Por fim, o canal SS é escrito com uma barra acima, já que ele é acionado em nível lógico baixo*. 

* É comum encontrar dispositivos no mercado que são selecionados por meio de uma borda de descida (sinal transita de nível alto para baixo). 

Observações

Como os canais de envio e recebimento são separados, a SPI é um tipo de comunicação half-duplex (o envio e o recebimento podem ocorrer simultaneamente). Por conta disto, ela é uma comunicação rápida.

Enfim, a imagem abaixo  mostra a ligação entre um mestre e dois escravos. Ela sintetiza tudo o que foi falado acima.

ligação da comunicação SPI

Propriedades e detalhes

Polaridade do clock e fase

O canal de clock da SPI necessita de duas configurações: polaridade (CPOL) e fase (CPHA). Nesta parte existem dois termos que não pretendo traduzir, que são: “leading edge” (algo como borda guia) e “trailing edge” (algo como borda de fuga).

  • A polaridade define qual borda será a leading edge e qual será a trailing. A utilidade dos dois será explicada na fase.
  Leading Edge Trailing Edge
CPOL = 0 Borda de subida Borda de descida
CPOL = 1 Borda de descida Borda de subida

 

  • A fase relaciona os tempos da comunicação com a polaridade:

Se CPHA = 0, então a saída da comunicação se alterará quando ocorrer uma “trailing edge”. E a entrada da comunicação se alterará quando ocorrer uma “leading edge”.

E, se CPHA = 1, será o contrário: a saída da comunicação se alterará quando ocorrer uma “leading edge”. E a entrada da comunicação se alterará quando ocorrer uma “trailing edge”.

 

A diferença (simplificada) dos dois é que, no primeiro caso, a entrada se altera antes que a saída e, no segundo caso, a saída se altera primeiro.

Veja a imagem abaixo para entender o tempo das duas configurações:

Fonte: Wikipedia

Aplicações

A SPI é comum de ser utilizada para as seguintes aplicações:

  • Relógios RTC (Real-Time Clock).
  • Alguns sensores de temperatura/pressão.
  • Controles de vídeo-game.
  • Cartão SD.
  • Alguns LCDs.

Vantagens e Desvantagens

Algumas vantagens e desvantagens da SPI:

  • Vantagens:
  1. O protocolo (interpretação dos dados) pode ser definido livremente, o que facilita a implementação.
  2. Comunicação full-duplex (comunicação mais rápida).
  3. Os escravos não precisam de osciladores, já que utilizam o clock do mestre.
  4. Os escravos não precisam de endereços únicos, como ocorre no I2C.
  5. Não é necessário utilizar transceivers para “decodificar”/”codificar” os dados que estão sendo enviados/recebidos.
  • Desvantagens
  1. São necessários muitos pinos na comunicação.
  2. Não é ideal para longas distâncias.
  3. Não tem um sistema de detecção de escravos no hardware. Logo, o mestre pode enviar dados para um escravo que não existe e não saber disto.

Funcionamento

Conforme foi dito, a SPI não define nenhum protocolo. Portanto, a parte da transmissão dos dados ocorre, por padrão, igual à comunicação serial assíncrona.

Entretanto, existem alguns detalhes particulares da SPI:

Configuração do clock

O primeiro passo consiste na configuração do clock que é feita pelo mestre. A velocidade do clock deve ser configurada de modo que o escravo à suporte.

Seleção do escravo

Depois disto, o mestre deve selecionar o escravo o qual ele deseja se comunicar. Conforme dito no tópico sobre os barramentos, isto é feito mandando um sinal de nível 0 no escravo.

Este procedimento também vale para o caso em que o escravo só seja selecionado com uma borda de descida. Isso porque, antes de selecioná-lo, a linha estava em nível alto, então, obrigatoriamente, irá aparecer uma borda de descida.

E, os demais escravos que não forem selecionados devem manter o canal MISO no estado de alta impedância e não devem processar os dados recebidos no MOSI.

Transmissão dos dados

A cada ciclo de clock, um bit é transmitido do mestre para o escravo e vice-versa. Normalmente, existe um registrador de deslocamento de 8/16/32… bits em cada lado, que transmite a informação de um lado para o outro, um bit por vez.

O bit mais significativo é enviado primeiro. E, ao final da transmissão, o valor de um registrador foi passado para o outro. Veja o procedimento na imagem abaixo:

Fonte: Wikipedia

Obviamente, se o mestre deseja ler um certo registrador do escravo, ele primeiro manda o comando e, depois de ser recebido pelo escravo, o escravo devolve a informação desejada.

Por fim, quando a comunicação chega ao fim, o mestre interrompe o canal do clock e para de selecionar o escravo.

Observação

É possível mandar um comando para vários escravos ao mesmo tempo. O problema disto é que a linha MISO deve ser ignorada pelo mestre, já que vários escravos irão mandar valores ao mesmo tempo no mesmo canal.

Se for uma comunicação unidirecional, não há problema em fazer isto.

 

Referência: https://en.wikipedia.org/wiki/Synchronous_Serial_Interface

I²C