O objetivo deste artigo é definir os princípios da comunicação SPI (Serial Peripheral Interface), quais são suas vantagens e onde esses dispositivos são utilizados. Também vamos analisar os fundamentos básicos de hardware.
Tipos de Comunicação Serial
Uma vez que os equipamentos eletrônicos vêm agregando mais e mais funções, a utilização de diversos circuitos integrados torna-se cada vez mais comum. No entanto, não é mais possível estender longos barramentos de comunicação paralelos, pois tornariam as placas de circuito impresso caras e muito grandes. Logo, uma comunicação serial entre esses dispositivos se torna necessária.
Diversas tecnologias de interligação serial entre dispositivos foram desenvolvidas, podendo ser separadas em duas grandes categorias, a comunicação síncrona e a comunicação assíncrona. Dentre os métodos de comunicações mais conhecidos, destacam-se três:
- UART: Universal Asynchronous Receiver Transmitter;
- SPI: Serial Peripheral Interface;
- I2C: Inter Integrated Circuit.
Já estamos bastante familiarizados com a comunicação serial assíncrona pelo uso do padrão UART (RS232). No entanto, existem grandes vantagens no uso de uma comunicação serial síncrona (SPI, I2C e I2S) em detrimento da assíncrona.
Além disso, há grandes diferenças mesmo entre os protocolos síncronos. Apesar do padrão de cada protocolo definir limites máximos de taxas, cada fabricante possui a liberdade de desenvolver dispositivos com suas velocidades. Abaixo temos um comparativo entre diversos padrões dispositivos seriais:
|
Tecnologia |
Barramento de comunicação |
Taxa máxima |
Fluxo de dados |
|
UART (RS232) |
2 (sem controle de fluxo) |
115.200 bps |
Half ou Full Duplex |
|
SPI |
3 + nº de Slaves |
2 Mbps |
Full Duplex |
|
I2C |
2 (até 127 dispositivos) |
400 Kbps |
Half Duplex |
Como um exemplo de que esses limites podem ser ultrapassados, temos AT45BD0100D da Adesto. Essa memória SPI pode chegar até 66MHz (66Mbps) de taxa de transferência. Para o I2C, o 24FC64 da Microchip pode chegar a 1MHz (1Mbps).
Na comunicação serial síncrona definimos também o conceito de Mestre-Escravo. Normalmente o gerador do sinal de sincronismo é definido como o Mestre (Master) da comunicação. Para os dispositivos que utilizam do sinal de sincronismo gerado damos a definição de Escravo (Slave). A ligação mais comum desse tipo de comunicação é um Master e vários Slaves.
Comunicação SPI
A comunicação SPI possui algumas características básicas. Primeiramente os sinais de comunicação possuem uma direção fixa e definida. Isso significa que sempre existem dois transistores definindo o estado de um pino (Push-Pull). Essa característica é uma das grandes diferenças entre outras comunicações seriais como I2C e OneWire, que possuem um mesmo barramento de dados para os sinais de entrada e saída através do esquema de dreno-aberto (Pull-Up).
Apesar de utilizar dois sinais de comunicação de dados em vez de um, é possível atingir velocidades maiores de comunicação. Isso porque há pouca deformação do sinal.
Outra característica é que toda troca de dados acontece sempre em ambas as direções. Em outras palavras, cada bit trocado entre o Master e um Slave trás um bit do Slave para o Master. Dessa forma, definimos que a comunicação é sempre full-duplex.
Os pinos básicos de comunicação entre dispositivos SPI e o esquema padrão de ligação são dados conforme abaixo:
|
Pino |
Nome Padrão |
Significado |
Nomes Alternativos |
|
Do Master para o Slave |
MOSI |
Master Output Slave Input |
SDO, DO, SO |
|
Do Slave para o Master |
MISO |
Master Input Slave Output |
SDI, DI, SI |
|
Clock |
SCLK |
Serial Clock |
SCK, CLK |
|
Seleção de Slave |
SS |
Slave Select |
CS, nSS, nCS |
O sinal de SS da SPI funciona como Seleção de Escravo (Slave Select). É um sinal ativo em nível baixo, o que significa que o dispositivo é selecionado quando este pino se encontra em nível baixo. No entanto, muitos dispositivos utilizam este sinal como sincronismo de frame. Dessa forma, é um sinal importante que deve ser respeitado.
O Dispositivo
O princípio básico de um dispositivo SPI é o Shift-Register. Esse tipo de dispositivo faz a conversão de um registrador paralelo para sinais seriais de acordo com clock. Cada borda recebida no terminal de clock do dispositivo significa um bit transferido. Da mesma forma esse tipo de dispositivo é capaz de receber dados vindos de maneira serial e convertê-los para um valor em um registrador paralelo.
A SPI não apenas é capaz de fazer essa conversão serial/paralelo, como também possui o gerador de clock, o controle para a troca do frame e o slave-select. Dessa forma, tornando ele um dispositivo de comunicação completo. Na figura abaixo podemos observar como ele se dispõe.
Forma de Onda
Por padrão a comunicação SPI permite a configuração das bordas de comunicação do clock através de sua polaridade e fase. A configuração da polaridade se dá através de CPOL (Clock Polarity), e a configuração da fase se dá através de CPHA (Clock Phase). Seus modos possíveis são:
|
Modo |
CPOL |
CPHA |
Borda de troca |
Transição |
Nível em IDLE |
|
0 |
0 |
0 |
Subida |
Meio do bit |
1 |
|
1 |
0 |
1 |
Descida |
Começo do bit |
0 |
|
2 |
1 |
0 |
Descida |
Meio do bit |
0 |
|
3 |
1 |
1 |
Subida |
Começo do bit |
1 |
Outra característica fundamental na comunicação SPI é a definição da posição do bit mais significativo (MSB). Através de DORD é possível definir que o bit mais significativo será o primeiro (DORD = 0) ou o último (DORD = 1) bit trocado. É possível observar todas essas características através das duas imagens abaixo:
Conclusão – Comunicação SPI
Pudemos observar as principais características da comunicação SPI, além de um comparativo de hardware com outros tipos de comunicação. Observamos diagramas do funcionamento do dispositivo e entendemos como se dá a forma de onda.
No próximo artigo vamos entender quais são as principais características de software para sua comunicação, utilizando o Arduino como hardware base. Também vamos estudar a estrutura de software com um dispositivo de mercado.
E a série continua
Leia também a sequência desse artigo em Comunicação SPI – Parte 2, onde abordamos mais detalhes de comunicação e os fundamentos básicos de software, e Comunicação SPI – Parte 3, onde apresentamos um exemplo de comunicação entre um microcontrolador AT89S8253 e uma memória 25LC256.
Referências para SPI
https://gse.ufsc.br/~bezerra/disciplinas/ProgPerif/sem04.2/Seminarios/RicardoPlaner/Apresentacao.htm
https://www.youtube.com/watch?v=QMNck8nKw-k
https://www.ni.com/example/31163/en/
https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
https://home.kpn.nl/thomas_7/1wire/1wire_isolating.html
https://www.adestotech.com/sites/default/files/datasheets/doc3639.pdf
https://ww1.microchip.com/downloads/en/DeviceDoc/21189T.pdf












