Funciones básicas del chip radio
Funciones básicas del chip radio
El protocolo SimpliciTI
SimpliciTI fue diseñado como protocolo radio de bajo consumo. Texas Instruments (TI) lo desarrollo con la premisa de mantener una configuración de red muy sencilla, proporcionando maneras eficaces de enviar mensajes cortos. Es un protocolo propietario con APIs para diferentes entornos de desarrollo y dispositivos hardware de TI. Las características más importantes son:
-
Baja huella de memoria ( <8kB flash y <512 B de RAM);
-
Control de red completo (encriptado, gestión de frecuencia y potencia, enrutado, ... );
-
Soporte para modos de bajo consumo
-
Arquitectura
-
Clases de dispositivos : desde el punto de vista del protocolo SimpliciTI, una aplicación puede comportase de 3 formas:
Dispositivo final (end device): son los sumideros de la red. Lo constituirían los sensores y actuadores de la red.
Punto de acceso (access point): implementa las funciones más complejas, como la retransmisión de mensajes para dispositivos en bajo consumo, gestión de la red, claves de seguridad ...
Extensor de rango (range extender): simplemente retransmiten los paquetes recibidos para incrementar la cobertura de la red.
-
Topologías de Red: Existen dos topologías de red:
-
Punto a punto: todos los elementos son dispositivos finales que se comunican dos a dos (o quizás con algún extensor de rango)
-
Estrella: existe un dispositivo central (un punto de acceso) que arbitra e intercomunica todos los dispositivos finales de la red
-
Capas : Disponemos de tres capas superpuestas, sobre las cuales se implementarían las funciones del desarrollador.
-
Física/Enlace: Proporciona abstracción del hardware (subcapa Board Support Package) y conexión radio punto a punto (Minimal Radio Interface).
-
Red: Gestiona las colas de transmisión y recepción extremo a extremo. Solo la aplicación de red de ping debería ser usada por el desarrollador.
-
Aplicación: en esta capa se enmarcan nuestras aplicaciones. Hay que tener en cuenta que SimpliciTI no implementa recuperación de fallos, al no tener capa de Transporte.
-
Funciones básicas
La librería SimpliciTI está pensada para utilizarse con las funciones de nivel de red, aunque es posible utilizar tan sólo las funciones más elementales del nivel de enlace. Estas son las funciones más relevantes.
- Nivel Enlace
- BSP_Init(): inicializa la placa hardware. Es imprescindible incluir esta llamada al principio.
- MRFI_Init(): inicializa el nivel de enlace.
- MRFI_WakeUp(): activa el chip de radio.
- MRFI_RxOn(): activa la transmisión.
- MRFI_RxCompleteISR(): función programada por el usuario que se llama cada vez que se recive una trama.
- MRFI_Receive(): permite acceder al dato recibido de nivel de enlace.
- MRFI_Transmit(): envía una trama.
- Nivel de Red
- SMPL_Init(): inicializa el nivel de red, y proporciona la función de usuario que se llama cada vez que se recibe un paquete.
- SMPL_Link(): el emisor utiliza esta función para iniciar la comunicación con el receptor.
- SMPL_LinkListen(): el receptor espera un paquete entrante con esta función.
- SMPL_Send() - SMPL_Receive(): envian y reciben tramas en extremos conectados.
- SMPL_Ioctl(): Reconfigura los parámetros del sistema.
SimpliciTI en IAR
Las librerías de SimpliciTI se añaden como cualquier otra librería. Si las instalamos en su ubicación por defecto, habremos de añadir en el cuadro de texto "Additional include directories":
C:\Texas Instruments\SimpliciTI-IAR-1.1.1\Components\bsp C:\Texas Instruments\SimpliciTI-IAR-1.1.1\Components\bsp\drivers C:\Texas Instruments\SimpliciTI-IAR-1.1.1\Components\bsp\boards\EZ430RF C:\Texas Instruments\SimpliciTI-IAR-1.1.1\Components\mrfi |
Adicionalmente, hemos de definir un símbolo del preprocesador (cuadro de texto "defined symbols") en la misma pestaña "preprocessor", que indica qué radio usaremos:
MRFI_CC2500 |
También habremos de añadir una opción en la pestaña "Extra options", cuadro de texto "command line options", que configure la radio:
-DMAX_HOPS=3 |
Finalmente, para ilustrar el funcionamiento de SimpliciTI, comentaremos un ejemplo disponible con la librería SimpliciTI 1.1, en "\SimpliciTI-IAR-1.1.1\Projects\Examples\Applications\main_LinkTo.c".
#include "bsp.h" #include "mrfi.h" #include "nwk_types.h" #include "nwk_api.h" #include "bsp_leds.h" #include "bsp_buttons.h"
static void linkTo(void);
void toggleLED(uint8_t);
static uint8_t sTxTid=0, sRxTid=0; static linkID_t sLinkID1 = 0;
// funcion que procesa las tramas recibidas static uint8_t sRxCallback(linkID_t);
#define SPIN_ABOUT_A_SECOND NWK_DELAY(1000)
void main (void) { BSP_Init(); SMPL_Init(sRxCallback);
// encender leds if (!BSP_LED2_IS_ON()) { toggleLED(2); } if (!BSP_LED1_IS_ON()) { toggleLED(1); }
// esperar pulsación de boton do { if (BSP_BUTTON1() || BSP_BUTTON2()) { break; } } while (1);
//funcion principal linkTo();
// no deberia llegarse a esta línea while (1) ; } |
static void linkTo() { uint8_t msg[2], delay = 0;
// buscamos al receptor ... while (SMPL_SUCCESS != SMPL_Link(&sLinkID1)) { // parpadear leds hasta conectarnos toggleLED(1); toggleLED(2); SPIN_ABOUT_A_SECOND; }
// conectados: apagar led rojo y parpadear con el verde al llegar mensajes... if (BSP_LED2_IS_ON()) { toggleLED(2); }
//activar nuestra recepcion SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_RXON, 0);
msg[0] = 2; while (1) { SPIN_ABOUT_A_SECOND; if (delay > 0x00) { SPIN_ABOUT_A_SECOND; } if (delay > 0x01) { SPIN_ABOUT_A_SECOND; } if (delay > 0x02) { SPIN_ABOUT_A_SECOND; }
//retardo cíclico delay = (delay+1) & 0x03; //incluimos el numero de secuencia en el mensaje y lo enviamos ... msg[1] = ++sTxTid; SMPL_Send(sLinkID1, msg, sizeof(msg)); } } |
void toggleLED(uint8_t which) { if (1 == which) { BSP_TOGGLE_LED1(); } else if (2 == which) { BSP_TOGGLE_LED2(); } return; } |
//manejador de mensajes recibidos static uint8_t sRxCallback(linkID_t port) { uint8_t msg[2], len, tid;
// ¿es para nosotros? if (port == sLinkID1) { // pues decodifiquemos la trama if ((SMPL_SUCCESS == SMPL_Receive(sLinkID1, msg, &len)) && len) { //comprobacion del numero de secuencia ... tid = *(msg+1); if (tid) { if (tid > sRxTid) { // si el numero de secuencia es correcto, parpadear... toggleLED(*msg); sRxTid = tid; } } else { // ¿ha recomenzado la secuencia? if (sRxTid) { //podemos parpadear toggleLED(*msg); sRxTid = tid; } } // terminación correcta, podemos descartar la trama return 1; } } // no descartar la trama ... return 0; } |