探索这种无线方法如何作为线缆的便利替代品,赋予用户无需劳力的数据交换和直观的设备管理,从而增强连接性和生产力。
A
A
硬件概览
它是如何工作的?
RN4678 Click基于Microchip的RN4678,这是一款蓝牙® 4.2双模式模块。该Click设计为在3.3V电源上运行。它通过I2C和UART接口与目标微控制器通信,mikroBUS™线上的以下引脚提供附加功能:AN, RST, CS, PWM, INT。Microchip的RN4678是一个完全认证的蓝牙版本4.2模块。使用它可以为您的项目添
加蓝牙无线功能。该模块包括一个板载蓝牙堆栈、电源管理子系统、2.4 GHz收发器和射频功率放大器。通过蓝牙发送或接收数据,通过Bluetooth(BT)经典模式中的SPP和BLE模式中的透明UART实现数据传输。RN4678包含一个整体陶瓷芯片天线。RN4678模块具有强大的AES128加密功能。128位加密是最健壮的
加密算法之一。AES代表高级加密标准,一种对称加密算法。这个Click板™只能在3.3V逻辑电压级别下操作。在使用不同逻辑电平的MCU之前,板必须执行适当的逻辑电压级别转换。此外,它还配备了一个库,包含功能和示例代码,可以用作进一步开发的参考。
功能概述
开发板
PIC18F57Q43 Curiosity Nano 评估套件是一款尖端的硬件平台,旨在评估 PIC18-Q43 系列内的微控制器。其设计的核心是包含了功能强大的 PIC18F57Q43 微控制器(MCU),提供先进的功能和稳健的性能。这个评估套件的关键特点包括一个黄 色用户 LED 和一个响应灵敏的机械用户开关,提供无
缝的交互和测试。为一个 32.768kHz 水晶振荡器足迹提供支持,确保精准的定时能力。套件内置的调试器拥有一个绿色电源和状态 LED,使编程和调试变得直观高效。此外,增强其实用性的还有虚拟串行端口 (CDC)和一个调试 GPIO 通道(DGI GPIO),提供广泛的连接选项。该套件通过 USB 供电,拥有由
MIC5353 LDO 调节器提供支持的可调目标电压功能,确保在 1.8V 至 5.1V 的输出电压范围内稳定运行,最大输出电流为 500mA,受环境温度和电压限制。
微控制器概述
MCU卡片 / MCU
建筑
PIC
MCU 内存 (KB)
128
硅供应商
Microchip
引脚数
48
RAM (字节)
8196
你完善了我!
配件
Curiosity Nano Base for Click boards 是一款多功能硬件扩展平台,专为简化 Curiosity Nano 套件与扩展板之间的集成而设计,特别针对符合 mikroBUS™ 标准的 Click 板和 Xplained Pro 扩展板。这款创新的基板(屏蔽板)提供了无缝的连接和扩展可能性,简化了实验和开发过程。主要特点包括从 Curiosity Nano 套件提供 USB 电源兼容性,以及为增强灵活性而提供的另一种外部电源输入选项。板载锂离子/锂聚合物充电器和管理电路确保电池供电应用的平稳运行,简化了使用和管理。此外,基板内置了一个固定的 3.3V 电源供应单元,专用于目标和 mikroBUS™ 电源轨,以及一个固定的 5.0V 升压转换器,专供 mikroBUS™ 插座的 5V 电源轨,为各种连接设备提供稳定的电力供应。
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
原理图
一步一步来
项目组装
实时跟踪您的结果
通过调试模式的应用程序输出
1. 一旦代码示例加载完成,按下 "DEBUG" 按钮将启动构建过程,并将其编程到创建的设置上,然后进入调试模式。
2. 编程完成后,IDE 中将出现一个带有各种操作按钮的标题。点击绿色的 "PLAY" 按钮开始读取通过 Click board™ 获得的结果。获得的结果将在 "Application Output" 标签中显示。
软件支持
库描述
这个库包含了RN4678 Click驱动程序的API。
关键功能:
rn4678_enter_command_mode
- 进入命令模式函数rn4678_exit_command_mode
- 退出命令模式函数rn4678_set_device_name
- 设置设备名称函数
开源
代码示例
这个示例可以在 NECTO Studio 中找到。欢迎下载代码,或者您也可以复制下面的代码。
/*!
* \file
* \brief RN4678 Click example
*
* # Description
* This example reads and processes data from RN4678 clicks.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver and configures the click board.
*
* ## Application Task
* Checks for the received data, reads it and replies with a certain message.
*
* ## Additional Function
* - rn4678_process ( ) - Logs all the received messages/responses on the USB UART,
* and if it receives "Hello" string it sends the certain message
* back to the connected device.
*
* @note
* We have used the Serial Bluetooth Terminal smartphone application for the test.
* A smartphone and the click board must be paired in order to exchange messages with each other.
*
* \author MikroE Team
*
*/
// ------------------------------------------------------------------- INCLUDES
#include "board.h"
#include "log.h"
#include "rn4678.h"
#include "string.h"
#define PROCESS_COUNTER 20
#define PROCESS_RX_BUFFER_SIZE 100
#define PROCESS_PARSER_BUFFER_SIZE 100
#define PROCESS_RSP_ERROR -1
#define PROCESS_RSP_OK 1
#define PROCESS_NO_RSP 0
#define PROCESS_LOG_RSP 0
// ------------------------------------------------------------------ VARIABLES
static rn4678_t rn4678;
static log_t logger;
uint8_t DEVICE_NAME_DATA[ 20 ] = { 'R', 'N', '4', '6', '7', '8', ' ', 'c', 'l', 'i', 'c', 'k' };
uint8_t EXTENDED_STRING_DATA[ 10 ] = { 'S', 'l', 'a', 'v', 'e' };
uint8_t PIN_CODE_DATA[ 10 ] = { '1', '2', '3', '4' };
static char current_parser_buf[ PROCESS_PARSER_BUFFER_SIZE ];
// ------------------------------------------------------- ADDITIONAL FUNCTIONS
static int8_t rn4678_process ( char * response )
{
int32_t rsp_size;
uint16_t rsp_cnt = 0;
char uart_rx_buffer[ PROCESS_RX_BUFFER_SIZE ] = { 0 };
uint8_t check_buf_cnt;
uint8_t process_cnt = PROCESS_COUNTER;
int8_t rsp_flag = 0;
// Clear current buffer
memset( current_parser_buf, 0, PROCESS_PARSER_BUFFER_SIZE );
while( process_cnt != 0 )
{
rsp_size = rn4678_generic_read( &rn4678, uart_rx_buffer, PROCESS_RX_BUFFER_SIZE );
if ( rsp_size > 0 )
{
// Validation of the received data
for ( check_buf_cnt = 0; check_buf_cnt < rsp_size; check_buf_cnt++ )
{
if ( uart_rx_buffer[ check_buf_cnt ] == 0 )
{
uart_rx_buffer[ check_buf_cnt ] = 13;
}
}
// Storages data in current buffer
rsp_cnt += rsp_size;
if ( rsp_cnt < PROCESS_PARSER_BUFFER_SIZE )
{
strncat( current_parser_buf, uart_rx_buffer, rsp_size );
}
// Clear RX buffer
memset( uart_rx_buffer, 0, PROCESS_RX_BUFFER_SIZE );
if ( strstr( current_parser_buf, "ERR" ) ) {
Delay_100ms( );
rsp_flag = PROCESS_RSP_ERROR;
break;
}
if ( PROCESS_LOG_RSP != response )
{
if ( strstr( current_parser_buf, response ) ) {
Delay_100ms( );
rsp_flag = PROCESS_RSP_OK;
break;
}
}
else
{
rsp_flag = PROCESS_RSP_OK;
process_cnt = 1;
}
if ( strstr( current_parser_buf, "Hello" ) ) {
rn4678_generic_write( &rn4678, "MikroE\r\n", 8 );
Delay_100ms( );
break;
}
}
else
{
process_cnt--;
// Process delay
Delay_ms( 100 );
}
}
if ( PROCESS_NO_RSP != rsp_flag )
{
log_printf( &logger, "%s", current_parser_buf );
log_printf( &logger, "\r\n---------------------------\r\n" );
return rsp_flag;
}
return PROCESS_NO_RSP;
}
// ------------------------------------------------------ APPLICATION FUNCTIONS
void application_init ( void )
{
log_cfg_t log_cfg;
rn4678_cfg_t cfg;
/**
* 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.
rn4678_cfg_setup( &cfg );
RN4678_MAP_MIKROBUS( cfg, MIKROBUS_1 );
rn4678_init( &rn4678, &cfg );
rn4678_enable ( &rn4678 );
Delay_ms( 1000 );
rn4678_hw_reset ( &rn4678 );
Delay_ms( 1000 );
log_printf( &logger, "Configuring the module...\n" );
do
{
log_printf( &logger, " --- Command mode --- \r\n" );
rn4678_enter_command_mode( &rn4678 );
}
while( rn4678_process( "CMD" ) != 1 );
do
{
log_printf( &logger, " --- Device name --- \r\n" );
rn4678_set_device_name( &rn4678, &DEVICE_NAME_DATA[ 0 ] );
}
while( rn4678_process( "AOK" ) != 1 );
do
{
log_printf( &logger, " --- Status string --- \r\n" );
rn4678_set_extended_status_string( &rn4678, &EXTENDED_STRING_DATA[ 0 ] );
}
while( rn4678_process( "AOK" ) != 1 );
do
{
log_printf( &logger, " --- Operating mode --- \r\n" );
rn4678_set_operating_mode( &rn4678, 0 );
}
while( rn4678_process( "AOK" ) != 1 );
do
{
log_printf( &logger, " --- Authentication --- \r\n" );
rn4678_set_authentication( &rn4678, 1 );
}
while( rn4678_process( "AOK" ) != 1 );
do
{
log_printf( &logger, " --- Pin code --- \r\n" );
rn4678_set_security_pin_code( &rn4678, &PIN_CODE_DATA[ 0 ] );
}
while( rn4678_process( "AOK" ) != 1 );
do
{
log_printf( &logger, " --- Exit command mode --- \r\n" );
rn4678_exit_command_mode( &rn4678 );
}
while( rn4678_process( "END" ) != 1 );
log_printf( &logger, "The module has been configured.\n" );
rn4678_set_cts_pin( &rn4678, 0 );
}
void application_task ( void )
{
rn4678_process( PROCESS_LOG_RSP );
}
void main ( void )
{
application_init( );
for ( ; ; )
{
application_task( );
}
}
// ------------------------------------------------------------------------ END