O que é interface spi de 4 fios. Como trabalhar com SPI – Teoria. Diagrama de temporização de sinal

Hoje começamos a conhecer o pneu SPI (Interface Periférica Serial).

Este barramento é amplamente utilizado em eletrônica. É muito conveniente, por ser síncrono e full duplex, portanto, é utilizado em diversos circuitos para comunicação entre diversos dispositivos digitais - sensores, controladores, drivers e outros dispositivos.

Outro fator importante na necessidade de nosso conhecimento é que este barramento está organizado em hardware em controladores AVR.

Além disso, queiramos ou não, já nos comunicamos com a interface SPI há muito tempo, assim que começamos a piscar nosso controlador pela primeira vez, já que ele é atualizado através desta interface.

Por isso, gostaria de conhecer melhor esse pneu.

Vamos abrir a documentação técnica do controlador Atmega8, abrir a página onde é mostrada a pinagem deste controlador e ver que dos pinos 16 ao 19 existem pinos do barramento SPI

Agora um pouco mais sobre essas descobertas

SS (seleção de chip)— este é o trecho de seleção do dispositivo. Se o dispositivo escravo neste pino ficar baixo, então este aparelho responderá e trocará informações através do barramento SPI; se estiver alto, não o fará.

MOSI (saída mestre, entrada escrava)- Este é o pino de saída do dispositivo mestre e a entrada do dispositivo escravo.

MISO (entrada mestre e saída escrava)- pelo contrário, a saída do escravo, a entrada do mestre.

SCK— perna de sincronização. Todos os dispositivos participantes da troca de informações neste barramento são alimentados com pulsos de clock em uma determinada frequência.

Aqui está um diagrama da implementação do barramento SPI no controlador Atmega8

Como qualquer barramento, existem vários registros que armazenam determinadas informações.

Temos interesse no SHIFT REGISTER, as informações são trocadas por meio dele. Assim que houver uma determinada borda no pino de sincronização, seja descendente ou ascendente, dependendo das configurações, esses registros dos dispositivos escravo e mestre trocarão informações, e não todas as informações, mas apenas um bit. Esses registradores se deslocarão para a esquerda e os bits mais significativos de cada registrador irão para os bits menos significativos do mesmo registrador do dispositivo associado. Ou seja, o escravo transmitirá seu bit mais significativo através do pino MOSI para o líder, que o escreverá no bit de ordem inferior desocupado devido ao deslocamento para a esquerda, e o escravo transferirá seu bit de ordem superior deslocado através do MISO. pino na parte de ordem inferior do líder. É assim que ocorre a troca, ou seja, em 8 ciclos completos de clock eles trocarão completamente os bytes

Assim que todos os 8 bits de um byte de informação forem transmitidos, um determinado registro nos sinalizará que Este processo finalizado. Ou melhor, um certo registro.

Também no diagrama de blocos vemos um divisor, cuja entrada recebe pulsos de clock e então, divididos por um determinado valor, eles são enviados através de uma cadeia até o pino SCK e de lá são alimentados ao dispositivo escravo no pino de o mesmo nome. Isso garante a operação sincronizada dos dispositivos. A frequência do clock é selecionada a partir da mais baixa suportada por todos os dispositivos participantes da troca.

Digo plural porque pode haver mais do que apenas dois dispositivos em um determinado circuito. Como isso é garantido, desde que os dispositivos não possuam endereços, direi agora.

Existem diversas formas de troca de informações entre vários dispositivos, ou seja, quando existem vários escravos por dispositivo mestre. Veremos os dois mais comuns deles.

O primeiro método é radial (clique na imagem para ampliar a imagem)

Aqui o mestre direciona os dados para um dispositivo específico, ativando o 0 lógico no pino SS. Com este método, é possível selecionar apenas um dispositivo, você também precisará de vários pinos livres das portas do controlador.

Existe outro método interessante - anel ou cascata (clique na imagem para ampliar a imagem)

Aqui vemos que as pernas de seleção são todas paralelas e a troca ocorre em círculo. Assim, a velocidade diminui devido ao fato de o círculo de transmissão aumentar, mas as pernas da porta são salvas.

Estudaremos tudo isso com mais detalhes nas próximas lições, quando utilizarmos determinados dispositivos em nossos projetos.

Bem, parece que com o circuito de transmissão de dados via barramento IPS nós descobrimos isso.

Agora vamos descobrir como controlar esse processo no nível dos registros de hardware do controlador AVR.

Vemos esses registros no diagrama de blocos acima na página.

Atmega8 possui os seguintes registros para atender o barramento SPI.

SPDR (registro de dados SPI)- registrador de dados, no diagrama de blocos é DATA BUFFER. Inseriremos um byte neste registro para sua posterior transmissão ao dispositivo escravo, e a partir dele leremos o byte de informação que veio do dispositivo escravo. Também não é necessário que nosso controlador seja o dispositivo mestre. Posteriormente, montaremos um circuito de dois controladores, sendo que um deles será escravo. Portanto é neste registro que estará localizado o byte tanto para envio quanto para recebimento.

SPCR (Registro de Controle SPI)- registro de controle

Este registro inclui os seguintes bits:

SPIE (ativação de interrupção SPI)- um bit que permite interrupções.

SPE (habilitar SPI)— um bit que habilita o barramento SPI.

DORD (ordem de dados)— um bit que define a ordem em que os bits são enviados. Se for definido como 1, o bit menos significativo será enviado primeiro; se for definido como 0, o bit mais significativo será enviado.

MSTR (seleção mestre/escravo)— um bit que designa um dispositivo como mestre ou escravo. Quando este bit for definido como 1, o dispositivo será o mestre.

CPOL (Polaridade do Relógio)— polaridade de sincronização, determina em qual borda do pulso de sincronização o modo de espera será iniciado

Se este bit for 1, teremos um modo standby com borda ascendente, e se for 0, então com borda descendente.

CPHA (fase do relógio)— um bit responsável pela fase do clock, ou seja, em qual borda o bit será transmitido.

Vejamos os diagramas de transferência de dados dependendo da instalação do CPOL e CPHA

Esta é uma dependência muito interessante. Às vezes às vezes vemos em especificações técnicas de qualquer dispositivo que, por exemplo, possa operar nos modos SPI 0:0 e SPI 1:1, é justamente isso que diz respeito à configuração desses bits.

SPR1, SPR0 (seleção de taxa de clock SPI)- estes são os bits responsáveis ​​pelo valor do divisor de frequência de sincronização e trabalham em conjunto com o bit; SPI2X localizado no registro de status. É também de controle, pois oito bits no registrador de controle não foram suficientes para todas as configurações, e há muitos bits livres no registrador de status.

SPSR (registro de status SPI)- registro de status

SPI2X (bit de velocidade SPI duplo)- um bit que dobra a velocidade, trabalhando em conjunto com os bits SPR1 e SPR0 do registrador de controle.

Vamos ver a dependência da frequência desses três bits

SPIF (sinalizador de interrupção SPI)— Sinalizador de interrupção. Estamos esperando que este bit seja definido como um. quando recebemos um byte. Assim que o byte de outro dispositivo aparecer completamente em nosso buffer, este sinalizador será definido. Este sinalizador só funciona se o bit que habilita as interrupções estiver definido, assim como as interrupções globais estiverem habilitadas.

WCOL (gravar sinalizador COLLision)— o sinalizador de conflito ou colisão será definido se houver um conflito de bits durante a transferência de dados, se durante a transferência de dados for feita uma tentativa de gravação no registro de dados.

Bem, agora podemos dizer que nos familiarizamos um pouco com a interface SPI.

Assista ao VÍDEO TUTORIAL(clique na imagem)

Visualizações de postagens: 6.294

IPS(Barramento periférico serial) - protocolo de troca periférica serial. Este piercing foi desenvolvido por Motorola, mas atualmente é usado por muitos fabricantes. Ele foi projetado para conectar microcontroladores entre si, bem como com todos os tipos de periféricos: sensores, ADCs, chips de memória, relógios. Mas ainda é o uso mais comum IPS- Isto é escrever um programa na memória do microcontrolador. Em microcontroladores AVR com a ajuda IPS você pode atualizar o microcontrolador sem desoldá-lo da placa, esse método de piscar é chamado ISP (na programação do sistema). Embora os nomes IPS E ISP muito consonantes, não são a mesma coisa, em SPI do AVR usado como camada física ISP, ou seja, linhas são usadas IPS para transferência de dados, mas o protocolo em si (nível de software) é diferente.

