Existe uma diferença entre o uso de um módulo SPI integrado e a troca de bits?


Respostas:


33

Um periférico de controlador SPI real no MCU geralmente pode ser executado muito mais rápido do que um estrondo na interface. Obviamente, depende do MCU, mas não me surpreenderia ver um controlador SPI rodando a mais de 30 MHz, enquanto a troca de bits pode ser limitada a cerca de 1 MHz (se você tiver sorte).

Mas há mais do que isso. Ao bater em bit, o MCU está ocupado em bater nele. Ele está mudando os dados e girando as linhas GPIO. Ou seja, não pode estar fazendo mais nada. Ao usar um controlador SPI, o controlador está ocupado fazendo tudo isso e o MCU está livre para fazer outras coisas.

Portanto, com um controlador SPI real, a transferência SPI real é muito mais rápida e o MCU recupera alguns ciclos que podem ser usados ​​para fazer outras coisas.


11

Não há diferença em termos de que você pode obter o mesmo resultado usando os dois métodos, mas existem algumas razões pelas quais você escolheria um sobre o outro.

O uso de um periférico SPI liberará o processador de ter que se preocupar em gerar o tempo para bater os pinos de E / S, permitindo que ele execute outras tarefas computacionais e simplifique a programação da CPU. Como o periférico é implementado no hardware, ele será executado mais rapidamente e usará menos energia do que a E / S de impacto. Pode haver casos em que você queira fazer um bit bang I / O para fazer interface com o SPI se o seu aplicativo exigir que você escolha um processador sem um periférico SPI. Por razões de sanidade, recomendo evitar isso, a menos que seja absolutamente necessário.


A razão da sanidade é lixo. Geralmente, a configuração do hardware da SPI exatamente da configuração necessária leva mais tempo lendo a folha de dados periférica da SPI do que apenas escrevendo o código mestre da SPI e, portanto, apenas a leitura da folha de dados do dispositivo escravo.
Olin Lathrop

Admito que estava sendo um pouco sensacionalista com minha observação de sanidade, mas a intenção (reconhecidamente não escrita) era que, à medida que a complexidade do aplicativo aumenta, aumenta também o ônus de garantir que o sistema como um todo continue funcionando dentro dos prazos pretendidos. Eu o implementei dos dois modos e sei que prefiro usar o periférico, mesmo que demore alguns minutos para ler a folha de dados.
Amoch

6

SPI é uma interface síncrona , com o mestre controlando o relógio. Isso significa que, se você é o mestre, pode escolher a velocidade e o tempo do relógio. Os dispositivos escravos terão algum limite superior na frequência do relógio que podem suportar, mas normalmente não se importam com a velocidade do relógio abaixo dele. Mais especificamente, geralmente há um tempo mínimo que cada escravo precisa para ver o relógio nos estados alto e baixo antes de poder mudar novamente, e haverá algumas configurações mínimas de dados e limites de retenção na linha de dados em torno da borda do relógio na qual o escravo lê a linha de dados.

Por isso, implementar um mestre SPI no firmware é realmente bastante fácil. Fiz isso frequentemente como uma conveniência para usar determinados pinos, quando não havia hardware SPI interno ou não estava disponível para esse fim por qualquer motivo. Fazer um mestre SPI em firmware é o mais fácil possível.

Muitos dispositivos escravos SPI são bastante rápidos, portanto, os tempos mínimos de configuração e relógio são atendidos simplesmente garantindo que cada um tenha pelo menos um ciclo de instruções. Nesse caso, o código é muito curto e rápido. Em alguns casos, um dispositivo escravo pode exigir dois ou três ciclos de instruções por fase do relógio, mas também não é difícil garantir isso. O loop de bit SPI de baixo nível requer que você faça algumas alterações no próximo bit de saída, pegue o bit de entrada e verifique o contador de loop. Geralmente, você pode atender aos requisitos de tempo mínimo de dois ou três ciclos apenas organizando quando você dirige e faz uma amostra das linhas com algumas das outras despesas gerais inseridas nos lugares certos. Se a velocidade for importante, você pode usar o pré-processador do assembler para gravar um loop desenrolado. Com técnicas como essa,

Existem algumas vantagens em fazer o mestre SPI no firmware. O hardware SPI às vezes é um pouco ridículo na forma como pode ser configurado. Sempre existe a questão do que exatamente deveria acontecer imediatamente quando a seleção de escravos é afirmada. O primeiro bit é gravado nas linhas de dados? E se o relógio começar baixo e as linhas de dados estiverem presas na borda descendente? Às vezes isso importa, às vezes não. Com um firmware SPI master, você pode perdoar mais e possivelmente usar a mesma rotina para se comunicar com escravos diferentes. Por exemplo, você pode ter certeza de que a linha de dados MOSI (Master Out Slave In) esteja estável nas duas extremidades do relógio. O hardware SPI geralmente não faz isso; portanto, esse hardware precisaria ser reconfigurado, dependendo de qual escravo ele está se comunicando no momento.

Outra vantagem de um mestre SPI de firmware é que você pode escolher um número arbitrário de bits por sequência SPI. O hardware geralmente é limitado a múltiplos de 8 bits. A maioria dos dispositivos é projetada para permitir transferências inteiras de bytes, mas geralmente não é necessária. Por exemplo, um A / D de 10 bits provavelmente enviará os 10 bits de dados primeiro e depois enviará 0 ou lixo depois disso, se você continuar fazendo o clock. Se estiver usando o hardware SPI, você será forçado a transferir 16 bits e mascarar o lixo. Tudo funcionará bem, mas um mestre de SPI de firmware pode realmente ser mais rápido que o hardware, neste caso, porque transfere apenas os 10 bits mínimos necessários.

As principais vantagens dos mestres de SPI de hardware é que o firmware pode iniciar uma transferência de bytes, depois sair e fazer outra coisa. O relógio também pode geralmente ser mais rápido do que um loop de firmware desenrolado. Observe que, embora essas duas vantagens possam ser importantes em determinadas circunstâncias, elas geralmente são irrelevantes. A maioria dos códigos SPI que usam hardware para transferir um byte e imediatamente entram em um loop de espera para o hardware concluir a transferência. Verifique também cuidadosamente os requisitos de tempo do escravo. Os dispositivos SPI geralmente são rápidos como um todo, mas há casos em que você precisa diminuir a velocidade do hardware para corresponder à velocidade máxima que o escravo pode suportar.

Isso foi tudo do ponto de vista principal. Em resumo, geralmente há pouca vantagem em usar o hardware SPI como mestre e até algumas vantagens em não usá-lo algumas vezes. No entanto, isso é tudo diferente para os escravos. Como o mestre controla o relógio, os escravos devem estar prontos para o que quer que o mestre faça sempre que o mestre o fizer. Os requisitos de tempo geralmente são bastante curtos em relação aos tempos de instrução, portanto, ter hardware implementando um escravo SPI é geralmente o que você deseja.

Você pode executar escravos SPI no firmware, mas é complicado, você precisa contar os ciclos e a latência com cuidado, e geralmente acaba implementando algum subconjunto do protocolo que sabe que seu mestre específico usa. Por exemplo, uma vez eu tive que projetar um equivalente digital de uma placa controladora analógica antiga (eles queriam recursos extras que não pudessem ser razoavelmente feitos em analógico, e queriam algo menor, mais barato para produzir e mais estável). Essa placa fez interface com o restante do sistema através de um barramento SPI. A placa analógica antiga tinha um D / A de dois canais para definir os valores de controle e um A / D de dois canais para ler novamente os valores medidos. A implementação de ambos em um único processador foi complicada e incluiu descobrir qual subconjunto dos protocolos D / A e A / D SPI do hardware o mestre existente realmente usou. Também envolveu um processador que poderia funcionar significativamente mais rápido que o clock do SPI. No final, usei três interrupções, uma para cada escravo selecionado e outra para a borda ascendente da linha do relógio. Esse último precisava ser a interrupção de maior prioridade no sistema, caso contrário, o requisito de latência não poderia ser atendido.

