O Serial Peripheral Interface (SPI) foi desenvolvido pela Motorola para permitir que suas fichas para se comunicar uns com os outros, tanto como a Philips inventou o barramento serial I2C para os seus próprios circuitos integrados. Enquanto estes dois ônibus fazem em grande parte o mesmo trabalho, ambos se tornaram quase igualmente comuns, e muitos dispositivos periféricos usam um ou outro para se comunicar com um microcontrolador host. Esta ubiquidade é a razão pela qual os PIM apoiam ambos.

SPI tem algumas vantagens sobre I2C, em particular suporte para maior taxa de transferência de dados., A SPI também tem uma capacidade duplex que a torna particularmente adequada para as aplicações que requerem comunicação simultânea de duas vias.

Por outro lado, SPI requer pelo menos três fios, compartilhados por todos os dispositivos no barramento, e um número de linhas de seleção de dispositivo, um para cada periférico ligado ao dispositivo controlador. I2C, por contraste, requer apenas dois fios; ele usa endereços únicos para identificar todos os dispositivos no barramento., Isso torna o trabalho com vários dispositivos mais simples do que a abordagem sem endereço de SPI, embora alguns desenvolvedores preferem usar hardware para selecionar um dispositivo em vez de dados de endereço.

Controladores E Periféricos

SPI separa os dispositivos em “controladores” e “periféricos”. Apenas um dispositivo pode enviar pulsos de tempo para sincronizar as transferências de dados, e esse é o escolhido para ser o controlador. Todos os outros, que sincronizam seus horários com o controlador, são considerados periféricos subsidiários., O controlador — que em seu produto deve ser seu imp atualmente-e seus periféricos podem todos transmitir e receber dados, mas apenas o controlador pode estabelecer o padrão de tempo para o qual todos eles operam. Este estabelecimento de um esquema de tempo fixo é o que faz SPI, como I2C, um ônibus “síncrono”.

o barramento físico

a implementação de SPI do imp tem quatro linhas:

  • SCLK, o sinal de relógio serial do controlador.
  • COPI, abreviatura de “Controller Out, Peripheral In” (por vezes etiquetado MOSI em fichas antigas).,CIPO, abreviatura de “Controller In, Peripheral Out” (por vezes rotulado MISO).
  • CS, abreviatura de “Chip Select” (por vezes rotulado SS, nSS ou SYNC)

COPI e CIPO são as linhas de transferência de dados.

o imp001 e o imp002 não fornecem pinos CS dedicados: em vez disso, você pode usar qualquer um destes pinos GPIO outros. O imp003 e up fornecem pinos CS dedicados como parte de seus ônibus SPI, marcados na página imp pin mux.

Note que o imp005 fornece um pin de seleção de chip dedicado em cada um dos seus dois ônibus SPI. Para spiBCAD este é o pin D; para spi0 este é o pin CS0., O chipselect método imp API() pode ser usado para assumir o controle da asserção e de-asserção destes pinos de seleção de chips (por favor veja a documentação do método para mais informações).


SPI no imp: até quatro linhas de conectar-se a um único dispositivo periférico

Esta abordagem segue a Motorola, a definição do SPI: que cada ônibus de transação, essencialmente, um lote de bytes de dados — deve ser ligada a um determinado periférico., Texas Instruments modificou a especificação SPI para permitir que cada byte seja enviado para um periférico específico, embora isso requer uma linha CS dedicada. Este modo não é suportado de momento por nenhum imp.

sinalização

assumindo que temos um único periférico ligado ao controlador, as comunicações são iniciadas pelo controlador puxando a linha CS para baixo. O diz ao periférico para se preparar para conversar. Agora o controlador começa a enviar pulsos de relógio ao longo da linha SCLK; tipicamente as transmissões de dados são tecidas para a borda ascendente de cada pulso, embora isso nem sempre seja o caso.,

Clocking the data in and out: the imp sends a command, the peripheral returns data

The controller will now transmit data on the COPI line, actively driving the line high to signal a 1 or low for a 0. O periférico irá ler o sinal-que pode ser um comando para a leitura de um sensor a ser enviado, por exemplo — e irá devolver essa informação na linha CIPO, novamente dirigindo a linha para ficar alto para sinalizar um 1 ou dirigindo-o baixo para transmitir um 0., Esta exigência de que a linha seja impulsionada ativamente alto ou baixo, ao invés de deixá-la se estabelecer em um estado ou outro, conectando um resistor, é a razão pela qual a SPI pode suportar velocidades mais altas do que a I2C pode. O I2C perde tempo de transmissão enquanto o seu resistor pull-up devolve a linha para alta.

