Autor Tema: nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.  (Leído 1296 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« en: 21 de Julio de 2020, 01:07:06 »
Estimado Amigos. Espero que hayan pasado un buen día del amigo, no importa el encierro, mientras podamos comunicarnos y hacer lo que nos gusta.
Abro este tópico por algo que me pasó en estos días, y quería saber si soy yo el único Bo$%&#@ o si hay algunos más como yo que luego de quemar varias horas, consiguió no explotar de frustraciòn.
Resulta que estoy intentando poner en marcha un módulo nRF24L01+, del cual se hablan muchas cosas (buenas y malas), pero por el precio es un transceptor no despreciable (por lo menos en versiones no chinísimas).
El asunto es que vengo jugando hace rato con modulos RF, y otras yerbas, (entre otras cosas, hice que un 12F508 emule una UART, de lo que me siento un poquito orgulloso), así que dije, vamos a probar un módulo que sea transceptor. Y elegí el nombrado.
Como no lo conocía, y quería definir las cosas de base, comencé estudiando a fondo los puertos SPI del pic, cosa muy necesaria (y sorprendentemente sencillos), dado que este es el modo que intercambia datos el transceptor.
Luego dije, antes de armar la estructura completa del envío y recepción de datos a traves de dos módulos, etc, etc, etc, voy a probar primero (cosa MUY IMPORTANTE) leer y escribir los registros propios del nRF a través del puerto SPI....
Este "micro", el nRF, tiene once comandos básicos para realizar los procesos de transmisión y recepción, así como la configuración de los mismos.
El comando se divide en 2 partes: El comando en sí, que está representado por una dirección de 8 bits (1 byte), y un paquete de datos asociado al mismo que tiene logitud variable, dependiendo del comando, y puede ser desde 1 bit hasta 32 bytes.
Ahora, para leer o escribir en los distintos registros del nRF hay 2 funciones: R_REGISTER y W_REGISTER, que se identifican con los 3 bits más significativos y la dirección del registro que tiene una longitud de 5 bits y que unidos (OR bit a bit) permiten armar el comando completo. Para ejecutar el comando W_REGISTER, Se le agrega un paquete de datos que son los que se van a escribir en el registro.
En mi inocencia, y dada la obviedad de la situación, consideré que el R_REGISTER no necesitaba ese paquete de datos de cola, ya que no necesita ningún tipo de direccion (excepto la ya asociada al comando) ni contenido para aplicar al registro que intentaba leer....
Así pasó casi una semana de dar vueltas y más vueltas y más vueltas... Hasta que por fin encontré algo que me llamó la atención, y que me hizo probar y pude salir del pozo....
Al comando R_REGISTER, hay que asociarle un paquete de datos nulo, o  no (lo probé hasta con 0xFF), y ahí recién se digna en responderme con el contenido del registro que quiero leer....

Alguno sabe algo de esto? Ya lo verifiqué, pero en los datasheets del nRF no hay ninguna indicación. Solo el formato genérico de los comandos, y nada más.

Soy yo el UNICO Bo$%&#@ que no entendió nada? O el dataSHIT no es lo suficientemente claro, o yo estoy fuera de fase con esto?

Por lo menos lo pude hacer funcionar... pero me cuesta creer que no hay una referencia de base que indique esto.

Espero no haberlos aburrido mucho.

Un abrazo.
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #1 en: 21 de Julio de 2020, 09:55:44 »
El datasheet no dice nada, en su timing diagram tampoco indica un estado definido de las entradas para leer.

Y lo mas parecido es el NOP (No Operation) que dice que "Puede ser usado en la lectura del registro STATUS". que tampoco es lo que uno busca
De todas formas no esta claro en el datasheet que es necesario para leerlo.

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #2 en: 21 de Julio de 2020, 10:11:14 »
Gracias KILLERJC por tu respuesta. Estuve viendo también el comando NOP. aunque no lo probé aún, por el bloqueo que tenía con W_R... y R_R...
Aunque me da la impresión que (y ahora ya sé como definir esto) al pedir 0 bits como datos, es probable que funcione sin necesidad de agregarle una cola de datos, como en los anteriores.

Tu respuesta me deja más tranquilo. Creí que era yo el único que no entendía nada, o que al no pertenecer a una élite de programadores/electrónicos de altos estudios, podría estar perdiéndome de algun uso convencional de datos o cosa por el estilo.

Conclusión, no tengo que dar por sentado todos los datasheets que vea...
« Última modificación: 21 de Julio de 2020, 10:13:27 por osposto »
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #3 en: 29 de Julio de 2020, 22:16:45 »
Hola Ospoto. Tambien tengo interes en estos módulos de transmisión tengo un par que todavía no lo he conseguido hacer andar.
Una prpegunta estas mandando información o solamente accionas un bit del puerto a distancia. Lo A mi me interesa mandar datos por ejemplo de temperatura desde
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #4 en: 29 de Julio de 2020, 22:22:26 »
Hola Osposto. Me interesa el tema. Poseo dos nrf24l01 para realizar transmición de datos, aún no consigo realizarla. En la red no hay información al respecto. Me estoy iniciando en este tema ya que me interesa sobremanera. Si pudieras brindarme info te lo agradecería. Quiero transmitir valores de temperatura u otra señal analogica.
Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1678
    • winpic800
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #5 en: 30 de Julio de 2020, 07:08:40 »
Hola luchadores.

Esto es lo que saqué en claro .

El valor de los tres bits  7,6,5 del comando se usan para leer o escribir en el registro
Para leer R_REGISTER = 0b000xxxxx y para escribir  W_REGISTER = 0b001xxxxx

Por ejemplo :

Registro  STATUS dirección 0x07
Leer
Se envía 0x07 = 0b00000111
Escribir
Se envía 0x27 = 0b00100111


Registro  CONFIG dirección 0x00
Leer
Se envía 0x00 = 0b00000000
Escribir
Se envía 0x20 = 0b00100000

/*set address 0xE7E7E7E7E7*/
Spi_Write(0x30); //Commando = 'W_Register' dirección 0x20  +  'TX_ADDR' direccion 0x10
Spi_Write(0xE7);
Spi_Write(0xE7);
Spi_Write(0xE7);
Spi_Write(0xE7);
Spi_Write(0xE7);

saludos .

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #6 en: 04 de Agosto de 2020, 12:07:34 »
Buenos días estimados sufrientes del nRF24L01+... :)
Logré como les indiqué en el post anterior que pude leer los registros del nRF hasta el momento. Pasa que tengo que intercomunicar una placa que tiene un PIC18F4620 (que es el que logré que funcione) y una placa Arduino Mega2650, que todavía no me puse a hurgar. Descargué las librerías para esta, está todo listo (en principio), pero como es ligeramente distinto a lo que es MPLABX, tengo que habituarme, y la verdad es que en estos días no me puse aún a meterle mano.
Aparte, estoy escribiendo una librería en MPLAB para esto, y resulta que cometí el error de borrar el programa inicial con el que conseguí leer los registros. Así que me encuentro nuevamente desc... hormigas, je....
Pero se mantiene lo que expuse antes, y apenas lo pueda poner en marcha, les comento nuevamente.
Saludos.
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #7 en: 04 de Agosto de 2020, 12:16:28 »
Estimado Sispic:
Totalmente de acuerdo. A los comandos W_Register y R_Register se les debe completar con la dirección del registro (5 bits) que intentas leer o modificar. El tema en particular de este thread es que al usar cualquiera de los dos, la primera respuesta inmediata es el contenido del STATUS, que es una respuesta automática presente en todo los comandos del nRF, se lo lee  y listo.
Para modificar el registro, con W_Register, envias un segundo byte con todos los modificadores y listo.
Pero para leer el registro, después del comando R_Register, hay que mandar TAMBIEN un paquete de 1 byte, con 0x00 ou otro valor, no importa cual, y recién ahí te devuelve el valor del registro.