Três linhas são usadas para transmitir dados para SPI:

MISO (Entrada Mestre Saída Escrava)– através desta linha o Master (master) recebe dados do Slave (escravo).

MOSI (Entrada Escrava de Saída Mestre)– o Master envia dados ao Slave através desta linha.

SCK (relógio serial)– serve para transmitir um sinal de relógio ao dispositivo escravo.

Linha também é usada SS (seleção de escravo), que define o dispositivo com o qual Mestre trocará dados.

Devido ao fato de muitos fabricantes usarem SPI em seus dispositivos, os nomes dos pinos podem ser ligeiramente diferentes. Abaixo está uma tabela com nomes alternativos.


Existem dois tipos de SPI: hardware e software. Ao implementar software IPS, devemos definir manualmente o sinal nas pernas do correspondente MISO, MOSI, SS enquanto puxa SCK. Com implementação de hardware IPS transferimos os dados para um registrador especial, e o próprio microcontrolador realiza as manipulações descritas acima, de acordo com as configurações preliminares.

Implementação física IPS, representa dois registradores de deslocamento conectados entre si.


Dependendo do nível de sinal lógico SCK, a sincronização ocorre Mestre E Escravo e em qual frente os dados são capturados e transferidos, 4 modos são possíveis IPS.

  • CPOL = 0 - o sinal de sincronização inicia em nível baixo;
  • CPOL = 1 - o sinal de sincronização inicia em nível alto;
  • CPHA = 0 - os dados são amostrados na borda ascendente do sinal de sincronização;
  • CPHA = 1 – os dados são amostrados na borda descendente do sinal de sincronização.
Os oscilogramas abaixo mostram a aparência do pacote 0x17 em diferentes modos.
CPOL = 0 CPHA = 0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL = 1 CPHA = 1

IPS- interface síncrona, ou seja, para receber alguns dados de Escravo, Mestre deveria enviar alguma coisa. Tudo parece claro, mas e se Mestre envia um byte e Escravo devo devolver dois a ele? Neste caso, o Master deverá enviar-lhe algo 2 vezes, por exemplo 0x00.
//envia o comando, a resposta deve ter dois bytes Spi_Master_Transmit(chx); //envia algo para receber o primeiro byte Spi_Master_Transmit(0X00); toque_x = SPDR; toque_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Isso é tudo, o exemplo de código acima foi retirado de um projeto em funcionamento.

Interface periférica serial ou IPS- interface periférica serial, utilizada para comunicação entre periféricos e microcontrolador. Por exemplo, o periférico poderia ser: display, vários sensores, memória FLASH, cartão SD (sim, sim, o cartão SD ou “pen drive” que você usa em telefones e câmeras se comunica com mundo exterior usando a interface SPI), etc.

Infelizmente, não existe documentação oficial para a interface SPI, então este post é baseado em vários artigos na Internet, minha própria experiência e documentação para microcontroladores.

Leia sobre o que é SPI nos artigos da Wikipedia

EM IPS Sempre há um mestre e um/vários escravos.

A transferência de dados é sempre iniciada pelo mestre.

SPI usa quatro linhas de comunicação:

  • MOSI ou SI.- saída mestre, entrada escrava (inglês) MestreForaEscravoEm). Serve para transferir dados do dispositivo mestre para o escravo.
  • MISSÔ ou ENTÃO- entrada mestre, saída escrava (inglês) MestreEmEscravoFora). Serve para transferir dados de um dispositivo escravo para um dispositivo mestre.
  • SCLK ou SCK- sinal de relógio serial SerialRelógio). Serve para transmitir um sinal de clock para dispositivos escravos.
  • C.S. ou SS- escolha do microcircuito, escolha do escravo (eng. Seleção de chip, seleção de escravo).

P.S. Para garantir a comunicação unidirecional com um dispositivo, basta usar SCLK, MOSI(caso o dispositivo escravo receba apenas) ou SCLK, MISSÔ(caso o dispositivo escravo não receba nada, apenas transmita informações). Na entrada C.S. dispositivo escravo deve ser definido como lógico zero, caso contrário o escravo não funcionará.

P.S. Se o dispositivo escravo transmite e recebe, você pode limitar-se a três fios - MISSÔ, MOSI, SCLK, na entrada C.S. dispositivo escravo também precisa definir o lógico zero.

IPS pode ser implementado em um microcontrolador hardware, então a tarefa de gerenciar a interface é resolvida para cada microcontrolador separadamente, pois as implementações podem variar. Por exemplo, para ATmega328®(microcontrolador da Atmel) ao trabalhar com IPS precisamos instalá-lo programaticamente em SS lógico zero no início da recepção/transmissão e definir lógico unidade de volta às fim da transmissão.

