Entendendo o nRF24L01 (IV)

Nesse post vamos discutir o quadro do rádio nRF24, deixando os próximos posts para os comandos/registros e, no gran finale, a apresentação do código. Se não leu os anteriores, os links para as partes I, II e III estão aqui.

O quadro empregado pelo rádio está a seguir, em mais uma imagem extraída do manual:

nrf24_07

O campo preâmbulo serve para estabilizar (sincronismo talvez fosse um termo melhor) o receptor com um padrão cheio de transições. Esse padrão é b01010101 ou b10101010, dependendo se o primeiro bit de endereço a ser transmitido começa com 0 ou com 1, respectivamente.

O endereço já foi discutido, podendo ser de 3 a 5 bytes de comprimento.

Já o campo de controle do quadro traz informações sobre o tamanho do campo de dados (de 0 a 32 bytes, num campo de 6 bits), identificação do pacote (PID, campo de 2 bits) e se a característica de auto reconhecimento está ativa ou não (campo de 1 bit):

nrf24_08

A cada transmissão de um quadro novo (não vale para retransmissões automáticas do mesmo quadro), o PTX incrementa o PID. Do outro lado, o PRX irá conseguir perceber se o quadro é uma retransmissão ou um novo, analisando esse campo e o CRC. Como o campo é de apenas dois bits, somente número de 0 a 3 são possíveis, girando rapidamente. No entanto, isso é condizente com a RX FIFO, de apenas três posições.

O manual cita a situação de possível perda de alguns quadros e giro do PID, gerando uma situação onde um quadro novo pode ser igual a outro do passado e que será rejeitado. O que ele não deixa claro é que, no meu entendimento, o tal quadro do passado ainda estará na RX FIFO,  ou seja, não teria sido recebido. Confuso ? Pense o seguinte: você está transmitindo o valor de um sensor continuamente. Imagine que o valor não mudou. Se mandou um quadro, perdeu outros três e mandou o seguinte, o PID será igual ao primeiro citado e esse quadro mais novo rejeitado. Ok, ele é idêntico ao já armazenado na RX FIFO mas, de fato, o da FIFO é velho e o novo foi rejeitado.

Pra finalizar, o payload (dados úteis) é a informação que você estará efetivamente enviando e o CRC, de um ou dois bytes (configurável), encerra o quadro.

O CRC, para um byte, é dado pelo polinômio x^8 + x^2 + x + 1, com valor inicial 0xFF. Quando dois bytes são usados, o polinômio é o x^16 + x^12 + x^5 + 1, valor inicial 0xFFFF. Esse é o CRC-16-CCITT, usado no Bluetooth, XModem, X.25, entre outros. O de um byte, pelo polinômio, é o CRC-8-CCITT. Vale uma lida na página da Wikipédia e no fantástico “A Painless Guide to CRC Error Dectection Algorithms“.

Parece complicado mas, no fundo, você só se preocupa com o payload. O Enhanced Shockburst cuida do resto para você. Até a próxima !

 

Autor: Marcelo Barros

Dispositivos embarcados, Linux, eletrônica, programação.

3 comentários em “Entendendo o nRF24L01 (IV)”

  1. Talvez eu nunca tenha a oportunidade de trabalha com este rádio mas é percepitivel que muitos protocolos tem o mesmo problema com o descarte de informações.

    Curtir

    1. Oi Jener. Fiquei com a impressão de que o projetista colocou isso pra evitar aquela situação onde você envia, o outro lado recebe e confirma, mas a confirmação não volta ao remetente e ele envia de novo. Numa fila tão pequena (3 posições), acaba sendo um problema. Coisas de canais nas confiáveis….

      Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s