支持 Flooding Mesh 的 868MHz 长距离无线通信,通信范围可达 300 米
A
A
硬件概览
它是如何工作的?
ISM 7 Click 基于 Würth Elektronik 推出的 Tarvos-III 无线模块(型号 2609011081000),专为 868MHz SRD 频段内的无线通信应用而设计。该模块集成了高性能的 sub-GHz 收发器 Texas Instruments CC1310,具备一个 32 位 ARM Cortex-M3 处理器、128kB 的闪存和 20kB 的 RAM,能够同时处理通信任务并运行用户自定义的应用程序代码。其支持的频率范围覆盖 863MHz 到 870MHz,在视距条件下可实现最长 300 米的稳定通信距离。凭借 -8dBm 的发射功率和高达 -104dBm 的接收灵敏度,ISM 7 Click 即便在干扰严重或复杂的环境中也能保持可靠的无线连接。该 Click 板非常适用于各种长距离、低功耗的物联网通信应用,如智能计量、工业监测、楼宇自动化、农业感测系统和物流追踪等。Tarvos-III 模块设计注重能效管理,特别适合用于电池供电的低功耗系统中。模块集成的软件栈支持先进的网络功能,包括 Flooding Mesh 技术,在大范围传感器网络中实现强
健的多跳通信能力。其地址配置系统高度灵活,最多可支持 65,535 个设备并划分为多达 255 个独立网络,为大规模 IoT 部署提供强大扩展性。ISM 7 Click 通过 UART 接口与主控 MCU 通信,使用标准的 RX 和 TX 引脚及 RTS 硬件流控引脚进行数据传输,默认通信速率为 115200bps。板上包含两个配置拨码开关,分别用于控制模块的启动模式和工作模式。BOOT 拨码开关用于选择启动方式,拨至位置 0 时,模块将运行预加载的应用固件,拨至位置 1 时,模块进入 UART 启动模式,用于执行固件升级。MODE 拨码开关用于设定模块的启动工作模式,拨至位置 0 将模块设置为命令模式,允许用户通过 UART 使用类 AT 命令进行配置与控制;拨至位置 1 时,模块进入透明传输模式,在该模式下所有接收到的 UART 数据将直接通过无线发送。除了通信和控制引脚,ISM 7 Click 还包含一个复位引脚(RST)和一个 RESET 按钮,用于轻松实现模块的软硬件重启,还配有一个
WUP 唤醒引脚,可从关断模式中唤醒模块。板上配有两颗状态 LED 指示灯,绿色 TX 灯表示数据发送状态,红色 RX 灯表示数据接收状态,方便开发与调试过程中的实时状态反馈。Tarvos-III(2609011081000)模块默认配备板载天线,支持标准无线应用。考虑到模块封装的一致性,ISM 7 Click 板也兼容另一版本的 Tarvos-III 模块(型号 2609011181000),该版本支持外接天线。为此,板上还预留了一个未焊接的外部天线连接器,可用于集成如 ISM 868/915MHz 主动 PCB 天线等外部天线。除此之外,该板还包含标准的 JTAG 接口焊盘,方便进行设计验证与电路板调试。ISM 7 Click 仅支持 3.3V 逻辑电压工作环境,若与其他逻辑电压等级的 MCU 配合使用,需进行适当的电平转换。该 Click 板配备了易于使用的软件库和示例代码,可作为开发参考,帮助用户快速构建和扩展其无线通信系统。
功能概述
开发板
Clicker 4 for STM32F3 是一款紧凑型开发板,作为完整的解决方案而设计,可帮助用户快速构建具备独特功能的定制设备。该板搭载 STMicroelectronics 的 STM32F302VCT6 微控制器,配备四个 mikroBUS™ 插槽用于连接 Click boards™、完善的电源管理功能以及其他实用资源,是快速开发各类应用的理想平台。其核心 MCU STM32F302VCT6 基于高性能
Arm® Cortex®-M4 32 位处理器,运行频率高达 168MHz,处理能力强大,能够满足各种高复杂度任务的需求,使 Clicker 4 能灵活适应多种应用场景。除了两个 1x20 引脚排针外,板载最显著的连接特性是四个增强型 mikroBUS™ 插槽,支持接入数量庞大的 Click boards™ 生态系统,该生态每日持续扩展。Clicker 4 各功能区域标识清晰,界面直观简洁,极大
提升使用便捷性和开发效率。Clicker 4 的价值不仅在于加速原型开发与应用构建阶段,更在于其作为独立完整方案可直接集成至实际项目中,无需额外硬件修改。四角各设有直径 4.2mm(0.165")的安装孔,便于通过螺丝轻松固定。对于多数应用,只需配套一个外壳,即可将 Clicker 4 开发板转化为完整、实用且外观精美的定制系统。
微控制器概述
MCU卡片 / MCU

建筑
ARM Cortex-M4
MCU 内存 (KB)
256
硅供应商
STMicroelectronics
引脚数
100
RAM (字节)
40960
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
实时跟踪您的结果
应用程序输出
1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程。

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持
库描述
ISM 7 Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。
示例描述
本示例演示如何使用 ISM 7 Click 板,通过两个 Click 板之间的通信展示其无线传输能力。
关键功能:
ism7_cfg_setup
- 初始化 Click 配置结构为默认初始值。ism7_init
- 初始化该 Click 板所需的所有引脚和外设。ism7_send_cmd
- 从 Click 上下文对象中发送所需命令包。ism7_read_event
- 从环形缓冲区中读取事件数据包并存储到 Click 上下文对象中。ism7_get_user_setting
- 从指定用户设置索引读取数据,并将其存储到事件数据包对象中。
应用初始化
初始化驱动程序,重置 Click 板,读取设备信息,并发送初始消息以启动与另一块 Click 板的通信。
应用任务
持续读取并解析所有接收到的事件数据包,并通过 USB UART 显示。系统将回显所有来自已连接设备的接收数据,实现基本的双向通信演示。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief ISM 7 Click Example.
*
* # Description
* This example demonstrates the use of ISM 7 Click board by showing
* the communication between two Click boards.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver, resets the Click board, reads the device info, and sends
* a message to initiate the communication with other Click board.
*
* ## Application Task
* Reads and parses all the received event packets and displays them the USB UART.
* All incoming data messages received from the connected device will be echoed back.
*
* ## Additional Function
* - static err_t ism7_parse_cnf ( ism7_t *ctx )
* - static err_t ism7_parse_ind ( ism7_t *ctx )
* - static err_t ism7_parse_event ( ism7_t *ctx )
*
* @author Stefan Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "ism7.h"
// Text message to send to initiate communication
#define DEMO_TEXT_MESSAGE "MIKROE - ISM 7 Click board"
static ism7_t ism7;
static log_t logger;
/**
* @brief ISM 7 parse cnf function.
* @details This function parses all received confirmation packets and displays them on the USB UART.
* @param[in] ctx : Click context object.
* See #ism7_t object definition for detailed explanation.
* @return @li @c 0 - Packet parsed successfully,
* @li @c 1 - Error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t ism7_parse_cnf ( ism7_t *ctx );
/**
* @brief ISM 7 parse ind function.
* @details This function parses all received indication packets and displays them on the USB UART.
* @param[in] ctx : Click context object.
* See #ism7_t object definition for detailed explanation.
* @return @li @c 0 - Packet parsed successfully,
* @li @c 1 - Error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t ism7_parse_ind ( ism7_t *ctx );
/**
* @brief ISM 7 parse event function.
* @details This function parses all received packets and displays them on the USB UART.
* @param[in] ctx : Click context object.
* See #ism7_t object definition for detailed explanation.
* @return @li @c 0 - Packet parsed successfully,
* @li @c 1 - Error.
* See #err_t definition for detailed explanation.
* @note None.
*/
static err_t ism7_parse_event ( ism7_t *ctx );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
ism7_cfg_t ism7_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
ism7_cfg_setup( &ism7_cfg );
ISM7_MAP_MIKROBUS( ism7_cfg, MIKROBUS_1 );
if ( UART_ERROR == ism7_init( &ism7, &ism7_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
log_printf( &logger, ">> Reset device.\r\n" );
if ( ISM7_ERROR == ism7_reset_device ( &ism7 ) )
{
log_error( &logger, " Reset device." );
for ( ; ; );
}
log_printf( &logger, ">> Get device info.\r\n" );
if ( ISM7_OK == ism7_get_user_setting ( &ism7, ISM7_SET_IDX_FACTORY_SETTINGS ) )
{
log_printf( &logger, " < Serial number: 0x%.2X%.2X%.2X%.2X\r\n",
( uint16_t ) ism7.evt_pkt.payload[ 4 ],
( uint16_t ) ism7.evt_pkt.payload[ 3 ],
( uint16_t ) ism7.evt_pkt.payload[ 2 ],
( uint16_t ) ism7.evt_pkt.payload[ 1 ] );
log_printf( &logger, " Hardware version: %u.%u.%u\r\n",
( uint16_t ) ism7.evt_pkt.payload[ 5 ],
( uint16_t ) ism7.evt_pkt.payload[ 6 ],
( uint16_t ) ism7.evt_pkt.payload[ 7 ] );
log_printf( &logger, " Frequency correction factor: %u\r\n",
( uint16_t ) ism7.evt_pkt.payload[ 8 ] );
}
log_printf( &logger, ">> Get FW version.\r\n" );
if ( ISM7_OK == ism7_get_user_setting ( &ism7, ISM7_SET_IDX_FIRMWARE_VERSION ) )
{
log_printf( &logger, " < FW version: %u.%u.%u\r\n\n",
( uint16_t ) ism7.evt_pkt.payload[ 3 ],
( uint16_t ) ism7.evt_pkt.payload[ 2 ],
( uint16_t ) ism7.evt_pkt.payload[ 1 ] );
}
log_printf( &logger, ">> Send message to initiate communication.\r\n" );
ism7.cmd_pkt.cmd = ISM7_CMD_REQ_DATA;
ism7.cmd_pkt.payload_len = strlen ( DEMO_TEXT_MESSAGE );
strcpy ( ism7.cmd_pkt.payload, DEMO_TEXT_MESSAGE );
if ( ISM7_OK == ism7_send_cmd ( &ism7 ) )
{
if ( ISM7_OK == ism7_wait_for_event ( &ism7, ISM7_CMD_CNF_DATA, ISM7_WAIT_TIME_1S ) )
{
ism7_parse_event ( &ism7 );
}
}
log_info( &logger, " Application Task " );
}
void application_task ( void )
{
if ( ISM7_OK == ism7_read_event ( &ism7 ) )
{
ism7_parse_event ( &ism7 );
}
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
static err_t ism7_parse_cnf ( ism7_t *ctx )
{
err_t error_flag = ISM7_OK;
uint16_t byte_cnt = 0;
if ( ISM7_CMD_TYPE_CNF == ( ctx->evt_pkt.cmd & ISM7_CMD_TYPE_MASK ) )
{
// Parse confirmation packet
switch ( ctx->evt_pkt.cmd )
{
case ISM7_CMD_CNF_GET:
{
log_printf( &logger, " < GET_CNF -> " );
switch ( ctx->evt_pkt.payload[ 0 ] )
{
case ISM7_CNF_GET_STATUS_OK:
{
log_printf( &logger, "Request successfully received and processed" );
break;
}
case ISM7_CNF_GET_STATUS_FAILED:
{
log_printf( &logger, "Request not successful" );
break;
}
default:
{
log_printf( &logger, "Unknown status: 0x%.2X", ( uint16_t ) ctx->evt_pkt.payload[ 0 ] );
break;
}
}
if ( ctx->evt_pkt.payload_len > 1 )
{
log_printf( &logger, "\r\n Setting: " );
for ( byte_cnt = 1; byte_cnt < ctx->evt_pkt.payload_len; byte_cnt++ )
{
log_printf( &logger, "0x%.2X ", ( uint16_t ) ctx->evt_pkt.payload[ byte_cnt ] );
}
}
break;
}
case ISM7_CMD_CNF_DATA:
{
log_printf( &logger, " < DATA_CNF -> " );
switch ( ctx->evt_pkt.payload[ 0 ] )
{
case ISM7_CNF_DATA_STATUS_ACK:
{
log_printf( &logger, "ACK received or not requested" );
break;
}
case ISM7_CNF_DATA_STATUS_NACK:
{
log_printf( &logger, "No ACK received within a time-out " );
break;
}
case ISM7_CNF_DATA_STATUS_INVALID_CH:
{
log_printf( &logger, "Invalid channel selected" );
break;
}
case ISM7_CNF_DATA_STATUS_RADIO_CH_BUSY:
{
log_printf( &logger, "Radio channel busy (LBT)" );
break;
}
case ISM7_CNF_DATA_STATUS_MODULE_BUSY:
{
log_printf( &logger, "Module is currently busy" );
break;
}
case ISM7_CNF_DATA_STATUS_INVALID:
{
log_printf( &logger, "Invalid (payload too long)" );
break;
}
default:
{
log_printf( &logger, "Unknown status: 0x%.2X", ( uint16_t ) ctx->evt_pkt.payload[ 0 ] );
break;
}
}
Delay_ms ( 1000 );
break;
}
default:
{
log_printf( &logger, " < CMD_CNF 0x%.2X -> ", ( uint16_t ) ctx->evt_pkt.cmd );
for ( byte_cnt = 0; byte_cnt < ctx->evt_pkt.payload_len; byte_cnt++ )
{
log_printf( &logger, "0x%.2X ", ( uint16_t ) ctx->evt_pkt.payload[ byte_cnt ] );
}
break;
}
}
log_printf( &logger, "\r\n\n" );
}
else
{
// Wrong packet type
error_flag |= ISM7_ERROR;
}
return error_flag;
}
static err_t ism7_parse_ind ( ism7_t *ctx )
{
err_t error_flag = ISM7_OK;
uint16_t byte_cnt = 0;
if ( ISM7_CMD_TYPE_IND == ( ctx->evt_pkt.cmd & ISM7_CMD_TYPE_MASK ) )
{
// Parse indication packet
switch ( ctx->evt_pkt.cmd )
{
case ISM7_CMD_IND_DATAEX:
{
log_printf( &logger, " < DATAEX_IND -> " );
log_printf( &logger, "Field strength: %d\r\n",
( int16_t ) ( ( int8_t ) ctx->evt_pkt.payload[ ctx->evt_pkt.payload_len - 1 ] ) );
log_printf( &logger, " Data (HEX): " );
for ( byte_cnt = 0; byte_cnt < ( ctx->evt_pkt.payload_len - 1 ); byte_cnt++ )
{
log_printf( &logger, "0x%.2X ", ( uint16_t ) ctx->evt_pkt.payload[ byte_cnt ] );
}
Delay_ms ( 10 );
ctx->evt_pkt.payload[ ctx->evt_pkt.payload_len - 1 ] = 0;
log_printf( &logger, "\r\n Data (STR): %s", &ctx->evt_pkt.payload[ 0 ] );
log_printf( &logger, "\r\n\n>> Echo back the received message." );
ctx->cmd_pkt.cmd = ISM7_CMD_REQ_DATA;
ctx->cmd_pkt.payload_len = ctx->evt_pkt.payload_len - 1;
memcpy ( &ctx->cmd_pkt.payload[ 0 ], &ctx->evt_pkt.payload[ 0 ], ctx->evt_pkt.payload_len - 1 );
error_flag |= ism7_send_cmd ( ctx );
break;
}
default:
{
log_printf( &logger, " < CMD_IND 0x%.2X -> ", ( uint16_t ) ctx->evt_pkt.cmd );
for ( byte_cnt = 0; byte_cnt < ctx->evt_pkt.payload_len; byte_cnt++ )
{
log_printf( &logger, "0x%.2X ", ( uint16_t ) ctx->evt_pkt.payload[ byte_cnt ] );
}
break;
}
}
log_printf( &logger, "\r\n\n" );
}
else
{
// Wrong packet type
error_flag |= ISM7_ERROR;
}
return error_flag;
}
static err_t ism7_parse_event ( ism7_t *ctx )
{
err_t error_flag = ISM7_OK;
if ( ISM7_CMD_TYPE_CNF == ( ctx->evt_pkt.cmd & ISM7_CMD_TYPE_MASK ) )
{
error_flag |= ism7_parse_cnf ( ctx );
}
else if ( ISM7_CMD_TYPE_IND == ( ctx->evt_pkt.cmd & ISM7_CMD_TYPE_MASK ) )
{
error_flag |= ism7_parse_ind ( ctx );
}
else
{
// Error packet should not be a command request
error_flag |= ISM7_ERROR;
}
return error_flag;
}
// ------------------------------------------------------------------------ END
额外支持
资源
类别:1GHz以下收发器