Para transferir dados para um dispositivo escravo, você precisa registro de deslocamento MASTER (na imagem, o registrador de deslocamento do mestre é “ REGISTRO DE MUDANÇA DE 8 BITS") escreva byte de informação transmitida. Ao mesmo tempo, automaticamente SCK começará a gerar sinal de relógio. Esta é a implementação de hardware.

Se não houver suporte de hardware para SPI no microcontrolador, então a interface SPI sempre pode ser implementado em software, ou seja criar um programa que controla as pernas do controlador de acordo com o protocolo de troca SP.

Diferenças nas implementações de interface SPI

Os microcircuitos escravos podem “interpretar” o sinal recebido via SPI de forma diferente, a diferença pode estar nos seguintes pontos:

  • na quantidade de transmissão de dados ou tamanho do pacote, geralmente isso 8 bits, mas há mais
  • em ordem de bits, inicialmente parte mais significativa ou primeiro bit menos significativo
  • Por para qual nível de sinal de clock os dados são transmitidos?(por unidade lógica (HIGH) ou zero lógico (LOW))
  • Por em qual borda do pulso ocorre a sincronização?(subida ou descida), brevemente chamada de “fase de sincronização”

Combinação " nível de sinal do relógio" E " fases de sincronização» é definido nas especificações como Modos de operação SPI. Há apenas :

Modo Intensidade do sinal (CPOL) Fase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

Na coluna " Nível de sinal» , significa que bit de dados, aceitaram escravo quando zero é transmitido ao longo da linha de sincronização, em outras palavras - um dispositivo escravo espera e não aceita dados quando ligado SCK definido como lógico 1.

Na coluna " Estágio» , significa que o sinal de sincronização é determinado por borda descendente do pulso do clock e lógico 0-l Por borda ascendente do pulso do clock.

P.S. Além disso, se na coluna “ Nível de sinal» instalado , então a frente descendente e ascendente, se representada no diagrama, será “ de cabeça para baixo».

Em gráficos, dados 4 modos pode ser representado da seguinte forma:

Você pode ler mais sobre os princípios de funcionamento do SPI no artigo

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementação de SPI em microcontroladores ATmega da série AVR (ATmega328P) e microcontroladores “antigos” da Motorola

Em um microcontrolador ATmega328P(microcontrolador da série Atmel AVR) você pode controlar o seguinte parâmetros IPS:

Três registros são usados ​​para configurar e controlar a interface SPI:

  • Registro de controle - SPCR
  • Registro de status - SPSR
  • Registro de dados - SPDR

Leia mais sobre cada um deles...

Registro de controle – « SPCR» 0x2C, endereço para gravação 0x4C

— Unidade lógica em 7ª parte(nome do bit ESPIÃO) – habilitar interrupções SPI(uma interrupção ocorrerá se o bit de habilitação de interrupção do registro global estiver definido SREG(7º bit)). Após a conclusão da transferência de bytes, uma interrupção será gerada.

— Unidade lógica em 6ª parte(nome do bit - SPE) - conectar SS, MOSI, MISO E SCKàs portas do microcontrolador ATmega328P - PB2, PB3, PB4, PB5.

— Unidade lógica em 5ª parte(nome do bit DORD) – determinará que de acordo com IPS transmitido primeiro classificação júnior, A então o mais velho– Modo “LSB”. O zero lógico, ao contrário, significa que o bit mais significativo é transmitido primeiro e depois o bit menos significativo - modo “MSB”.

— Unidade lógica em 4ª parte(nome do bit - MSTR) — modo host habilitado, zero – habilita o modo escravo

— Unidade lógica em 3ª parte(nome do bit CPOL) (polaridade do sinal de sincronização ou nível de sincronização) – sincronizaçãoé realizado de acordo com falta de impulso(zero lógico) ou o sinal do relógio no estado de espera é igual a 1. Zero lógico - a sincronização é realizada pela presença de um pulso (por um lógico) ou o sinal do relógio no estado de espera é igual a 0. Ao longo de qual frente (declínio ou subida) a sincronização é realizada é determinada em pedaço ( CPHA).

— Unidade lógica em 2ª parte(nome do bit CPHA) (fase de sincronização) – determina que o sinal de sincronização determinado pela borda descendente do SCK e zero lógico na borda ascendente SCK. Além disso, se CPOL for definido como 1, então as frentes descendente e ascendente podem ser representadas “de cabeça para baixo” no diagrama.

E pouco com pouco SPI2x no registro SPSR determinar Taxa de dados SPI(ou velocidade do clock via SCK). Esses bits só têm significado para o mestre; para o escravo, eles não têm sentido, porque A velocidade de recepção depende da frequência SCK do mestre.

Onde fosc a frequência do clock do oscilador mestre SPI (geralmente é igual à frequência do clock do processador).

Registro de Status - "SPSR"(endereço em ATmega328P para leitura 0x2D, endereço para gravação 0x4D, se você tiver um MK diferente, poderá encontrar os endereços na documentação)

bit de registro " SPIF": Sinalizador de interrupção SPI

O bit está definido unidade, Quando transferência de bytes dados sobre MOSI concluído. Se o bit de habilitação de interrupção SPI (bit SPIE) no registro SPCR estiver definido, a configuração do sinalizador SPIF causa a geração de uma solicitação de interrupção.

bit de registro " WCOL": Escrever sinalizador COLLision

Pedaço escrever conflito para o registro SPDR. O bit está definido unidade, se em tempo de transmissão os dados estão em execução tentativa de gravação V registro de dados SPDR.

- Com 5 ª Por bit – bits reservados, seu valor é sempre igual a 0

pedaço " SPI2X": Bit de velocidade SPI duplo

Pedaço " velocidade dupla transmissão de dados" Se o bit estiver escrito unidade, Que velocidade transferências dados duplicados. Usando uma combinação deste bit e E pedaço ( SPR1, SPR0) registro SPCR, determinar velocidade de transmissão Dados do SPI. .

Registro de Dados - “SPDR”(endereço em ATmega328P para leitura 0x2E, endereço para gravação 0x4E, se você tiver um MK diferente, poderá encontrar os endereços na documentação)

O tamanho do registro é o mesmo acima - 8 bits. Este registrador é usado para transmitir e ler dados via IPS. Ao colocar dados nele, você inicia o processo de transferência.

Vejamos 3 exemplos de trabalho com a interface SPI no ATmega328P em ambientes:

-Arduino

#incluir bytex=B11000000; //bit transmitido byte y= B00000000; //o bit receptor será gravado na variável y void setup() ( SPI.begin(); /* inicialização SPI */ /* inicialização no Arduino isso significa - definir um em SS - definir para saída SS (Slave Select ou seleção de escravo) - 10 pinos - definir 1 nos seguintes bits do registro de controle SPCR: no 4º bit (nome do bit - MSTR) - habilitar modo mestre no 6º bit (nome do bit - SPE) - conectar SS, MOSI, MISO e SCK para portas PB4,PB5,PB6,PB7 (10,11,12,13 pinos no Arduino) - configure os seguintes pinos de saída: SCK (Serial Clock ou sinal de clock) - MOSI de 13 pinos (Master Out Slave In ou dados de o mestre) - 11 pinos Como resultado da inicialização via SPI.begin(), a configuração da interface SPI é a seguinte: - a ordem dos bits “MSB”, ou seja, o bit mais significativo é transmitido primeiro e depois o o menos significativo - a sincronização é realizada pela presença de um pulso ou sinal de clock no estado wait é 0 - o sinal de sincronização é determinado pela borda ascendente do SCK (dois pontos acima indicam que o modo SPI neste caso é 0 ) - taxa de transmissão fosc/4 */ // PODEMOS REINICIALIZAR ALGUNS PARÂMETROS DE COMUNICAÇÃO SPI nós mesmos // ordenar sequências de bits //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - júnior primeiro, depois sênior MSBFIRST - sênior primeiro, depois júnior (valor padrão de SPI.begin) */ // frequência de troca de dados //SPI.setClockDivider(SPI_CLOCK_DIV4); /* é definido como a razão entre fosc e o coeficiente, cujos valores possíveis são: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //Modo de operação SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - modo zero SPI_MODE1 - primeiro modo SPI_MODE2 - segundo modo SPI_MODE3 - terceiro modo */ ) void loop() ( /* IMPLEMENTAÇÃO DE TRANSFERÊNCIA DE DADOS VIA SPI */ digitalWrite(10, HIGH); /* somos obrigados a definir nós mesmos em SS 1-tsu */ y=SPI.transfer(x); transmitindo um argumento bit a bit (byte) e recebendo uma resposta do dispositivo escravo, a transferência é realizada atribuindo o valor do byte. para o registro SPDR e neste momento automaticamente para SCK (13 pinos) um sinal de clock é gerado */ digitalWrite(10, LOW /* somos obrigados a definir SS para 0 */ SPI.end(); o barramento SPI dos pinos 10,11,12,13 */ /* Ou seja, define 0 para o 6º bit (SPE) do registrador SPCR */ )

#incluir

byte x = B11000000; //bit transmitido

byte y = B00000000; //o bit receptor será escrito na variável y

configuração nula() (

SPI. começar(); /* Inicialização SPI */

/* inicialização no Arduino isso significa

Definir unidade para SS

Definir para saída SS (Slave Select ou seleção de escravo) - 10 pinos

Defina os seguintes bits do registro de controle SPCR como 1:

No 4º bit (nome do bit - MSTR) - habilite o modo mestre

B 6º bit (nome do bit - SPE) - conectar

SS, MOSI, MISO e SCK

Para portas PB4, PB5, PB6, PB7

(10,11,12,13 pinos no Arduino)

Configure os seguintes pinos de saída:

SCK (Relógio serial ou sinal de relógio) - 13 pinos

MOSI (Master Out Slave In ou dados do mestre) - 11 pinos

Como resultado da inicialização via SPI.begin()

Nossa configuração de interface SPI é a seguinte:

A ordem dos bits é "MSB", ou seja, O bit mais significativo é transmitido primeiro e depois o bit menos significativo

A sincronização é baseada na presença de um pulso

Ou o sinal do relógio no estado inativo é 0

O sinal de sincronização é determinado pela borda ascendente do SCK

(os dois pontos acima indicam que o modo SPI neste caso é 0)

Taxa de transmissão fosc/4

// PODEMOS REINICIALIZAR ALGUNS PARÂMETROS DE COMUNICAÇÃO SPI nós mesmos

//ordem dos bits

//SPI.setBitOrder(MSBFIRST);

//frequência de troca de dados

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* definido como uma relação

Fosc a um coeficiente cujos valores possíveis são:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Modo de operação SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0 - modo zero

SPI_MODE1 - primeiro modo

SPI_MODE2 - segundo modo

SPI_MODE3 - terceiro modo

loop vazio()

/* IMPLEMENTAÇÃO DE TRANSFERÊNCIA DE DADOS VIA SPI */

digitalWrite(10, ALTO); /* somos obrigados a instalar 1-tsu no SS nós mesmos */

y = SPI. transferência(x); /* transmitindo um argumento bit a bit (byte) e recebendo uma resposta do dispositivo escravo

A transferência é realizada atribuindo ao registrador SPDR o valor do byte

E neste momento automaticamente no SCK (13 pinos)

Um sinal de clock é gerado */

digitalWrite(10, BAIXO); /* somos obrigados a definir SS como 0 */

SPI. fim(); /* desativa o barramento SPI dos pinos 10,11,12,13 */

/* Aquilo é define 0 para o bit 6 (SPE) do registro SPCR */

- Estúdio Atmel (AVR GCC)

#incluir #incluir void init_spi() ( DDRB=(1<

#incluir

#incluir

vazio init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//configura pinos para SPI (SS, SCK, MOSI - saída, entrada MOSI)

// inicialização do SPI

// Tipo SPI: Mestre

// Taxa de clock SPI: 2.000.000 kHz

// Fase do relógio SPI: início do ciclo

// Polaridade do relógio SPI: baixa

// Ordem de dados SPI: MSB primeiro

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Interfaces de transferência.

Muitas interfaces de transferência de dados foram desenvolvidas para transferir dados de um dispositivo para outro ou de um chip para outro. Cada interface tem lados positivos e negativos, então você precisa saber quais interfaces existem, seus prós e contras, e usar a interface certa para transferir dados em uma determinada situação.

As interfaces vêm com transferência de dados assíncrona e síncrona. Com a transmissão síncrona de dados, um sinal de clock é transmitido simultaneamente com os dados, permitindo a sincronização do receptor e do transmissor. Um exemplo desse protocolo é a interface SPI.

Na transmissão assíncrona de dados não há sinal de clock. Nessas linhas existe o perigo de incompatibilidade entre o receptor e o transmissor, como resultado do qual outros dados não serão recebidos corretamente. Para evitar isso, as interfaces assíncronas realizam sincronização periódica ao longo das linhas de dados. A vantagem de tais interfaces é o menor número de condutores necessários para a transmissão.

Vamos dar uma olhada em algumas das interfaces mais populares.

Interface USART.

A interface USART é um transceptor síncrono-assíncrono universal serial. Os dados são transferidos para o USART em intervalos regulares. Este período de tempo é determinado pela velocidade USART especificada e é especificado em baud (para caracteres que só podem assumir valores iguais a zero ou um, baud é equivalente a bits por segundo). Existe uma faixa geralmente aceita de velocidades padrão: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 baud.

Além dos bits de dados, o USART insere automaticamente marcas de sincronização no fluxo, os chamados bits de início e de parada. Após a recepção, esses bits extras são removidos. Normalmente, os bits de início e parada separam um byte de informação (8 bits), mas existem implementações USART que permitem a transmissão de 5, 6, 7, 8 ou 9 bits. Os bits separados pelos sinais de início e parada são o envio mínimo. O USART permite inserir dois bits de parada durante a transmissão para reduzir a probabilidade de dessincronização do receptor e do transmissor em tráfego intenso. O receptor ignora o segundo bit de parada, tratando-o como uma pequena pausa na linha.

A convenção é que o estado passivo (na ausência de dados) da entrada e saída USART é um “1” lógico. O bit inicial é sempre um “0” lógico, então o receptor USART espera por uma transição de “1” para “0” e conta a partir dele um intervalo de tempo de metade da duração do bit (o meio da transmissão do bit inicial) . Se neste momento a entrada ainda for “0”, inicia-se o processo de recebimento da parcela mínima. Para fazer isso, o receptor conta durações de 9 bits seguidos (para dados de 8 bits) e registra o estado de entrada a cada momento. Os primeiros 8 valores são dados recebidos, o último valor é um valor de teste (bit de parada). O valor do bit de parada é sempre “1”; se o valor real recebido for diferente, o USART registra um erro.

Para formar intervalos de tempo, os USARTs de transmissão e recepção possuem uma fonte de tempo preciso (clocking). A precisão desta fonte deve ser tal que a soma dos erros (receptor e transmissor) no ajuste do intervalo de tempo desde o início do pulso de partida até o meio do pulso de parada não exceda a metade (ou melhor ainda, pelo menos um quarto) do intervalo de bits. Para uma mensagem de 8 bits 0,5/9,5 = 5% (na realidade não mais que 3%). Como esta é a soma dos erros do receptor e do transmissor mais a possível distorção do sinal na linha, a tolerância recomendada para a precisão do clock USART não é superior a 1,5%.

Como os bits de clock ocupam parte do fluxo de bits, a taxa de transferência UART resultante não é igual à velocidade da conexão. Por exemplo, para transmissões no formato 8-N-1 de 8 bits, os bits de clock ocupam 20% do fluxo, o que para uma velocidade física de 115.200 baud fornece uma taxa de bits de dados de 92.160 bps ou 11.520 bytes/s.

Paridade

O protocolo USART tem a capacidade de monitorar automaticamente a integridade dos dados usando o método de paridade de bits. Quando esse recurso está habilitado, o último bit de dados (o "bit de paridade") é sempre 1 ou 0, de modo que o número de uns em um byte é sempre par.

Controle de fluxo

Antigamente, os dispositivos USART podiam ser tão lentos que não conseguiam acompanhar o fluxo de dados recebidos. Para resolver este problema, os módulos USART foram fornecidos com saídas e entradas de controle de fluxo separadas. Quando o buffer de entrada estava cheio, a lógica do USART receptor definiu o nível de inibição na saída correspondente e o USART transmissor suspendeu a transmissão. Mais tarde, o controle de fluxo foi atribuído a protocolos de comunicação e a necessidade de linhas de controle de fluxo separadas desapareceu gradualmente.

Implementação física.

USART é um protocolo de troca, ou seja, determina o método de formação de bits, parâmetros de transmissão de bytes, velocidade de transmissão, etc.

Mas a implementação física do USART pode ser diferente. Por exemplo, para transmitir dados dentro de uma placa, os sinais são transmitidos nos níveis de +5V e 0V. Para transferência de dados em longas distâncias e entre dispositivos, são utilizados outros níveis e padrões de tensão física, como: loop de corrente (4-20 mA), RS-232 (porta COM), RS-485 e similares.

Para converter níveis de “controlador” de 0-5V em níveis “padrão”, existe um grande número de microcircuitos especializados, por exemplo ADM202 para RS-232.

Interface serial SPI

O nome SPI é uma abreviatura de "Serial Peripheral Bus", que reflete sua finalidade - um barramento para conectar dispositivos externos. O barramento SPI é organizado de acordo com o princípio mestre-escravo. O barramento mestre geralmente é um microcontrolador, mas também pode ser uma lógica programável, um controlador DSP ou um ASIC. Os dispositivos conectados ao mestre são escravos. Seu papel é desempenhado por vários tipos de microcircuitos, incl. dispositivos de armazenamento (EEPROM, memória Flash, SRAM), relógio de tempo real (RTC), ADC/DAC, potenciômetros digitais, controladores especializados, etc.

O principal componente da interface SPI é um registrador de deslocamento convencional, cuja sincronização e sinais de entrada/saída de fluxo de bits formam os sinais da interface. Assim, é mais correto chamar o protocolo SPI não de protocolo de transferência de dados, mas de protocolo de troca de dados entre dois registradores de deslocamento, cada um dos quais desempenha simultaneamente a função de receptor e transmissor. Um pré-requisito para a transmissão de dados no barramento SPI é a geração de um sinal de sincronização do barramento. Somente o líder tem o direito de gerar este sinal e o trabalho do escravo depende totalmente dele.

Conexão.

Existem três tipos de conexão ao barramento SPI, cada um envolvendo quatro sinais. A finalidade dos sinais SPI está descrita na Tabela 7.1.

A conexão mais simples, que envolve apenas dois microcircuitos, é mostrada na Figura 7.2. Aqui, o barramento mestre transmite dados ao longo da linha MOSI de forma síncrona com o sinal SCLK gerado por ele, e o escravo captura os bits de dados transmitidos em certas bordas do sinal de sincronização recebido. Ao mesmo tempo, o escravo envia seu pacote de dados. O circuito apresentado pode ser simplificado eliminando a linha MISO caso o IC escravo utilizado não forneça transmissão de dados de resposta ou não haja necessidade disso. A transferência de dados unidirecional pode ser encontrada em chips como DACs, potenciômetros digitais, amplificadores programáveis ​​e drivers. Assim, a opção considerada para conectar um IC escravo requer 3 ou 4 linhas de comunicação.

Para que o IC escravo receba e transmita dados, além de ter um sinal de clock, a linha SS também deve ser reduzida. Caso contrário, o IC escravo ficará inativo. Quando apenas um IC externo é usado, pode ser tentador eliminar a linha SS reduzindo a entrada de seleção do IC escravo. Esta solução é extremamente indesejável e pode levar a falhas ou até mesmo à impossibilidade de transferência de dados, pois A entrada de seleção do chip serve para redefinir o IC ao seu estado inicial e às vezes inicia a saída do primeiro bit de dados.

Caso seja necessário conectar vários microcircuitos ao barramento SPI, utiliza-se uma conexão independente (paralela) (Fig. 7.3) ou uma conexão em cascata (serial) (Fig. 7.4). A conexão independente é mais comum, porque alcançado ao usar qualquer chip compatível com SPI. Aqui, todos os sinais, exceto a seleção de microcircuitos, são conectados em paralelo, e o barramento mestre, ao mover um ou outro sinal SS para um estado baixo, especifica com qual IC escravo ele trocará dados. A principal desvantagem de tal conexão é a necessidade de linhas adicionais para endereçamento de chips escravos (o número total de linhas de comunicação é 3+n, onde n é o número de chips escravos).

Se não houver pernas de microcontrolador suficientes, você poderá usar um chip demultiplexador. O demultiplexador conecta um único sinal de entrada a um dos sinais de saída, dependendo do código nos pinos de controle. A Figura 7.4 mostra o diagrama de conexão do demultiplexador. O sinal SS é fornecido à sua entrada, que assume valor igual a 0 caso seja necessário selecionar um dos microcircuitos. O número do microcircuito necessário em código binário é fornecido às pernas Am-A0. Isso permite reduzir o número de pernas usadas no microcontrolador para m=log 2 n. Onde n é o número de chips escravos. Aqueles. para conectar 128 dispositivos, são necessários 8 pinos do microcontrolador. Um para configurar o sinal de habilitação e 7 para configurar o número do chip a ser ligado. Deve-se notar que deve haver um lógico nas pernas não conectadas do demultiplexador. Caso contrário, é utilizado um inversor de sinal, que converte um zero lógico em um lógico.

A comutação em cascata está livre desta desvantagem, porque aqui, vários chips formam um grande registrador de deslocamento. Para fazer isso, a saída de transmissão de dados de um IC é conectada à entrada de recepção de dados do outro, conforme mostrado na Figura 3. As entradas de seleção de chip aqui são conectadas em paralelo e, assim, o número total de linhas de comunicação é mantido igual. a 4. Porém, a utilização da conexão em cascata só é possível se seu suporte estiver indicado na documentação dos chips utilizados. Para descobrir, é importante saber que tal conexão é chamada de “daisy-chaining” em inglês.

Protocolo de transferência

O protocolo de transmissão pela interface SPI é essencialmente idêntico à lógica do registrador de deslocamento (Figura 7.6), que consiste em realizar uma operação de deslocamento e, consequentemente, bit de entrada e saída de dados em certas bordas do sinal de sincronização. A configuração de dados durante a transmissão e a amostragem durante a recepção são sempre realizadas em clocks opostos. Isto é necessário para garantir que os dados sejam amostrados depois de terem sido estabelecidos de forma confiável. Se levarmos em conta que a primeira borda do ciclo de transmissão pode ser uma borda ascendente ou descendente, então existem quatro opções lógicas possíveis para o funcionamento da interface SPI. Essas opções são chamadas de modos SPI e são descritas por dois parâmetros:

· CPOL - nível inicial do sinal de sincronização (se CPOL=0, então a linha de sincronização antes do início do ciclo de transmissão e após o seu final tem um nível baixo (ou seja, a primeira borda está subindo e a última está caindo), caso contrário, se CPOL=1, - alto (ou seja, a primeira frente está caindo e a última está subindo));

· CPHA - fase de sincronização; Este parâmetro determina a sequência na qual os dados são instalados e recuperados. Se CPHA=0, então na borda ascendente do ciclo do clock os dados serão amostrados e, então, na borda descendente os dados serão definidos. Se CPHA=1, então a instalação dos dados será realizada na borda ascendente do ciclo de sincronização e a amostragem será realizada na borda descendente.

Informações sobre os modos SPI são apresentadas nas Figuras 7.7 e 7.8.

Os chips mestre e escravo operando em modos SPI diferentes são incompatíveis, portanto, antes de escolher os chips escravos, é importante esclarecer quais modos são suportados pelo barramento mestre. Os módulos SPI de hardware integrados aos microcontroladores, na maioria dos casos, suportam a capacidade de selecionar qualquer modo e, portanto, quaisquer chips SPI escravos podem ser conectados a eles (aplica-se apenas a uma opção de conexão independente). Além disso, o protocolo SPI em qualquer um dos modos é facilmente implementado em software.

Interface RS-485

A interface RS-485 (outro nome é EIA/TIA-485) é um dos padrões de camada de comunicação física mais comuns. A camada física é um canal de comunicação e um método de transmissão de sinais (camada 1 do modelo OSI de interconexão de sistemas abertos).

Uma rede construída na interface RS-485 consiste em transceptores conectados por meio de um par trançado - dois fios trançados. A interface RS-485 é baseada no princípio de transmissão diferencial (balanceada) de dados. Sua essência é transmitir um sinal por dois fios. Além disso, um fio (condicionalmente A) carrega o sinal original e o outro (condicionalmente B) carrega sua cópia inversa. Em outras palavras, se houver “1” em um fio, então “0” no outro e vice-versa. Assim, existe sempre uma diferença de potencial entre os dois fios de um par trançado: em “1” é positivo, em “0” é negativo (Figura 7.9).

É essa diferença de potencial que transmite o sinal. Este método de transmissão oferece alta imunidade a interferências de modo comum. A interferência de modo comum é uma interferência que afeta igualmente ambos os fios da linha. Por exemplo, uma onda eletromagnética que passa por uma seção de uma linha de comunicação induz potencial em ambos os fios. Se o sinal for transmitido por potencial em um fio em relação ao comum, como no RS-232, então a interferência neste fio pode distorcer o sinal em relação ao comum (terra), que absorve bem a interferência. Além disso, a diferença de potencial de terra cairá na resistência de um longo fio comum - uma fonte adicional de distorção. E com a transmissão diferencial, não ocorre distorção. Na verdade, se dois fios estiverem próximos um do outro e até mesmo entrelaçados, o captador de ambos os fios será o mesmo. O potencial em ambos os fios igualmente carregados muda igualmente, enquanto a diferença de potencial informativa permanece inalterada.

Implementação de hardware da interface RS485.

Implementação de hardware da interface - chips transceptores com entradas/saídas diferenciais (para a linha) e portas digitais (para as portas UART do controlador). Existem duas opções para esta interface: RS-422 e RS-485.

RS-422 é uma interface full duplex. A recepção e a transmissão ocorrem em dois pares separados de fios. Só pode haver um transmissor em cada par de fios.

RS-485 é uma interface half-duplex. A recepção e a transmissão ocorrem em um par de fios com separação de tempo. Podem existir vários transmissores em uma rede, pois eles podem ser desligados no modo de recepção (Figura 7.10).

Explicação dos símbolos na Fig. 7.10

D (motorista) - transmissor;
R (receptor) - receptor;
DI (entrada do driver) - entrada digital do transmissor;
RO (saída do receptor) - saída digital do receptor;
DE (driver enable) - permissão para operar o transmissor;
RE (habilitação do receptor) - permissão para operar o receptor;
A - entrada/saída diferencial direta;
B - entrada/saída diferencial inversa;
Y - saída diferencial direta (RS-422);
Z - saída diferencial inversa (RS-422).

Vamos dar uma olhada mais de perto no transceptor RS-485. A saída digital do receptor (RO) está conectada à porta UART do receptor (RX). Entrada digital do transmissor (DI) para porta do transmissor UART (TX). Como o receptor e o transmissor estão conectados no lado diferencial, o transmissor deve ser desligado durante a recepção e o receptor deve ser desligado durante a transmissão. Para tanto, são utilizadas entradas de controle - permissão do receptor (RE) e permissão do transmissor (DE). Como a entrada RE é inversa, ela pode ser conectada a DE e comutar o receptor e o transmissor com um sinal de qualquer porta do controlador. No nível “0” - funciona para recepção, em “1” - para transmissão (Fig. 7.11).

O receptor, recebendo a diferença de potencial (UAB) nas entradas diferenciais (AB), converte-as em sinal digital na saída RO. A sensibilidade do receptor pode ser diferente, mas os fabricantes de chips transceptores escrevem na documentação a faixa de limite garantida para reconhecimento de sinal. Normalmente, esses limites são ±200 mV. Ou seja, quando UAB > +200 mV - o receptor detecta "1" quando UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Todos os dispositivos são conectados a um cabo de par trançado da mesma maneira: saídas diretas (A) para um fio, saídas inversas (B) para o outro.

A impedância de entrada do receptor do lado da linha (RAB) é normalmente 12KΩ. Como a potência do transmissor não é ilimitada, isso cria um limite no número de receptores conectados à linha. De acordo com a especificação RS-485, levando em consideração os resistores de terminação, o transmissor pode acionar até 32 receptores. No entanto, existem vários microcircuitos com impedância de entrada aumentada, o que permite conectar significativamente mais de 32 dispositivos à linha.

A velocidade máxima de comunicação de acordo com a especificação RS-485 pode chegar a 10 Mbaud/seg. A distância máxima é de 1200 metros. Caso seja necessário organizar a comunicação a uma distância superior a 1200 metros ou conectar mais dispositivos do que a capacidade de carga do transmissor permite, são utilizados repetidores especiais.

Interface I2C.

Essa interface foi proposta pela Philips, que a utilizou para organizar a comunicação entre chips em seus televisores. I 2 C (uma abreviatura de Inter-Integrated Circuit) é um barramento serial assíncrono bidirecional. Fisicamente, o barramento I 2 C consiste em duas linhas de sinal, uma das quais (SCL) é projetada para transmitir um sinal de clock e a segunda (SDA) para troca de dados. Para controlar as linhas são utilizados estágios de saída com coletor aberto, portanto as linhas do barramento devem ser conectadas a uma fonte de +5 V através de resistores com resistência de 1...10 kOhm, dependendo do comprimento físico das linhas e a taxa de transferência de dados. O comprimento das linhas de conexão no modo padrão pode chegar a 2 metros, a taxa de transferência de dados é de 100 kbit/s.

Todos os assinantes do ônibus são divididos em duas classes - “Líder” e “Escravo”. O dispositivo mestre gera um sinal de clock (SCL). Ele pode acessar o barramento de forma independente e endereçar qualquer dispositivo escravo com a finalidade de transmitir ou receber informações. Todos os dispositivos escravos “escutam” o barramento para detectar seu próprio endereço e, tendo-o reconhecido, realizam a operação prescrita. Além disso, o chamado modo “MultiMaster” é possível, quando vários dispositivos mestres são instalados no barramento, que compartilham juntos dispositivos escravos comuns, ou atuam alternadamente como mestres quando eles próprios iniciam a troca de informações, ou como escravos quando eles estão aguardando acesso de outro dispositivo mestre. O modo “MultiMaster” requer monitoramento e reconhecimento constante de conflitos. A este respeito, este modo é mais difícil de implementar (ou seja, implementação de software) e, como resultado, é menos utilizado em produtos reais.

No momento inicial - no modo standby - ambas as linhas SCL e SDA estão em um estado lógico (o transistor do estágio de saída do coletor aberto está fechado). No modo de transmissão (Figura 7.12), o bit de dados SDA é sincronizado pela borda ascendente do SCL. As informações na linha SDA são alteradas quando a linha SCL está no estado zero. O dispositivo escravo pode “manter” a linha SCL no estado zero, por exemplo, enquanto processa o próximo byte recebido, enquanto o dispositivo mestre deve esperar até que a linha SCL seja liberada antes de continuar a transmitir informações.

Para sincronizar os pacotes do barramento I 2 C, distinguem-se duas condições - “START” e “STOP”, limitando o início e o fim do pacote de informações (Figura 7.13). Para codificar essas condições, é utilizada uma mudança no estado da linha SDA com um único estado da linha SCL, o que é inaceitável na transmissão de dados. A condição "START" é formada quando uma borda descendente aparece na linha SDA, quando a linha SCL está em um estado único, e vice-versa, a condição "STOP" é formada quando uma borda ascendente aparece na linha SDA quando o SCL linha está em um único estado.

A transmissão de dados começa na primeira borda ascendente da linha SCL, que cronometra o bit mais significativo do primeiro byte de informação. Cada byte de informação (8 bits) contém 9 períodos de clock da linha SCL. No nono ciclo, o dispositivo receptor emite uma confirmação (ACK) - uma borda descendente indicando a recepção de dados. Deve-se notar que qualquer assinante do barramento, tanto mestre quanto escravo, pode em momentos diferentes ser tanto um transmissor quanto um receptor e, de acordo com o modo, é obrigado a receber ou emitir um sinal ACK, cuja ausência é interpretada como um erro.

Para iniciar uma operação de troca de dados, o dispositivo mestre emite uma condição “START” no barramento. A condição “START” é seguida por um byte com o endereço do dispositivo escravo (Figura 7.14), composto por um endereço do dispositivo de sete bits (bits 1...7) e um flag de operação de leitura e escrita de um bit - “ R/W” (bit 0). O bit R/W determina a direção da troca, com 0 significando transferência de dados do mestre para o escravo (Figura 7.14a) e 1 significando leitura do escravo (Figura 7.14b). Todos os bits do barramento I 2 C são transmitidos em ordem de alto para baixo, ou seja, o 7º bit é transmitido primeiro e o 0º por último. O endereço pode ser seguido por um ou mais bytes de informação (na direção especificada pelo sinalizador R/W), cujos bits são sincronizados pelo mestre no barramento SCL.

Ao realizar uma operação de leitura, o host deve ACK o byte lido se quiser ler o próximo byte, e não emitir um ACK se estiver prestes a terminar a leitura do pacote (veja a Figura 7.14b).

É permitido retomar o endereço do dispositivo escravo múltiplas vezes em um ciclo de transmissão, ou seja, transmitir uma condição “START” repetida sem uma condição “STOP” prévia (Figura 7.14c).

É necessário observar algumas características dos chips de memória que operam através da interface I 2 C e os procedimentos para troca de dados com eles. Primeiramente, a memória de dados não volátil desses microcircuitos é dividida em páginas de memória, portanto, quando um byte é gravado, a página inteira é primeiro copiada para a RAM interna do microcircuito, onde é alterada a célula desejada. Depois disso, a página antiga é apagada e uma nova é escrita em seu lugar. Outra característica é que os quatro bits mais significativos do endereço escravo devem ser sempre iguais a 1010. Este requisito é regulamentado pela própria Philips.

O barramento de 1 fio usa apenas um condutor para comunicação e alimentação. O modo de comunicação é assíncrono e half-duplex, que segue rigorosamente o padrão mestre-escravo. Um ou mais dispositivos escravos podem ser conectados ao mesmo barramento ao mesmo tempo. Apenas um dispositivo mestre pode ser conectado a um barramento.

O estado inativo do barramento corresponde a um nível alto, que é gerado por um resistor pull-up. O valor do resistor pull-up é fornecido na documentação do IC escravo. Todos os chips conectados ao barramento devem ser capazes de produzir um nível baixo. Se a saída do microcontrolador não suportar três estados, então é necessário fornecer um driver que possua saída de coletor aberto ou dreno aberto

A transmissão do sinal pelo barramento de 1 fio é dividida em intervalos de tempo de 60 µs de duração. Apenas um bit de dados é transmitido por intervalo de tempo. Os dispositivos escravos podem ter diferenças significativas em relação aos atrasos nominais. No entanto, isso requer um timing mais preciso por parte do líder para garantir a comunicação correta com os subordinados que têm bases de tempo diferentes.

Sinais básicos de barramento.

O mestre inicia cada comunicação no nível de bit. Isto significa que a transmissão de cada bit, independentemente da direção, deve ser iniciada pelo mestre. Isto é conseguido definindo o barramento como nível baixo, o que sincroniza a lógica de todos os outros dispositivos. Existem 5 comandos principais para comunicação via barramento 1-Wire: “Write log. 1”, “Escrever registro. 0”, “Ler”, “Redefinir” e “Presença”.

Sinal “Escrever log. 1"

Sinal “Escrever log. 1” é mostrado na Fig. 7h15. O mestre define o nível baixo para 1...15 µs. Em seguida, ele libera o barramento pelo restante do intervalo de tempo.

Arroz. 7.15 – Sinal “Escrever log. 1"

Sinal “Escrever log. 0"

Sinal “Escrever log. 0” é mostrado na Figura 7.16. O mestre gera um nível baixo por pelo menos 60 µs, mas não mais que 120 µs.

Fig 7.16 – Sinal “Escrever log. 0"

Sinal de leitura

O sinal “Leitura” é mostrado na Fig. 7.17. O mestre define o nível baixo para 1...15 µs. O escravo então mantém o barramento em nível baixo se desejar transmitir um registro. 0. Se for necessário transferir o log. 1, então simplesmente libera a linha. A varredura do barramento deve ser realizada dentro de 15 µs após o barramento ficar baixo. Quando visto do lado do mestre, o sinal “Read” é, em essência, um sinal “Write log”. 1". O estado interno real do escravo será determinado pelo sinal “Record log”. 1" ou "Leitura".

Figura 7.17 – Sinal de “Leitura”

Sinal de reinicialização/presença

Os sinais “Reset” e “Presença” são mostrados na Figura 7.18. Observe que os intervalos de tempo de pulso são diferentes. O mestre puxa para baixo por 8 intervalos de tempo (480 µs) e então libera o barramento. Este longo período de condição baixa é chamado de sinal de “Reset”.

Se um escravo estiver presente no barramento, ele deverá, dentro de 60 µs após o mestre liberar o barramento, definir um nível baixo por pelo menos 60 µs. Esta resposta é chamada de “Presença”. Se tal sinal não for detectado, o mestre deve assumir que não há dispositivos conectados ao barramento e que nenhuma comunicação adicional é possível.

USB (Universal Serial Bus) foi desenvolvido para conectar rapidamente dispositivos externos a um computador pessoal e, em seguida, localizar e instalar o software necessário. Dispositivos de baixo consumo de energia são alimentados diretamente pela interface.

O padrão USB implica a presença de apenas um dispositivo Master (Host) na rede. Além disso, o padrão suporta até 127 dispositivos escravos na rede. Para distinguir entre dispositivos mestre e escravos, foram desenvolvidos diferentes tipos de conectores (Figura 7.19): Tipo A para o mestre e Tipo B para o escravo. Aceita-se que a tensão de 5V esteja presente apenas no conector tipo A, que é o conector mestre. O restante dos dispositivos é alimentado diretamente por ele.

O padrão USB utiliza 4 fios blindados, dois dos quais transmitem energia (+5v e GND) (Figura 7.19 e Tabela 7.2). Os outros dois representam sinais de dados diferenciais de par trançado. Esquema de codificação usado NRZI(Non Return to Zero Invert) para transmissão de dados com campo de sincronização para sincronizar os relógios mestre e escravo.

O padrão USB 2.0 introduziu o padrão On-The-Go (OTG), que introduziu o Host Negotiation Protocol, que permite que dois dispositivos USB concordem sobre quem atuará como mestre. Isto destina-se e é limitado a conexões ponto a ponto únicas, como um telefone celular a um computador pessoal.

USB suporta conexão “hot” (plug’n’play) com drivers carregados e descarregados dinamicamente. O usuário simplesmente conecta o dispositivo, conectando-o ao barramento. O host detecta a conexão, pesquisa o dispositivo recém-inserido e carrega o driver apropriado, indicando o momento do carregamento com uma ampulheta na tela (caso o driver do dispositivo USB já esteja instalado no sistema). O usuário final não se importa com rescisão ou IRQ(interrupções) e endereços de porta, nem sobre a reinicialização do computador (não é necessário reiniciar). Quando o usuário terminar de usar o dispositivo USB, basta removê-lo (ou desconectar o cabo), o host detectará a ausência do dispositivo e descarregará automaticamente o driver.

O SB versão 1.1 suporta duas velocidades - modo de velocidade total com velocidade de 12 Mbits/s e modo de baixa velocidade com velocidade de 1,5 Mbits/s. O modo de 1,5 Mbits/s é mais lento e menos sensível à EMI (interferência), o que reduz o custo dos grânulos de ferrite e reduz os requisitos de qualidade dos componentes.

O cabo de barramento de velocidade total é um cabo de par trançado, protegido por uma blindagem, e também pode ser usado para operação em baixa velocidade. Um cabo para operação apenas em velocidade mínima (por exemplo, para conectar um mouse) pode ser qualquer e não blindado.

O padrão USB 2.0 introduz um modo de alta velocidade com taxa de transferência de dados de 480Mbits/s.

Transferência de dados.

Todas as transferências de dados pela interface são iniciadas pelo host. Os dados são transmitidos na forma de pacotes. A interface USB usa vários tipos de pacotes:

A) assinar pacote (pacote de tokens) descreve o tipo e a direção da transferência de dados, o endereço do dispositivo e o número de série do ponto final (CT é a parte endereçável do dispositivo USB); Existem vários tipos de pacotes de recursos: EM, FORA, SOF, CONFIGURAR;

B) pacote de dados (pacote de dados) contém os dados transmitidos;