dito isto, é, no entanto, uma boa prática também ter um pull-up em uma linha CS para garantir que ele vai alto quando o imp está iniciando ou dormindo e, portanto, não é capaz de conduzir a Linha Alto manualmente. Manter a linha alta garante que o periférico irá ignorar quaisquer falhas nas linhas de dados e clock.,

Quando o controlador tem o que quer, ele dirige a linha CS mais uma vez, e o periférico pode descansar.

IP opções SPI

cada imp tem um número de barramentos SPI independentes, acessados como propriedades do objeto de hardware do dispositivo, que está instanciado no início. A tabela MUX pin de cada imp mostra que existem muitas escolhas, dependendo do tipo de imp que você está usando em seu produto. Este documento assume que você está usando um imp001, então você deve consultar a tabela pin mux se você está trabalhando com um imp diferente., Os dois ônibus SPI do imp001 são ambos implementações de três fios do ônibus, e conectados a pinos 1, 8 e 9, e 2, 5 e 7, respectivamente. Os pinos 1 e 5 são SCLK, 8 e 7 COPI e 9 e 2 CIPO. Qualquer um dos dois ônibus que você usar, é uma boa prática alias desde o início:

spi1 <- hardware.spi257;spi2 <- hardware.spi189;

Configurar para usar é simplesmente uma questão de contar o imp o quão rápido você deseja que o ônibus para executar, e para fornecer um conjunto de constantes que, juntos, determinam como os ônibus irão operar:

spi1.configure(modeFlags, speed);

Primeiro, a velocidade., This is simply an integer value giving the throughput in kiloHertz (kHz):

The specific SPI data rates available (in kHz) are as follows:

imp001, imp002 imp003 imp004m imp005 imp006
spi189 spi257 spiEBCA
spiLGDK
spiAHSR
spiGJKL
spiBCAD
spi0
spiXTUVW
15,000 30,000 18,000 24,000 The SPI data rates
available range
from 5KHz to 22.,8MHz
The SPI is clocked
by dividing 160MHz
by any integer
from 7 to 32,000
inclusive
Min. 187KHz, max. 750KHz
7500 15,000 9000 12,000
3750 7500 4500 6000
1875 3750 2250 3000 All others
937.50 1875 1125 1500 Min. 187KHz,
theoretical max. 24MHz
468.75 937.50 562.50 750
234.,375 468.75 281.25 375
117.1875 234.375 140.,g) a borda
MSB_FIRST Enviar bit mais significativo primeiro (padrão)
LSB_FIRST Enviar o bit menos significativo primeira
NO_SCLK SCLK pin não é usado
USE_CS_L Ativar o uso de um chip dedicado selecione pin (imp005 apenas)

Estes podem ser combinados, se necessário, usando a lógica OU o operador |, embora alguns sejam mutuamente exclusivos, de modo que não deve ser combinado: SIMPLEX_TX e SIMPLEX_RX, por exemplo., Para usar ambos os CLOCK_IDLE_LOW e CLOCK_2ND_EDGE, por exemplo, em vez de inserir uma única constante como um parâmetro no método configure() você gostaria de incluir ambos, separados por | símbolo:

spi1.configure(SIMPLEX_TX | MSB_FIRST | CLOCK_IDLE_LOW, 400);

Combinações podem ser necessárias se forem especificados pelo periférico de folha de dados, o que pode não ser imediatamente óbvio para o recém-chegado. As fichas de dados podem falar sobre o “modo SPI” de um dispositivo, ou seus valores de CPOL (polaridade de Clock) e CPHA (fase de Clock)., O CPOL e o CPHA determinam quais as arestas do sinal de relógio que são usadas para conduzir e recolher os sinais de dados. Cada um destes dois parâmetros tem dois estados possíveis, para quatro combinações possíveis em tudo:


SPI Modos

SPI Modos simplesmente índice dessas combinações, em vez de separados CPOL e CPHA valores. O controlador e o periférico têm que se comunicar usando os mesmos valores CPOL e CPHA, e assim o mesmo modo., Múltiplos periféricos podem muito bem significar configurações diferentes, de modo que o controlador terá que reconfigurar-se cada vez que precisa se comunicar com um periférico específico.,a tabela a seguir:

Leitura E gravação de Dados

Tendo configurado o SPI ônibus, use o método write() para enviar uma seqüência de caracteres de bytes para o dispositivo periférico:

spi1.write("This is an LCD display");

o Uso de uma seqüência de caracteres é opcional: você também pode enviar um blob de dados brutos bytes:

local blob = blob(4); // Create a four-byte blob...blob.writen(0xDEADBEEF, 'i'); // ...and write a 32-bit value to itspi1.write(blob);

Se você quiser ler uma seqüência de caracteres ou um blob, você precisa de um dos imp API dois SPI métodos de leitura:

local bytes = spi1.readblob(8);local inputString = spi1.readstring(16);

O valor inteiro passado como parâmetro é, respectivamente, o número de bytes a serem lidos no blob e o número de caracteres a ser colocado na cadeia., É claro que, uma vez que um personagem recebe um byte, estes dois métodos são equivalentes. O último simplesmente converte blob para string para você.

Por Causa da natureza’ duplex completo ‘ do barramento SPI, escrita e leitura sempre ocorrem simultaneamente. Com os comandos de leitura e escrita que vimos até agora, os dados que se movem na direção oposta daquele em que estamos interessados são ignorados ou zerados. Então, quando você escreve uma string, digamos, todos os dados que chegam ao imp do periférico são ignorados., Durante qualquer uma das duas operações de leitura, um tamanho correspondente de ‘falso’ bytes zero é escrito para o periférico: se você ler oito bytes, digamos, oito 0s são escritos automaticamente.

para gerir esta comunicação bidirecional simultânea, a API do imp tem um quarto método que combina leituras e escritas:

local inputString = spi1.writeread(outputString);

assim, como a string outputString está a ser enviada ao longo da linha COPI, a variável inputString está a ser preenchida pelos bytes de dados que surgem no CIPO. Você pode enviar e receber strings ou blobs, mas tanto a entrada como a saída devem ser do mesmo tipo., No entanto grande seu blob de Saída, seu blob de entrada será do mesmo tamanho. Da mesma forma, as cadeias de entrada e saída terão o mesmo comprimento.

a operação full duplex também pode ser usada com um dispositivo que não espera operar dessa forma — aqueles que exigem que os bytes de leitura e escrita ‘dummy’ sejam um valor específico, não-zero. Este requisito exclui o uso dos métodos de escrita regular(), readblob() e readstring (), mas o writeread() pode ser usado em seu lugar para se certificar de que os valores de manequins preferidos do dispositivo são usados.,

código de exemplo

o código seguinte funciona com os dispositivos analógicos ADXL345 acelerômetro digital, uma parte que usa SPI para se comunicar com seu microcontrolador host. Ele também suporta I2C, e os pinos nesta placa de saída de Adafruit, que é baseado no chip, são rotulados em conformidade. A ficha do chip pode ser baixada do site de dispositivos analógicos.

How The Code Works

we use an imp001’s spi257 bus, aliased near the beginning of the listing as spi. Nós também apelidamos pin 8 como linha CS. A função spiWriteReg () mostra como estes são usados., Uma transação de escrita é sinalizada alterando a linha CS baixo. Em seguida, o endereço do registro que queremos escrever é convertido de um esquilo de 32-bit assinado inteiro para um valor de 8-bit, escrevendo – o para uma bolha. Esta bolha é então escrita para o ônibus SPI. Fazemos a mesma coisa com o valor que queremos que o ADXL345 ponha naquele registo, e depois colocamos a linha CS alta novamente para sinalizar o fim da transacção.,


The Adafruit/Analog Devices ADXL345

the function spiReadReg() works in the same way, only this time we read value data from the bus after writing the source register’s address. O ADXL345 requer alguns ajustes a serem feitos para o endereço do registro nesta instância: o bit 7 precisa ser definido, a fim de marcar a transação como uma operação de leitura, e o bit 6 precisa ser definido para dizer ao chip que esperamos mais do que um único byte a ser enviado de volta.,

Onde o programa propriamente dito começa, configuramos o bus SPI do imp para corresponder aos requisitos do chip ADXL345. Ele usa o modo SPI 3-ie. tanto o CPOL como o CPHA devem ser definidos — por isso usamos o parâmetro imp equivalente: CLOCK_IDLE_HIGH | CLOCK_2ND_EDGE na chamada configure (). Nós também ajustamos a velocidade para 100kHz. Em seguida, o PIN 8 do imp, que está operando aqui como o PIN CS, é configurado como uma saída digital e definido alto.


cablagem para cima do ADXL345

outras funções no programa inicializam o próprio ADXL345 em vez do barramento SPI., O ADXL345 é inicializado, e o código lê no valor do endereço de registro 0x00 para garantir que o dispositivo está presente no barramento. O chip tem um modo de auto-teste que permite uma série de leituras de calibração a ser feita; isso nós fazemos e armazenamos os resultados. Mais tarde, no ciclo de funções (), estes valores são usados para ajustar as leituras finais do acelerômetro.,

O ADXL345 guarda as suas amostras dos eixos x, y E z como valores de 16 bits, cada um em dois registos de 8 bits; o loop() usa a função spiReadReg() para adquirir os dois componentes de cada valor e convertê – los em valores únicos, multiplicando o byte mais significativo por 256 e adicionando ao resultado o valor do byte menos significativo.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *