• Welcome to LusoRobótica - Robótica em Português.
 

SPI modo slave - protocolo / maquina de estados

Started by KammutierSpule, 18 de March de 2014, 15:49

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KammutierSpule

Alguem ja implementou ou consegui indicar leituras (tutorials / app notes) para a implementacao num MCU de SPI em modo slave, relativamente a "como fazer o protocolo / maquina de estados" ?

As minhas duvidas sao:

  • Como implementar inicio do comando?
  • É possivel usar o nSS para fazer clear à rececpao do comando?
  • Como lidar com comandos de escrita / leitura e envio / rececpao de buffer de dados?
  • Como detectar e recuperar erros na trama?

Njay

Em geral decides tu... o SPI em si decide pouco mais do que como é que bytes é trocado entre 2 dispositivos.

O que geralmente marca o inicio da transmissão (e o fim) é a linha de select, que pode funcionar como um "enable" do clock do registo de dados. Activas o select, mandas um pacote (conjunto de bytes) e desactivas o select. Fica assim bem marcado o inicio e o fim do pacote.

Decides o protocolo que queres ter. Pode ser por exemplo pacotes de tamanho fixo, pacote com o tamanho do pacote no 1º byte, o mesmo 1º byte tem o tipo de pacote/mensagem e cada tipo tem um tamanho fixo, etc etc.

Se algures a meio da recepção do pacote a linha de select é desactivada, deitas tudo fora e voltas ao inicio. Contudo, tu é que decides como queres fazer.

Em geral o bus é de "proximidade" e não há erros de transmissão... mas se quiseres apontar para uma cena tipo "militar" ou "aeroespacial" podes sempre ter um ou mais bytes de CRC/checkshum no pacote (ou encriptar, etc etc).

Mas basicamente se és tu que tás a fzer ambos os lados da comunicação, tu é que decides como queres fazer dentro das limitações/comportamento do bus...

KammutierSpule

Quote from: Njay on 18 de March de 2014, 17:04
O que geralmente marca o inicio da transmissão (e o fim) é a linha de select, que pode funcionar como um "enable" do clock do registo de dados. Activas o select, mandas um pacote (conjunto de bytes) e desactivas o select. Fica assim bem marcado o inicio e o fim do pacote.

Se algures a meio da recepção do pacote a linha de select é desactivada, deitas tudo fora e voltas ao inicio.

'E suposto existirem mecanismos no MCU para suportar isto (detectar inicio e final o SS)?

Os MCUs quando activam o modo SPI, tem um interrupt para quando recebem um byte via SPI. Isto serve para Master ou Slave.
Quando activamos o modo SPI Salve, o SPI core do MCU vai usar a linha SS para aceitar o shift de dados feito pelo CLK do Master.

Mas sera possivel configurar a linha SS como interrupcao externa num MCU ao mesmo tempo que esta configurada para SS do modulo SPI??
O ideal eh que desse e essa interrupcao tivesse prioridade ah interrupcao do SPI, assim dava para implementar o inicio / fim nessa interrupcao tal como disseste.

Os poucos (um ou dois apenas) exemplos que consegui encontrar, usam apenas o byte recebido para fazer o protocolo, nao detectando o inicio final da trama pela linha SS.

:/

senso

Se a linha SS gera uma interrupção quando vai a low, não precisas de mais nenhuma interrupção, digo eu.
Em micros mais antigos, não tens tipicamente um controlador de interrupções com prioridades configuraveis, em coisas mais recentes tens(tipo ARM).

Sei que num atmega, se o configurares como slave, assim que mexes no SS ele gera uma interrupção, a partir dai tratas do teu código, SPI é algo extremamente simples, é pouco mais que dois shift-registers.
Avr fanboy

Njay

Tens que ver os detalhes no micro que queres usar. Em último caso implementas o SPI em software, mas duvido muito que tenhas que chegar a esse ponto excepto se o micro que queres usar não tiver periférico SPI.