B) pacote de aprovação (pacote de aperto de mão) destina-se a relatar os resultados da transferência de dados; Existem vários tipos de pacotes de coordenação: CONFIRMAR, N.A.K., PARAR.

A transferência de dados via USB é realizada da seguinte forma:

O primeiro pacote, o chamado token, é gerado pelo dispositivo mestre para descrever o tipo de dados que estão sendo transferidos, a operação de transferência (leitura ou gravação), o endereço do dispositivo e o terminal. O próximo normalmente transmitido é um pacote de dados contendo informações úteis, seguido por um pacote de handshake indicando que os dados ou token foram recebidos com sucesso ou que o terminal está paralisado ou indisponível para aceitar dados.

Os terminais no padrão USB são as fontes e os coletores de dados. Todos os dispositivos devem suportar o ponto final 0. Este é o ponto final que aceita todas as solicitações de controle e status durante a enumeração (uma solicitação de tratamento para determinar o tipo de dispositivo conectado) e enquanto o dispositivo permanecer operacional no barramento.

Os terminais numerados a partir de 1 são usados ​​para transmitir informações do usuário. Vejamos alguns exemplos.

O driver de dispositivo transmite para o endpoint do dispositivo mestre EP1. Porque Este dispositivo é o mestre, então os dados vão para o buffer OUT EP1. Neste caso, um token OUT é enviado, indicando que os dados estão prontos para serem enviados. Tendo recebido este token, o dispositivo escravo pode ler dados do buffer OUT.

