fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

MRF 24J40 MA

19 Respuestas
5 Usuarios
0 Reactions
5,772 Visitas
micalet
Respuestas: 9
Topic starter
(@micalet)
Active Member
Registrado: hace 16 años

Busco a alguien que haya usado el chip MRF 24J40 de Microchip para comunicaciones digitales. Yo estoy empezando con el, pero aunque tengo el "data sheet" bajado de la web de Microchip y lo sigo al pié de la letra con sus recomendaciones, me consta que aún no he conseguido que el chip "chute", es decir que transmita. Pienso que me dejo algo de la configuración inicial. ¿Alguien lo ha usado con éxito?.

Responder
18 respuestas
micalet
Respuestas: 9
Topic starter
(@micalet)
Active Member
Registrado: hace 16 años

Aquí va lo más "sonado" de mi código: las funciones de trabajo con el SPI y la inicialización del chip MRF 24J40. El resto son funciones de pruebas y esas cosas. Saludos.

Responder
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 19 años

¡Muchas gracias! En cuanto tenga tiempo le daré un vistazo.

Un saludo!

Responder
santiago
Respuestas: 1
(@santiago)
New Member
Registrado: hace 15 años

Muy buenas, yo llevo algun tiempo trabajando sobre esas radios y normalmente funcionan.. aunque de vez en cuando se quedan pilladas y aun estoy buscando porque .. y como solucionarlo al vuelo 😀

Te pongo los registros que uso en la inicializacion. Yo uso un protocolo propio ( la pila de zigbee o miwi estan muy bien, pero me sobran por todas partes para lo que quiero, un punto a punto sencillito)

Despues de poner todos los pines del pic a sus correspondientes valores de IO, inicilizar la maquina spi, etc etc
(esta en C pero los nombres de los registros son los de microchip... en el fondo esta montado a partir de sus demos archivos

MRFSetShortRAMAddr(SOFTRST,0b00000111); //full reset
do //wait for reset completion
{
i = MRFGetShortRAMAddr(SOFTRST);
}while((i&0x07) != (BYTE)0x00);

MRFSetShortRAMAddr(RFCTL,0x04);
MRFSetShortRAMAddr(RFCTL,0x00);

/* flush the RX fifo */
MRFSetShortRAMAddr(RXFLUSH,0x01);

/* select the correct channel */
MRFSetLongRAMAddr(RFCTRL0,0x02);

/* setup */
MRFSetLongRAMAddr(RFCTRL1,0x01);
MRFSetLongRAMAddr(RFCTRL2,0x80);

// power level to be 0dBms
MRFSetLongRAMAddr(RFCTRL3,0x00);
/* program RSSI ADC with 2.5 MHz clock */
MRFSetLongRAMAddr(RFCTRL6,0x90);

MRFSetLongRAMAddr(RFCTRL7,0x00);

MRFSetLongRAMAddr(RFCTRL8,0x10);

MRFSetLongRAMAddr(SCLKDIV, 0x21);

/* Program CCA mode using RSSI */
MRFSetShortRAMAddr(BBREG2,0xB8);
/* Enable the packet RSSI */
MRFSetShortRAMAddr(BBREG6,0x40);
/* Program CCA, RSSI threshold values */
MRFSetShortRAMAddr(RSSITHCCA,0x00);

MRFSetShortRAMAddr(FFOEN, 0x98);
MRFSetShortRAMAddr(TXPEMISP, 0x95);

do
{
i = MRFGetLongRAMAddr(RFSTATE);
}
while((i&0xA0) != 0xA0);

//interupt config
MRFSetShortRAMAddr(INTMSK,0b11110110); //Tx and Rx interrupts enabled

// bypass the errata to make RF communication stable
MRFSetLongRAMAddr(RFCTRL1, 0x01);

//dont forget to reset RF machine at the end
MRFSetShortRAMAddr(RFCTL,0x04);
for(j=0;j<(WORD)10;j++){}
MRFSetShortRAMAddr(RFCTL,0x00);
for(j=0;j<(WORD)1000;j++){}

//Set the device ready to rx msg
MRFSetShortRAMAddr(RXMCR,0b00000000);
//clear interrupts in radio
MRFGetShortRAMAddr(ISRSTS);
//set int edge in radio
MRFSetLongRAMAddr(SLPCON0,0b00000010); //rising edge

Despues de eso se rellenan los registros de direcciones datos, montas la cabecera, llenas los datos del buffer de envio, etc etc... pero con eso ya esta listo para trabajar, despues depende de cual sea tu portocolo ... solo una cosa.. al llenar el buffer de envio asegurate bien de llenar los registros del tamaño de datos a enviar.. si lo dejar a 0 no envia na 😀

----
para los interesados, trabajo con un pic18f4550 a 48Mhz(USBPLL/2) sobre una placa propia; lo de programar/depurar/hablar con el pic por usb es una gozada 😀

Responder
micalet
Respuestas: 9
Topic starter
(@micalet)
Active Member
Registrado: hace 16 años

He visto un comportamiento raro en el MRF: resulta que si en el campo "frame length" dirección 0x001 del tampón de transmisión normal pongo un número igual o menor que 6, en la recepción, en el campo "frame length" de la trama recibida ¡hay un cero!. Sólo cuando pongo un 7 o más en el registro 0x001 del TX veo un 9 (7+2) o más en el registro 0x300 del receptor. No veo esto porqué, aunque puede que tenga que ver con la norma que maneja el MRF: la IEEE 802.15.4. Resulta que las interrupciones de TX y RX se producen normalmente con cualquier tamaño de trama, pero en el RX el "frame length" sólo va bien a partir de 7 byts en el TX.
¿A alguien le ocurre esto? ¿alguien sabe porqué?. ❗ ❓

Responder
Página 4 / 4
Compartir: