Tanto quanto eu sei, a transmissão SPI para um escravo SPI funciona como abaixo:
- Mestre seleciona um escravo usando o pino SS
- Mestre e escravo enviam dados um ao outro simultaneamente
- 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)
- 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.
fonte
Respostas:
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 :
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.
fonte
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.
fonte