Se o dispositivo escravo precisar transferir dados para o mestre, ele os coloca no buffer IN. Este buffer irá reter os dados até que o mestre envie um token IN solicitando dados do endpoint. Todos os buffers de endpoint são nomeados em relação ao mestre, ou seja, O buffer de saída do dispositivo escravo é chamado IN porque é o buffer de entrada do dispositivo mestre.

A transferência de dados de um endpoint para outro é feita por meio de streams. Fluxo – Uma conexão lógica entre um host e um(s) endpoint(s).

Os streams também possuem um conjunto de parâmetros como tipo de transmissão (Controle, Bulk, Iso ou Interrupt), direção do fluxo de dados e tamanhos máximos de pacotes/buffers.

Por exemplo, o fluxo padrão é um fluxo bidirecional composto pelo terminal IN 0 e pelo terminal OUT 0 com controle de tipo de transferência.

USB define dois tipos de tubos

A) Tubos de fluxo não possuem um formato USB predefinido, portanto você pode enviar qualquer tipo de dados através do stream pipe e recuperar os dados na outra extremidade. Os fluxos de dados são sequenciais e possuem uma direção pré-determinada - IN ou OUT. Stream pipes suportam tipos de transferência em massa, isócrona e de interrupção. Os tubos de fluxo podem ser controlados pelo host ou pelo dispositivo.

