O SPI é seguro para ser interrompido?


17

Estou escrevendo para um cartão microSD de dentro do meu firmware, mas é a tarefa de menor prioridade, para que possa ser interrompido por outras tarefas enquanto estiver no meio da leitura / gravação.

Agora, suponha que eu tenha me comunicado com este cartão microSD usando um UART. O problema durante as leituras seria que o FIFO do RX do hardware estouraria , portanto o atraso máximo que eu poderia fazer seria (tamanho do FIFO × bytes / segundo) e durante as gravações não haveria problema, porque a outra extremidade aguardaria até que eu envie o próximo caractere.

Como isso funciona agora, estou usando o SPI? A situação é a mesma que para gravações não importa e para leituras depende do tamanho do SPI FIFO?

Respostas:


22

A grande maioria dos dispositivos SPI ficará perfeitamente feliz com qualquer taxa de dados abaixo do máximo especificado. Pode-se realizar parte de uma transação, fazer uma pausa a qualquer momento, voltar alguns anos depois e finalizá-la. Desde que não houvesse falhas no relógio, na seleção ou nas linhas de energia, a transação seria concluída normalmente.

Há três advertências principais a serem observadas:

  1. Em geral, depois que uma transação é iniciada em um barramento SPI, nenhum dos fios do barramento pode ser usado para qualquer outra finalidade até que a transação seja concluída. Em geral, isso significa que uma interrupção não pode usar um barramento SPI, exceto quando é a única coisa que estará usando o barramento (pode ser possível que a interrupção tenha uso exclusivo do barramento em alguns momentos e para o principal). programa para uso exclusivo em outros momentos). Alguns dispositivos incluem pinos especiais para permitir que eles "ignorem" o barramento no meio de uma transação, mas mesmo com esses recursos, eu não recomendaria que uma interrupção suspendesse uma transação SPI com um dispositivo, realizasse uma transação com outro dispositivo, e deixe o código subjacente retomar sua transação com o primeiro. É melhor que a interrupção use um barramento SPI separado.
  2. Alguns dispositivos podem se comportar de maneira estranha se uma transação continuar por muito tempo. Alguns chips de relógio em tempo real, por exemplo, não armazenam em buffer duplo os registros de hora / data, mas bloqueiam quaisquer eventos de "avanço de tempo" que ocorreriam durante uma transação e os aplicam após a conclusão da transação. Se uma transação demorar tanto que um segundo evento de avanço de tempo chegar, o último evento será ignorado, fazendo com que o relógio caia nessa quantidade de tempo. Realmente não vejo desculpa para projetar um chip dessa maneira (mesmo que não se queira o custo de buffer duplo dos dados, especificando que o software é responsável por garantir que sua coerência seja mais barata do que adicionar a lógica de "adiamento de atualização", e minimizaria a probabilidade de perturbação do relógio), mas esses chips existem.
  3. Existem alguns dispositivos que usam relógio e sinal de dados, mas que usam uma "pausa" para significar enquadramento. O exemplo mais recente disso que encontrei foi uma cadeia de luzes LED de controlador por lâmpada. Não gosto particularmente desses projetos (pode-se indicar o enquadramento usando três arestas ascendentes consecutivas no fio de dados sem nenhum relógio intermediário), mas, novamente, esses dispositivos existem.

Embora certos tipos de comunicação exijam o uso de intervalos específicos, raramente há motivo para os dispositivos SPI exigirem. No entanto, é preciso estar atento à existência de tais dispositivos.


3
+1 Bom! Concordo totalmente com todas as suas opiniões / frustrações. Vi muitas vezes também.
DrFriedParts 02/02

11

Verificando uma cópia da especificação (que não posso citar por motivos de direitos autorais / NDA), a taxa SPI é especificada a partir de 0Hz, o que implica que a operação estática está correta. No SPI, você só recupera os dados enquanto o dispositivo está sendo sincronizado, por isso, se estiver usando um SPI de hardware, você receberá apenas algo após o envio dos dados (mesmo que 0 / não importe). Portanto, nesse aspecto, é diferente de um UART, no qual você pode receber dados não solicitados a qualquer momento.


Portanto, minha única preocupação é que o cartão MicroSD tenha algum tipo de tempo limite incorporado, mas não o próprio SPI?
Muis

5
De acordo com as especificações de tudo o que pude ver, também não deveria haver nenhuma forma de tempo limite no cartão SD; portanto, não pense que você deve ter problemas. Anos atrás, escrevi um código personalizado e, enquanto a depuração era simples, passava um código deixando, digamos, 10 segundos ou mais entre as operações do SPI e tudo estava bem.
precisa

1
+1, Ser capaz de executar o SPI até 0 Hz é útil para depuração. Obrigado.
Anindo Ghosh

1
Vale a pena observar que, em alguns dispositivos SPI, a saída de dados pode mudar apenas em uma extremidade do relógio específica, mas em outros, a saída de dados às vezes pode ser alterada de forma assíncrona; isso é especialmente comum com um bit "ocupado". Em alguns chips, se um tiver atingido o tempo limite do estado "ocupado" e ainda estiver na saída quando a parte ficar desocupada, a saída será alterada de forma assíncrona. Em alguns outros chips, o estado "ocupado" relatado não será alterado até que seja remarcado. Ambos os designs têm vantagens e desvantagens, portanto, é útil saber que existem os dois tipos de designs.
Supercat 09/02
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.