Um escravo SPI pode iniciar uma transmissão no modo full-duplex?

8

Tanto quanto eu sei, a transmissão SPI para um escravo SPI funciona como abaixo:

  1. Mestre seleciona um escravo usando o pino SS
  2. Mestre e escravo enviam dados um ao outro simultaneamente
  3. O mestre inicia o relógio e a transmissão de dados ao mesmo tempo (não há relógio antes da operação de gravação)
  4. O mestre interrompe a transmissão a qualquer momento (interrompendo a operação de gravação e a geração do relógio), mesmo se o escravo tiver mais dados para enviar.

Existe alguma configuração de escravo SPI que permita ao escravo transmitir dados sem a permissão do mestre?

Eu só estou pensando em voz alta. Suponha que haja apenas um escravo e um relógio contínuo seja fornecido pelo mestre etc.

Mesmo se a afirmação assumida for verdadeira, o mestre e o escravo não perdem a sincronização de bytes (isto é, recebe o fluxo de bits), pois não há bits de start-stop para o SPI?

Estou fazendo essa pergunta porque li a seção a seguir deste documento .

2.2 Exemplo de SPI

O exemplo SPI anexado ilustra o uso do USART no modo síncrono. USART1 está configurado como escravo, enquanto USART2 é mestre. As seguintes transações ocorrem:

  • Transmissão de dados do mestre para o escravo.
  • Transmissão de dados do escravo para o mestre.
  • Transmissão de dados de mestre para escravo e de escravo para mestre simultaneamente.

O documento fornece um exemplo de SPI, mas o realiza usando dispositivos USART. E entendo que um escravo do USART pode iniciar uma transmissão sem a permissão do mestre.

Não consegui encontrar o código-fonte referenciado pelo documento.

JeJoRic
fonte
4
O escravo, por definição, não pode iniciar uma transação (ele pode interromper o mestre para iniciar uma transação).
Peter Smith
5
A transferência unidirecional de dados no SPI tradicional é apenas alguém que ignora o estado da linha na outra direção. Gravações, leituras e transferências bidirecionais não são realmente diferentes. De fato, por exemplo, muitos periféricos SPI criam uma palavra de status durante a primeira palavra, antes mesmo de saberem o que está sendo solicitado, uma vez que custa quase nada para fazer isso e permite uma pesquisa rápida de status.
22819 Chris Stratton

Respostas:

17

Não, com o SPI, todas as comunicações são conduzidas pelo dispositivo mestre. Você está certo de que o mestre não pode simplesmente fornecer um relógio contínuo; não haveria maneira de detectar os limites de bytes.

Um dispositivo escravo geralmente terá um pino de saída separado para sinalizar ao mestre que ele possui dados disponíveis. Este pino está conectado a uma entrada em um microcontrolador e é frequentemente usado como uma interrupção.

Em seguida, o dispositivo pode afirmar o pino, fazendo com que o microcontrolador gire o barramento SPI.


Para informações mais detalhadas, leia :) Esta é uma versão ligeiramente modificada de uma explicação encontrada aqui :

O dispositivo escravo só pode se comunicar quando é fornecido um relógio do mestre. Isso complica a leitura do escravo, porque você precisa fazer com que o mestre forneça ciclos de relógio suficientes para que o escravo responda.

Quando você envia um comando SPI do mestre, duas transmissões realmente acontecem durante os mesmos oito pulsos de clock. A primeira é que seu byte está fora da linha MOSI. Mas, ao mesmo tempo, os dados estão sendo transferidos para o microcontrolador através da linha MISO.

Mas como o escravo não recebe o comando completo até o final dessas transações, ele não apresenta nenhum dado ao barramento. Isso resulta em um valor recebido de 0x00 ou 0xFF.

Então você precisa fornecer oito relógios adicionais para permitir que o escravo retorne o valor real. Em muitas implementações de código, isso é feito enviando um "byte fictício" para o escravo.

Observe que, na primeira transmissão, o mestre ignora o que chega do escravo. Na segunda transmissão, o escravo ignora o que é enviado pelo mestre.

Isso descreve o caso geral. Pode haver complexidades adicionais. Por exemplo, alguns ICs escravos realmente emitem algum tipo de byte de status ao mesmo tempo em que recebem um comando do mestre. Portanto, nesse caso, o mestre não deve descartar o primeiro byte recebido.

bitsmack
fonte
2
"o mestre não pode simplesmente fornecer um relógio contínuo" Na verdade, há muito tempo, vi um dispositivo que faz exatamente isso. Era uma fera estranha. Infelizmente, não me lembro do P / N.
Aaron
@ Aaron É bom saber! As pessoas continuam ficando mais e mais inteligente :-)
bitsmack
7

Não, o mestre é quem arbitra a seleção de chips e aciona o relógio. Um escravo sempre ouvirá apenas o relógio e a seleção de chips. A transferência de dados ainda pode ser full duplex. Existem algumas implementações em que o relógio pode ser contínuo, mas isso não importa muito, pois a seleção de chips é usada para sincronizar os limites de bytes de qualquer maneira. Mas existem sistemas multimaster, então basicamente você pode ter algum mecanismo para os dispositivos decidirem quem é escravo e mestre. Ou apenas inclua um fio de "interrupção" separado para o escravo sinalizar ao mestre que ele possui um pacote de dados para o mestre.

Apenas eu
fonte
Você poderia adicionar um exemplo de sistema multimaster?
davidcary 16/08/19