neomesh868mhz  2.1.0.0
Main Page

NeoMesh 868MHz click

NeoMesh Click - 868MHz is a compact add-on board with a low-power, long-range transceiver, ideal for Mesh wireless networking. This board features the NC1000C-8, a wireless Mesh network module from NeoCortec. With an additional antenna that MikroE offers connected to the module’s u.Fl connector, you can create a fully functional wireless Mesh network node that will work in the Sub-GHz frequency band of 868MHz. The module has a generic application layer that can configured to suit applications.

click Product page


Click library

  • Author : Stefan Filipovic
  • Date : Sep 2023.
  • Type : UART type

Software Support

We provide a library for the NeoMesh 868MHz Click as well as a demo application (example), developed using MikroElektronika compilers. The demo can run on all the main MikroElektronika development boards.

Package can be downloaded/installed directly from NECTO Studio Package Manager(recommended way), downloaded from our LibStock™ or found on Mikroe github account.

Library Description

This library contains API for NeoMesh 868MHz Click driver.

Standard key functions :

Example key functions :

Example Description

This example demonstrates the use of NeoMesh 868MHz click board by showing the communication between the two click boards.

The demo application is composed of two sections :

Application Init

Initializes the driver and configures the click board for the selected application mode.

void application_init ( void )
{
log_cfg_t log_cfg;
neomesh868mhz_cfg_t neomesh868mhz_cfg;
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
neomesh868mhz_cfg_setup( &neomesh868mhz_cfg );
NEOMESH868MHZ_MAP_MIKROBUS( neomesh868mhz_cfg, MIKROBUS_1 );
if ( UART_ERROR == neomesh868mhz_init( &neomesh868mhz, &neomesh868mhz_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
log_printf( &logger, "\r\n Enable SAPI over AAPI\r\n" );
aapi_frame.len = 0;
neomesh868mhz_send_aapi_frame ( &neomesh868mhz, &aapi_frame );
neomesh868mhz_parse_sapi_rsp ( NEOMESH868MHZ_SAPI_RSP_BOOTLOADER_START );
log_printf( &logger, "\r\n Login with password\r\n" );
sapi_frame.cmd = NEOMESH868MHZ_SAPI_CMD_LOGIN;
sapi_frame.len = 5;
sapi_frame.payload[ 0 ] = NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_0;
sapi_frame.payload[ 1 ] = NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_1;
sapi_frame.payload[ 2 ] = NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_2;
sapi_frame.payload[ 3 ] = NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_3;
sapi_frame.payload[ 4 ] = NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_4;
neomesh868mhz_send_sapi_frame ( &neomesh868mhz, &sapi_frame );
neomesh868mhz_parse_sapi_rsp ( NEOMESH868MHZ_SAPI_RSP_OK );
log_printf( &logger, "\r\n Set NODE ID to: " );
sapi_frame.len = 3;
sapi_frame.payload[ 0 ] = NEOMESH868MHZ_SAPI_SETTINGS_ID_NODE_ID;
#if ( DEMO_APP == APP_RECEIVER_1 )
log_printf( &logger, "%.4X\r\n", ( uint16_t ) NODE_ID_RECEIVER_1 );
sapi_frame.payload[ 1 ] = ( uint8_t ) ( ( NODE_ID_RECEIVER_1 >> 8 ) & 0xFF );
sapi_frame.payload[ 2 ] = ( uint8_t ) ( NODE_ID_RECEIVER_1 & 0xFF );
#elif ( DEMO_APP == APP_RECEIVER_2 )
log_printf( &logger, "%.4X\r\n", ( uint16_t ) NODE_ID_RECEIVER_2 );
sapi_frame.payload[ 1 ] = ( uint8_t ) ( ( NODE_ID_RECEIVER_2 >> 8 ) & 0xFF );
sapi_frame.payload[ 2 ] = ( uint8_t ) ( NODE_ID_RECEIVER_2 & 0xFF );
#elif ( DEMO_APP == APP_ORIGINATOR )
log_printf( &logger, "%.4X\r\n", ( uint16_t ) NODE_ID_ORIGINATOR );
sapi_frame.payload[ 1 ] = ( uint8_t ) ( ( NODE_ID_ORIGINATOR >> 8 ) & 0xFF );
sapi_frame.payload[ 2 ] = ( uint8_t ) ( NODE_ID_ORIGINATOR & 0xFF );
#endif
neomesh868mhz_send_sapi_frame ( &neomesh868mhz, &sapi_frame );
neomesh868mhz_parse_sapi_rsp ( NEOMESH868MHZ_SAPI_RSP_OK );
log_printf( &logger, "\r\n Commit settings\r\n" );
sapi_frame.len = 0;
neomesh868mhz_send_sapi_frame ( &neomesh868mhz, &sapi_frame );
neomesh868mhz_parse_sapi_rsp ( NEOMESH868MHZ_SAPI_RSP_OK );
log_printf( &logger, "\r\n Start protocol stack\r\n" );
sapi_frame.len = 0;
neomesh868mhz_send_sapi_frame ( &neomesh868mhz, &sapi_frame );
neomesh868mhz_parse_sapi_rsp ( NEOMESH868MHZ_SAPI_RSP_PROTOCOL_STACK_START );
// Wait for the device to actually switch back to application layer
while ( !neomesh868mhz_get_cts_pin ( &neomesh868mhz ) );
log_printf( &logger, "\r\n Get NODE info\r\n" );
aapi_frame.cmd = NEOMESH868MHZ_CMD_NODE_INFO;
aapi_frame.len = 0;
neomesh868mhz_send_aapi_frame ( &neomesh868mhz, &aapi_frame );
neomesh868mhz_parse_aapi_rsp ( NEOMESH868MHZ_RSP_NODE_INFO );
log_printf( &logger, "\r\n Get neighbour list\r\n" );
aapi_frame.len = 0;
neomesh868mhz_send_aapi_frame ( &neomesh868mhz, &aapi_frame );
neomesh868mhz_parse_aapi_rsp ( NEOMESH868MHZ_RSP_NEIGHBOUR_LIST );
#if ( DEMO_APP == APP_RECEIVER_1 )
log_printf( &logger, "\r\n Application Mode: Receiver 1\r\n" );
#elif ( DEMO_APP == APP_RECEIVER_2 )
log_printf( &logger, "\r\n Application Mode: Receiver 2\r\n" );
#elif ( DEMO_APP == APP_ORIGINATOR )
log_printf( &logger, "\r\n Application Mode: Originator\r\n" );
#else
#error "Selected application mode is not supported!"
#endif
log_info( &logger, " Application Task " );
}

Application Task

One click board should be set to originator mode and the others to receiver 1 or 2.

If the SINGLE_RECEIVER_MODE is enabled, the originator device sends a desired message to RECEIVER_1 node and waits for an acknowledge response, otherwise it sends the same message to both RECEIVER_1 and RECEIVER_2 nodes. The receiver devices reads and parses all incoming AAPI frames and displays them on the USB UART.

void application_task ( void )
{
#if ( DEMO_APP == APP_ORIGINATOR )
log_printf( &logger, "\r\n Send message to node: %.4X\r\n", ( uint16_t ) NODE_ID_RECEIVER_1 );
aapi_frame.cmd = NEOMESH868MHZ_CMD_ACK_SEND;
aapi_frame.len = 3 + strlen ( DEMO_TEXT_MESSAGE );
aapi_frame.payload[ 0 ] = ( uint8_t ) ( ( NODE_ID_RECEIVER_1 >> 8 ) & 0xFF );
aapi_frame.payload[ 1 ] = ( uint8_t ) ( NODE_ID_RECEIVER_1 & 0xFF );
aapi_frame.payload[ 2 ] = DEFAULT_PORT;
strcpy ( &aapi_frame.payload[ 3 ], DEMO_TEXT_MESSAGE );
if ( NEOMESH868MHZ_OK == neomesh868mhz_send_aapi_frame ( &neomesh868mhz, &aapi_frame ) )
{
neomesh868mhz_parse_aapi_rsp ( NEOMESH868MHZ_RSP_ACK );
}
#ifndef SINGLE_RECEIVER_MODE
log_printf( &logger, "\r\n Send message to node: %.4X\r\n", ( uint16_t ) NODE_ID_RECEIVER_2 );
aapi_frame.cmd = NEOMESH868MHZ_CMD_ACK_SEND;
aapi_frame.len = 3 + strlen ( DEMO_TEXT_MESSAGE );
aapi_frame.payload[ 0 ] = ( uint8_t ) ( ( NODE_ID_RECEIVER_2 >> 8 ) & 0xFF );
aapi_frame.payload[ 1 ] = ( uint8_t ) ( NODE_ID_RECEIVER_2 & 0xFF );
aapi_frame.payload[ 2 ] = DEFAULT_PORT;
strcpy ( &aapi_frame.payload[ 3 ], DEMO_TEXT_MESSAGE );
if ( NEOMESH868MHZ_OK == neomesh868mhz_send_aapi_frame ( &neomesh868mhz, &aapi_frame ) )
{
neomesh868mhz_parse_aapi_rsp ( NEOMESH868MHZ_RSP_ACK );
}
#endif
#else
neomesh868mhz_parse_aapi_rsp ( NULL );
#endif
}

The full application code, and ready to use projects can be installed directly from NECTO Studio Package Manager(recommended way), downloaded from our LibStock™ or found on Mikroe github account.

Other Mikroe Libraries used in the example:

  • MikroSDK.Board
  • MikroSDK.Log
  • Click.NeoMesh868MHz

Additional notes and informations

Depending on the development board you are using, you may need USB UART click, USB UART 2 Click or RS232 Click to connect to your PC, for development systems with no UART to USB interface available on the board. UART terminal is available in all MikroElektronika compilers.


DEFAULT_PORT
#define DEFAULT_PORT
Definition: main.c:41
neomesh868mhz_cfg_t
NeoMesh 868MHz Click configuration object.
Definition: neomesh868mhz.h:226
NEOMESH868MHZ_CMD_NODE_INFO
#define NEOMESH868MHZ_CMD_NODE_INFO
Definition: neomesh868mhz.h:72
neomesh868mhz_send_sapi_frame
err_t neomesh868mhz_send_sapi_frame(neomesh868mhz_t *ctx, neomesh868mhz_sapi_frame_t *frame)
NeoMesh 868MHz send sapi frame function.
neomesh868mhz_aapi_frame_t
NeoMesh 868MHz Click data frame object.
Definition: neomesh868mhz.h:252
NEOMESH868MHZ_SAPI_CMD_LOGIN
#define NEOMESH868MHZ_SAPI_CMD_LOGIN
NeoMesh 868MHz SAPI control commands.
Definition: neomesh868mhz.h:107
NEOMESH868MHZ_OK
@ NEOMESH868MHZ_OK
Definition: neomesh868mhz.h:277
NEOMESH868MHZ_SAPI_RSP_PROTOCOL_STACK_START
#define NEOMESH868MHZ_SAPI_RSP_PROTOCOL_STACK_START
Definition: neomesh868mhz.h:127
neomesh868mhz_get_cts_pin
uint8_t neomesh868mhz_get_cts_pin(neomesh868mhz_t *ctx)
NeoMesh 868MHz get cts pin function.
neomesh868mhz_send_aapi_frame
err_t neomesh868mhz_send_aapi_frame(neomesh868mhz_t *ctx, neomesh868mhz_aapi_frame_t *frame)
NeoMesh 868MHz send aapi frame function.
NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_4
#define NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_4
Definition: neomesh868mhz.h:141
NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_3
#define NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_3
Definition: neomesh868mhz.h:140
NEOMESH868MHZ_SAPI_RSP_BOOTLOADER_START
#define NEOMESH868MHZ_SAPI_RSP_BOOTLOADER_START
Definition: neomesh868mhz.h:126
NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_2
#define NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_2
Definition: neomesh868mhz.h:139
neomesh868mhz_t
NeoMesh 868MHz Click context object.
Definition: neomesh868mhz.h:202
NEOMESH868MHZ_SAPI_CMD_START_PROTOCOL_STACK
#define NEOMESH868MHZ_SAPI_CMD_START_PROTOCOL_STACK
Definition: neomesh868mhz.h:115
application_task
void application_task(void)
Definition: main.c:178
NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_0
#define NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_0
NeoMesh 868MHz login password settings.
Definition: neomesh868mhz.h:137
neomesh868mhz_read_aapi_frame
err_t neomesh868mhz_read_aapi_frame(neomesh868mhz_t *ctx, neomesh868mhz_aapi_frame_t *frame)
NeoMesh 868MHz read aapi frame function.
NEOMESH868MHZ_CMD_ACK_SEND
#define NEOMESH868MHZ_CMD_ACK_SEND
Definition: neomesh868mhz.h:70
NEOMESH868MHZ_CMD_SAPI_TO_AAPI
#define NEOMESH868MHZ_CMD_SAPI_TO_AAPI
Definition: neomesh868mhz.h:75
NEOMESH868MHZ_RSP_NEIGHBOUR_LIST
#define NEOMESH868MHZ_RSP_NEIGHBOUR_LIST
Definition: neomesh868mhz.h:95
NEOMESH868MHZ_SAPI_RSP_OK
#define NEOMESH868MHZ_SAPI_RSP_OK
NeoMesh 868MHz system data response.
Definition: neomesh868mhz.h:124
neomesh868mhz_init
err_t neomesh868mhz_init(neomesh868mhz_t *ctx, neomesh868mhz_cfg_t *cfg)
NeoMesh 868MHz initialization function.
neomesh868mhz_cfg_setup
void neomesh868mhz_cfg_setup(neomesh868mhz_cfg_t *cfg)
NeoMesh 868MHz configuration object setup function.
NEOMESH868MHZ_SAPI_SETTINGS_ID_NODE_ID
#define NEOMESH868MHZ_SAPI_SETTINGS_ID_NODE_ID
NeoMesh 868MHz SAPI settings ID.
Definition: neomesh868mhz.h:147
NEOMESH868MHZ_RSP_ACK
#define NEOMESH868MHZ_RSP_ACK
NeoMesh 868MHz application data response.
Definition: neomesh868mhz.h:86
NEOMESH868MHZ_CMD_NEIGHBOUR_LIST
#define NEOMESH868MHZ_CMD_NEIGHBOUR_LIST
Definition: neomesh868mhz.h:73
NODE_ID_ORIGINATOR
#define NODE_ID_ORIGINATOR
Definition: main.c:44
application_init
void application_init(void)
Definition: main.c:75
NODE_ID_RECEIVER_1
#define NODE_ID_RECEIVER_1
Definition: main.c:45
NEOMESH868MHZ_SAPI_CMD_SET_SETTING
#define NEOMESH868MHZ_SAPI_CMD_SET_SETTING
Definition: neomesh868mhz.h:114
NODE_ID_RECEIVER_2
#define NODE_ID_RECEIVER_2
Definition: main.c:46
neomesh868mhz_sapi_frame_t
NeoMesh 868MHz Click data frame object.
Definition: neomesh868mhz.h:264
NEOMESH868MHZ_SAPI_CMD_COMMIT_SETTINGS
#define NEOMESH868MHZ_SAPI_CMD_COMMIT_SETTINGS
Definition: neomesh868mhz.h:112
NEOMESH868MHZ_RSP_NODE_INFO
#define NEOMESH868MHZ_RSP_NODE_INFO
Definition: neomesh868mhz.h:94
NEOMESH868MHZ_MAP_MIKROBUS
#define NEOMESH868MHZ_MAP_MIKROBUS(cfg, mikrobus)
MikroBUS pin mapping.
Definition: neomesh868mhz.h:185
DEMO_TEXT_MESSAGE
#define DEMO_TEXT_MESSAGE
Definition: main.c:40
NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_1
#define NEOMESH868MHZ_SAPI_LOGIN_PASSWORD_1
Definition: neomesh868mhz.h:138