De qualquer forma, o ponto principal é que um mestre SPI de firmware é fácil, pequeno, rápido e flexível, e há poucas razões para evitar fazer um. Por outro lado, para um escravo, você realmente quer hardware, ou precisa acordar e pensar com muito cuidado sobre tempo, latência e coisas do gênero.


Você encontrou alguma implementação escrava de microcontrolador que possa se comportar como dispositivos SPI de hardware típicos (por exemplo, permitir que o mestre dê uma vantagem no status de CS e ler a qualquer momento e usar o CS para marcar limites de comando? mesmo informar se houve uma borda CS entre o byte atual ea anterior.
supercat

@supe: Sim, isso é um problema. O hardware escravo SPI geralmente ignora os dados de clock e entrada e mantém a linha de dados de saída em alta impedância quando a seleção de chip não é confirmada, mas geralmente não informa onde estão os limites de seleção de chip. Pelo menos com o hardware PIC SPI que eu me lembro de usar, você teria que configurar sua própria interrupção na seleção de chips para isso.
Olin Lathrop

Fiquei me perguntando se você sabia de alguma implementação decente. Eu acho que não. O problema com o uso de uma interrupção de hardware no fio selecionado é que, se ocorrer uma transição no fio selecionado logo após o envio de um byte, o escravo poderá ter dificuldade em resolver se ocorreu antes ou depois do byte em questão. Acho intrigante que quase todos os chips tenham uma implementação escrava SPI, mas parece que nenhum deles pode realmente ser usado como um dispositivo escravo de hardware SPI típico. A situação é um tanto como a porta escravo processador no PIC em comparação com a 8048.
supercat

A porta escrava do processador 8048 possui um pino de endereço; quando os dados são gravados externamente no 8048, o 8048 bloqueia o estado desse pino e o disponibiliza para seu código (geralmente o primeiro byte de um comando será gravado em um endereço e parâmetros ou dados no outro). Uma leitura de um endereço produzirá o que o código 8048 colocar lá, mas alguns bits lidos no outro endereço são gerados pelo hardware 8048 para indicar se está 'pronto para ter dados lidos ou gravados.
Supercat

+1 por apontar a diferença de ser um mestre (fácil) e um escravo (muito mais difícil).
Tcrosley

1

Depende do que você está fazendo o SPI. Se o seu interesse é obter as mais altas taxas de dados, o hardware é sempre mais rápido do que o bitbanging (por exemplo, o chip do córtex do braço nos 3 anos da adolescência) posso enviar dados a 22Mbps usando suporte SPI de hardware, contra ~ 4.5Mbps com bitbanging (ele também pode lidar com números arbitrários de bits por transferência de 3 a 16 - útil para enviar dados em pedaços de 12 bits para determinados controladores led!)). Em avrs de 16Mhz, a diferença é um pouco menos extrema, a taxa de dados mais alta com hardware parece alta 4 / 5Mbps baixa, enquanto a taxa de bits é de 2,3Mbps).

Além disso, se você usar o suporte de hardware, novamente, dependendo do microcontrolador em questão, você terá opções disponíveis para usar controladores DMA para mudar seus dados, deixando seu código voltar para outras coisas potencialmente mais interessantes do que cuidar dos dados. escrever.

Todas as opções acima dependem se o hardware SPI é ou não uma opção.


0

Se você interrompe o SPI, não pode usar a interrupção do SSP para lidar com as comunicações. Isso não é tão importante para o SPI para muitos usos


11
Nenhum processador específico foi mencionado; portanto, "interrupção do SSP" é um termo sem sentido nesse contexto.
Olin Lathrop
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.