B) Canais de mensagens tem um formato USB predefinido. Eles são controlados pelo host, iniciados por uma solicitação enviada pelo host. Os dados são enviados na direção desejada especificada na solicitação. Assim, os canais de mensagens permitem que os dados sejam transferidos em ambas as direções, mas suportam apenas transferências de controle.

O padrão USB descreve quatro tipos de transferência de dados:

A) Encaminhamento de controle (transferência de controle) é usado para configuração do dispositivo, bem como para outras finalidades específicas do dispositivo.

B) Transmissão (transferência em massa) é usado para transmitir uma quantidade relativamente grande de informações.

B) Interromper encaminhamento (transferência interrompida) é utilizado para transmitir uma quantidade relativamente pequena de informação, para a qual a sua transmissão atempada é importante. Tem uma duração limitada e maior prioridade em comparação com outros tipos de transferências.

D) Encaminhamento isócrono (transferência isócrona) também é chamado de streaming em tempo real. As informações transmitidas em tal transferência requerem uma escala de tempo real durante a sua criação, transmissão e recepção.

Transferências de streaming caracterizado pela garantia de transferência de dados sem erros entre o host e a função, detectando erros durante a transmissão e solicitando novamente informações. Quando o host fica pronto para receber dados de uma função, ele envia um pacote de sinalização para a função EM-saco de plástico. Em resposta a isso, a função na fase de transferência de dados transmite um pacote de dados para o host ou, se for

Com classificações de 10 Ohm a 1 MOhm);

  • conectar fios (por exemplo, este é um bom conjunto);
  • computador pessoal com ambiente de desenvolvimento Arduino IDE.
  • 1 Descrição da série Interface SPI

    SPI – Interface Periférica Serial ou “Interface Periférica Serial”é um protocolo de transferência de dados síncrona para emparelhamento dispositivo mestre Com dispositivos periféricos (escravo). O dispositivo mestre geralmente é um microcontrolador. A comunicação entre dispositivos ocorre por meio de quatro fios, razão pela qual o SPI às vezes é chamado de “interface de quatro fios”. Estes são os pneus:

    Existem quatro modos de transferência de dados ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), causado pela combinação da polaridade dos pulsos de clock (trabalhamos no nível HIGH ou LOW), Polaridade do Relógio,CPOL, e a fase dos pulsos de clock (sincronização na borda ascendente ou descendente do pulso de clock), Fase do relógio, CPHA.

    A figura explica esta tabela.

    A interface SPI oferece diversas opções para conectar dispositivos escravos: independente E cascata. Quando conectado de forma independente ao barramento SPI, o dispositivo mestre acessa cada dispositivo escravo individualmente. Com uma conexão em cascata, os dispositivos escravos operam um por um, como se estivessem em cascata.


    Tipos de conexão de dispositivos para operação via interface SPI: independente e em cascata

    2 Implementação da interface SPI nas placas da família Arduino

    No Arduino, os barramentos de interface SPI estão localizados em portas específicas. Cada placa tem sua própria atribuição de pinos. Por conveniência, as conclusões são duplicadas e também colocadas em um separado Conector ICSP(Na programação serial de circuito, programar um dispositivo incluído em um circuito usando um protocolo serial). Observe que o conector ICSP não possui pino de seleção de escravo - SS, pois presume-se que o Arduino será usado como dispositivo mestre na rede. Mas se necessário, você pode atribuir qualquer pino digital do Arduino como SS.

    A figura mostra a correspondência padrão de pinos com barramentos SPI para Arduino UNO e Nano.


    3 Biblioteca para trabalho com interface SPI

    Uma biblioteca especial foi escrita para Arduino que implementa o protocolo SPI. Ele se conecta assim: no início do programa adicionamos #include SPI.h.

    Para começar a usar o protocolo SPI, você precisa definir as configurações e inicializar o protocolo usando o procedimento SPI.beginTransaction(). Você pode fazer isso com uma instrução: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Isso significa que inicializamos o protocolo SPI na frequência de 14 MHz, a transmissão dos dados ocorre a partir do MSB (bit mais significativo), no modo SPI_MODE0.

    Após a inicialização, selecione o dispositivo escravo movendo o pino SS correspondente para o estado BAIXO.

    Em seguida, transferimos os dados para o dispositivo escravo com o comando SPI.transferência().

    Após a transferência devolvemos SS ao estado ALTO.


    O trabalho com o protocolo é concluído com o comando SPI.endTransaction().

    É aconselhável minimizar o tempo de transferência entre as instruções SPI.beginTransaction() e SPI.endTransaction() para evitar problemas se outro dispositivo tentar iniciar uma transferência de dados usando configurações diferentes.

    4 Conectando um registrador de deslocamento para Arduino

    Consideremos a aplicação prática da interface SPI. Acenderemos os LEDs controlando um registrador de deslocamento de 8 bits através do barramento SPI. Vamos nos conectar ao Arduino registrador de deslocamento 74HC595. Conectaremos um LED com valor nominal de 220 Ohms a cada uma das 8 saídas do registro através de um resistor limitador. O diagrama é mostrado na figura.


    5 Esboço para controlar um registrador de deslocamento via interface SPI

    Vamos escrever um esboço como este.

    #incluir const int pinSelect = 8; // registra o pino selecionado configuração nula() ( SPI.begin(); // inicializando a interface SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // seleciona dispositivos escravos (registro) SPI.transfer(0); // limpa o conteúdo do registrador digitalWrite(pinSelect, HIGH); // fim da transmissão Serial.begin(9600); } loop vazio() ( para (int eu=0; eu )

    Primeiro, vamos conectar a biblioteca SPI e inicializar a interface SPI. Vamos definir o pino 8 como o pino de seleção do escravo SS. Vamos limpar o registrador de deslocamento enviando o valor "0" para ele. Inicialize a porta serial.

    Para acender um LED específico usando um registrador de deslocamento, você precisa aplicar um número de 8 bits à sua entrada. Por exemplo, para que o primeiro LED acenda, fornecemos o número binário 00000001, para o segundo - 00000010, para o terceiro - 00000100, etc. Esses números binários, quando convertidos para o sistema numérico decimal, formam a seguinte sequência: 1, 2, 4, 8, 16, 32, 64, 128 e são potências de dois de 0 a 7.

    Assim, no ciclo laço() Com base no número de LEDs, recalculamos de 0 a 7. Função pow(base, grau) Eleva 2 à potência do contador de loop. Os microcontroladores não funcionam com muita precisão com números do tipo "duplo", por isso usamos a função de arredondamento para converter o resultado em um número inteiro redondo(). E transferimos o número resultante para o registrador de deslocamento. Para maior clareza, o monitor da porta serial exibe os valores obtidos durante esta operação: A unidade “passa” pelas descargas - os LEDs acendem em forma de onda.

    6 "Onda Correndo" de LEDs

    Os LEDs acendem um por um e observamos uma “onda” de luzes em movimento. Os LEDs são controlados por meio de um registrador de deslocamento, ao qual nos conectamos por meio da interface SPI. Como resultado, apenas 3 pinos do Arduino são usados ​​para controlar 8 LEDs. Se estivéssemos conectando os LEDs diretamente às portas digitais do Arduino, precisaríamos usar uma porta separada para cada LED.

    Estudamos o exemplo mais simples de Arduino trabalhando com o barramento SPI. Consideraremos com mais detalhes a operação de vários registradores de deslocamento com conexões independentes e em cascata em um artigo separado.