Saludos.
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re:nRF24L01+ y la @#$%&#@%&#@%& que me pasé probando.
« Respuesta #8 en: 05 de Agosto de 2020, 02:08:20 »
Bueno, a medida que pasa el tiempo, me desburro de a poco.
Toda la historia anterior, está asociada a la filosofía de funcionamiento del protocolo SPI.... Que me costó entender, pero por fin me llegó la luz.
El tema (por lo menos lo que entendí) es el siguiente:
Si con SPI queremos enviar algo desde el master al esclavo, con dar las ordenes adecuadas, llenando el buffer SSPBUF con 1 byte por vuelta, la transferencia es directa, rápida y por cada byte que se envía, el esclavo devolverá algo (útil o no, pero si no me interesa no le doy pelota)
Ahora, si lo que queremos es recibir algo del esclavo (supongamos un micro con un sensor de temperatura), necesitamos enviarle la orden al esclavo para que nos envíe ese dato (del cual tenemos que saber su tamaño (x bytes). La respuesta inmediata, dependiendo cómo se haya definido el sistema, puede o no ser útil, pero la respuesta útil, sólo la vamos a recibir si "bombeamos" la cantidad de veces adecuadas hasta recibirla completa.
Supongamos lo siguiente:
Tenemos dos micros, uno que hace presentaciones en LCD, y otras funciones accesorias, y tenemos otro, ubicado en un punto específico, que a su vez tiene conectados dos sensores de temperatura. Ambos están conectados por SPI, en un esquema master - esclavo único.
Supongamos que con una orden de 2 bytes, podemos pedirle que nos envíe el valor de la temperatura del sensor 1, el proceso sería el siguiente:

             MASTER                                                                                              ESCLAVO
_____________________________________________________________________
Solicitud con código de 2 bytes                                              Al mismo tiempo de la recepción el esclavo devuelve 2 bytes info aleatoria (o no, depende del programador)
                                                                                              Esclavo procesa la orden, (realiza ADC, ajusta decimales, etc) y
                                                                                                genera un código de digamos 5 bytes significativos
                                                                                              Envía el código a la cola de salida

En este punto, y dado que la transferencia de datos es simétrica, puesto que es el master el que marca el ritmo, y el esclavo sólo puede devolverla con el ritmo generado por la señal CLK del master, pero con la simetría definida, sólo puede enviarse si recibe un volumen similar de información, es necesario que el master envíe 5 bytes de información aleatoria (o no, depende del programador), para recibir esos 5 bytes de datos útiles.

Esto significa, enviar, por ejemplo, 0x00 5 veces, y a cambio de esto, recibiremos los 5 bytes de información útil.

Conclusión, el master sólo recibe información del esclavo en función de la "solicitud" en bytes que le realice.

Bueno, y ahora, habiendo comenzado a entender mejor el mecanismo SPI, voy a comenzar con el otro módulo nRF conectado a una placa Arduino Mega 2560, que espero me simplifique un poco el tema.
Conseguí unas librerías que prometen ser completas..
Les mantengo al tanto, y POR FAVOR, si consideran que hay errores en las elucubraciones que vuelco en estos comentarios, o sugerencias para mejorar los desarrollos, les pido me lo hagan saber, así pueda razonar bajo otro punto de vista, que siempre es MUY UTIL.

Gracias por leer esto, y muchas gracias por los comentarios y sugerencias recibidos.
No sé lo que quiero, pero lo quiero ya. - Sumo