Muito bom, parabéns.
Muito didático e bem elaborado o artigo, obrigado pelo empenho em compartilhar o conhecimento!
Muito Obrigado, ajudou bastante. Mas acho que tem um erro na tabela Nome e Nome alternadido. O Alternativo do MISO deveria ser o SDO ou DO e não DI ou SDI. Pelo menos na Maioria dos Esquemas Elétricos que vi são assim.
Caro Francesco obrigado por sua exposição. Estou usando um arduino com 3 periféricos fazendo comunicação SPI. 2 termopares controlados por dois Max 31856 e 1 cartão SD. Acontece que eu não consigo fazer os dois Max lerem as temperaturas e o SD receber os valores e gravar, ao mesmo tempo. Usando a biblioteca SD.h, os Max funcionam e leem temperaturas, mas não ocorre a gravação dos dados no SD. Usando a biblioteca SdFat.h, ocorre a comunicação entre o arduino e o cartão SD, ocorrendo a gravação, mas os valores de temperatura nos termopares permanecem zerados, ou seja, provavelmente não há… Leia mais »
Muito bom, comunicação clara e objetiva, parabéns!
Excelente, Francesco! Muito didática a sua explicação.
Bom dia. Você poderia me indicar alguém que pode me ajudar com um projeto de eletrônica da faculdade? Mediante pagamento, claro. Envolve microcontroladores e o protocolo SPI. Agradeço.
Bom dia, estou efetuando um projeto no arduino Mega 2560 onde uso um display no qual usa os mesmos pinos padrões do módulo RFID RFC 522, é possível alterar as portas para comunicar ambos dispositivos?
Olá Francesco! Sou estudante do curso técnico de eletrônica na ETEC Takashi Morita, e estou com dificuldade para compreender algumas coisas referentes aos protocolos SPI e I2C, sobre qual devo usar e entendê-los melhor.
Enfim, estou fazendo um projeto de TCC que consiste em uma fechadura NFC, onde usarei o arduino, uma shield para motores DC e uma outra shield leitora de NFC, gostaria apenas de saber qual protocolo devo usar? ou como devo escolher entre protocolos? (o que devo levar em conta para a decisão ou se devo consultar alguma especie de Datasheet).
Agradeço desde já, ótimo conteúdo!
Caro, poderia confirmar os nomes alternativos dos pinos MISO e MOSI, em outras documentações estão MISO->SO e MOSI->SI.
Entre na discussãoOlá Fernando, Sim, dependendo do fabricante existem nomes alternativos. Mas é bom ficar atento, porque o funcionamento muda também. Usando a Atmel como exemplo, os nomes são MISO (Master Input Slave Output) e MOSI (Master Output Slave Input). Perceba que o pino MISO vai ser entrada se o SPI estiver configurado como Master, e será saída se estiver configurado como Slave. Já a Microchip, por exemplo, coloca SI (Serial Input) e SO (Serial Output). No entanto, SI é sempre entrada, não importa se está como Master ou como Slave. Se estiver configurado como Master, o SI está fazendo… Leia mais »