Cursos / Eletrônica / Projeto de Sistemas RF / Aula

arrow_back Aula 10 - Transmissão de dados utilizando transceptor SPI

Recebendo o dado do transceiver

Estando tudo configurado de acordo com os passos anteriores, o que vai acontecer é o seguinte: assim que o transceiver receber um byte pela rede sem fio, ele vai armazená-lo em uma memória própria e vai informar ao PIC que “algo aconteceu” através da interrupção INT2. O PIC, ao entrar na sua rotina de interrupção, vai perguntar ao transceiver o que aconteceu, lendo o registrador STATUS. Daí ele deve verificar no valor lido o que aconteceu e tratar corretamente o ocorrido.

Nós já vimos duas possíveis situações em que o PIC seria interrompido: quando o bit MAX_RT ou o bit TX_DS fosse colocado em nível alto. Nenhuma dessas duas interrupções deve acontecer no receptor, já que ele somente recebe dados. O bit que devemos checar é se o bit RX_DR é 1. Se for, quer dizer que o receptor acabou de receber um novo dado, logo devemos copiá-lo para o PIC e colocá-lo na variável LED_Display, para que os LED no circuito sejam acesos de acordo com o que o transmissor enviar. É esse o procedimento que você vai ter que implementar na rotina de interrupção.

A rotina de recepção seria bem mais simples se não fosse o seguinte fato: dependendo da velocidade da SPI, da taxa de transmissão e do tamanho do pacote, pode acontecer que um pacote seja recebido pelo transceiver enquanto o pacote anterior ainda estiver sendo copiado para o PIC. O nRF24L01+ tem três buffers de recepção e transmissão, o que significa que eles podem armazenar até três mensagens, antes de começar a perder mensagens, caso o PIC demore muito para responder a interrupção. Sendo assim, é importante que você não receba apenas um pacote, mas que verifique se existem outros pacotes para serem recebidos, antes de voltar para a execução normal do seu código. Para fazer isso, siga os seguintes passos.

1. Crie um laço de recepção

O objetivo aqui é receber todos os pacotes do transceiver até que ele não tenha mais nenhum novo pacote. Isso garante que sempre vamos ter o pacote mais recente em mãos. Esse laço deve ser infinito (usando um while(1), por exemplo). O laço será quebrado com uma instrução break assim que tivermos certeza que não tem mais nenhum dado nos buffers. Todos os passos a seguir devem ser executados dentro do laço.

1.1. Verifique se existem dados nos buffers de recepção.

Isso pode ser feito lendo o registrador FIFO_STATUS do transceiver. Ao receber o estado desse registrador, verifique se o bit RX_EMPTY é 1. Se ele for, significa que não existem novos pacotes a serem recebidos, e logo você pode quebrar o laço com um comando break. Caso contrário, vamos copiar o novo dado para o PIC.

1.2. Leia um novo pacote do transceiver.

Para ler o pacote do transceiver, utilize o comando R_RX_PAYLOAD e logo em seguida chame a função ReadSPI quantas vezes forem necessárias para ler todos os dados do pacote. Como nosso pacote só tem 1 byte, só precisa chamá-la uma vez. Lembre-se de colocar o valor lido na variável LED_Display, que é onde fica o valor utilizado para acender os LEDs.

1.3. Sinalize ao transceiver que você leu um pacote.

Para sinalizar, basta escrever 1 no bit RX_DR do registrador STATUS, de forma semelhante ao que é feito nos casos de interrupção por TX_DS ou MAX_RT no transmissor. Se não existir mais dados para serem lidos pelo PIC nos buffers de recepção do transceiver, o bit RX_EMPTY do registrador FIFO_STATUS vai ser setado para 1, permitindo sair do laço no próximo passo, quando testarmos novamente o valor desse bit.

Pronto. Se você chegou até aqui, então estamos com tudo pronto para testar o experimento. Compile seu programa e leve para a sala de aula. Lá, grave-o no PIC que vai estar no circuito de recepção.

Versão 5.3 - Todos os Direitos reservados