Respostas:
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.
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.
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.
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.
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