蓝牙 BR/EDR 和 BLE 连接非常适合用于替代电缆、智能家居系统和工业自动化
A
A
硬件概览
它是如何工作的?
BT122-A Click 基于 Silicon Labs 的 BT122-A 双模蓝牙模块,支持 Bluetooth BR/EDR 和 BLE v4.2 标准。此模块专为需要蓝牙低功耗和经典蓝牙连接的应用而设计,既支持与采用 Bluetooth SPP 或 Apple® iAP2 协议的传统设备通信,也兼容使用蓝牙低功耗协议的现代设备。BT122-A 集成了强大的蓝牙无线电,具备高达 +11dBm 的发射功率和 -95dBm 的接收灵敏度,确保在长距离范围内实现可靠通信。模块内置天线,由低功耗 32 位 ARM Cortex-M4 微控制器驱动,结合 Silicon Labs 的双模协议栈软件,提供出色的处理效率和高级连接能力。BT122-A 可作为独立调制解
调器,通过外部主 MCU 控制,或作为独立应用处理器运行。对于独立运行,开发者可使用模块集成的 ARM Cortex-M4 MCU,并通过 Silicon Labs 的 BGScript™ 脚本语言嵌入应用程序。这种灵活性使模块适用于广泛的使用场景,无论是电缆替代、HID 设备,还是健康和健身监控、工业自动化、M2M 连接或家居自动化网关等高级应用,BT122-A Click 都能满足多样化的需求。该 Click 板通过 UART 接口在 BT122-A 模块与主 MCU 之间建立通信,使用标准 UART RX 和 TX 引脚,并通过 CTS 和 RTS 引脚提供硬件流控制。默认通信速度为 115200bps,确保高
效数据交换。主 MCU 使用高级 AT 命令来配置通信和其他功能,无需深入了解蓝牙协议即可轻松管理。此外,Click 板还提供了 I2C 接口,支持最高 1MHz 的时钟速度。除了接口引脚外,板上还设有一个复位(RST)引脚,用于必要时对模块进行硬复位,并包含用于 MIKROE 的 6 针针式电缆的 SWD 焊盘,支持可选的闪存编程和调试功能。此 Click 板仅支持 3.3V 逻辑电压。如果使用不同逻辑电平的 MCU,需进行适当的逻辑电压转换。此外,它还配备了包含函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
EasyPIC v8 是一款专为快速开发嵌入式应用的需求而特别设计的开发板。它支持许多高引脚计数的8位PIC微控制器,来自Microchip,无论它们的引脚数量如何,并且具有一系列独特功能,例如首次集成的调试器/程序员。开发板布局合理,设计周到,使得最终用户可以在一个地方找到所有必要的元素,如开关、按钮、指示灯、连接器等。得益于创新的制造技术,EasyPIC v8 提供了流畅而沉浸式的工作体验,允许在任何情况下、任何地方、任何时候都能访问。
EasyPIC v8 开发板的每个部分都包含了使同一板块运行最高效的必要组件。除了先进的集成CODEGRIP程 序/调试模块,该模块提供许多有价值的编程/调试选项和与Mikroe软件环境的无缝集成外,该板还包括一个干净且调节过的开发板电源供应模块。它可以使用广泛的外部电源,包括电池、外部12V电源供应和通过USB Type-C(USB-C)连接器的电源。通信选项如USB-UART、USB DEVICE和CAN也包括在内,包括 广受好评的mikroBUS™标准、两种显示选项(图形和
基于字符的LCD)和几种不同的DIP插座。这些插座覆盖了从最小的只有八个至四十个引脚的8位PIC MCU的广泛范围。EasyPIC v8 是Mikroe快速开发生态系统的一个组成部分。它由Mikroe软件工具原生支持,得益于大量不同的Click板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作和开发的许多方面。
微控制器概述
MCU卡片 / MCU

建筑
PIC
MCU 内存 (KB)
128
硅供应商
Microchip
引脚数
40
RAM (字节)
8192
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
软件支持
库描述
BT122-A Click 演示应用程序使用 NECTO Studio开发,确保与 mikroSDK 的开源库和工具兼容。该演示设计为即插即用,可与所有具有 mikroBUS™ 插座的 开发板、入门板和 mikromedia 板完全兼容,用于快速实现和测试。
示例描述
此示例演示如何通过处理来自连接的蓝牙设备的数据来使用 BT122-A Click 板。
关键功能:
bt122a_cfg_setup- 配置对象初始化函数bt122a_init- 初始化函数。bt122a_set_local_name- 设置设备本地名称的函数bt122a_send_package- 向 Click 板发送数据包的函数。bt122a_read_package- 等待命令或事件类型的消息到达,然后读取完整消息并存储到 pkg 结构中的函数。
应用初始化
初始化驱动程序并配置 Click 板。
应用任务
处理本示例所需的大部分事件,不支持的事件包将直接显示在 USB UART 上。事件处理程序会将从远程设备接收到的所有消息显示在 USB UART 上,并将相同的消息回显到连接的设备。
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief BT122-A Click Example.
*
* # Description
* This example demonstrates the use of BT122-A Click board by processing data
* from a connected BT device.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initializes the driver and configures the Click board.
*
* ## Application Task
* Handles most of the events required for this example, the packages of events not
* supported in this example will just be displayed on the USB UART.
* The event handler will display all messages received from the remote device on
* the USB UART and echo the same message to the connected device.
*
* ## Additional Function
* - static void bt122a_check_response ( err_t error_flag )
* - static void bt122a_event_handler ( bt122a_t *ctx )
*
* @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 Stefan Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "bt122a.h"
// Local device name.
#define DEVICE_NAME "BT122-A Click"
static bt122a_t bt122a;
static log_t logger;
err_t error_flag = BT122A_OK;
/**
* @brief BT122A check response function.
* @details This function checks the error flag and logs OK or FAIL message on USB UART.
* @param[in] error_flag : Function error flag.
* @return None.
* @note None.
*/
static void bt122a_check_response ( err_t error_flag );
/**
* @brief BT122A event handler function.
* @details This function handles most of the events required for this example.
* @param[in] ctx : Click context object.
* See #bt122a_t object definition for detailed explanation.
* @return None.
* @note The Click board must be configured and the remote device must be connected to it.
*/
static void bt122a_event_handler ( bt122a_t *ctx );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
bt122a_cfg_t bt122a_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.
bt122a_cfg_setup( &bt122a_cfg );
BT122A_MAP_MIKROBUS( bt122a_cfg, MIKROBUS_1 );
if ( UART_ERROR == bt122a_init( &bt122a, &bt122a_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
log_printf( &logger, ">>> Set Local Name to \"%s\"\r\n", ( char * ) DEVICE_NAME );
error_flag = bt122a_set_local_name ( &bt122a, DEVICE_NAME );
bt122a_check_response ( error_flag );
log_printf( &logger, ">>> Delete Bondings\r\n" );
error_flag = bt122a_delete_bondings ( &bt122a );
bt122a_check_response ( error_flag );
log_printf( &logger, ">>> Set Bondable Mode\r\n" );
error_flag = bt122a_set_bondable_mode ( &bt122a, BT122A_SM_SET_BONDABLE_ALLOWED );
bt122a_check_response ( error_flag );
log_printf( &logger, ">>> Set GAP Mode\r\n" );
error_flag = bt122a_set_gap_mode ( &bt122a, BT122A_GAP_MODE_CONNECTABLE,
BT122A_GAP_MODE_DISCOVERABLE,
BT122A_GAP_MODE_NOT_LIMITED );
bt122a_check_response ( error_flag );
log_printf( &logger, ">>> RFCOMM Start Server\r\n" );
error_flag = bt122a_rfcomm_start_server ( &bt122a, BT122A_RFCOMM_SERVER_DEF_SDP_ID,
BT122A_RFCOMM_SERVER_DEF_STREAM_DEST );
bt122a_check_response ( error_flag );
log_info( &logger, " Application Task " );
}
void application_task ( void )
{
bt122a_event_handler( &bt122a );
}
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 void bt122a_check_response ( err_t error_flag )
{
log_printf( &logger, "<<< %s\r\n\n", ( char * )
( ( BT122A_OK == error_flag ) ? "OK" : "FAIL" ) );
}
static void bt122a_event_handler ( bt122a_t *ctx )
{
bt122a_package_t pkg;
uint8_t byte_cnt = 0;
if ( BT122A_OK != bt122a_read_package ( ctx, &pkg ) )
{
return;
}
if ( BT122A_MSG_TYPE_EVENT != pkg.msg_type )
{
log_printf( &logger, "<<< Unknown Message Type: 0x%.2X\r\n\n", ( uint16_t ) pkg.msg_type );
return;
}
switch ( pkg.msg_class )
{
case BT122A_MSG_CLASS_ENDPOINT:
{
if ( BT122A_MSG_ID_EVT_ENDPOINT_DATA == pkg.msg_id )
{
log_printf( &logger, "<<< The endpoint 0x%.2X received data: ",
( uint16_t ) pkg.payload[ 0 ] );
for ( byte_cnt = 0; byte_cnt < pkg.payload[ 1 ]; byte_cnt++ )
{
log_printf( &logger, "%c", pkg.payload[ byte_cnt + 2 ] );
}
pkg.payload[ pkg.payload[ 1 ] + 2 ] = 0;
log_printf( &logger, "\r\n>>> Echo back the received message\r\n" );
error_flag = bt122a_endpoint_send_data ( &bt122a, &pkg.payload[ 0 ], &pkg.payload[ 2 ] );
bt122a_check_response ( error_flag );
}
break;
}
case BT122A_MSG_CLASS_CONNECTION:
{
if ( BT122A_MSG_ID_EVT_CONNECTION_OPENED == pkg.msg_id )
{
log_printf( &logger, "<<< Connection 0x%.2X: OPENED\r\n", ( uint16_t ) pkg.payload[ 7 ] );
log_printf( &logger, " Address of remote device: " );
log_printf( &logger, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\r\n", ( uint16_t ) pkg.payload[ 5 ],
( uint16_t ) pkg.payload[ 4 ],
( uint16_t ) pkg.payload[ 3 ],
( uint16_t ) pkg.payload[ 2 ],
( uint16_t ) pkg.payload[ 1 ],
( uint16_t ) pkg.payload[ 0 ] );
log_printf( &logger, " Role of the local device : %s\r\n", ( char * )
( 0 == pkg.payload[ 6 ] ? "Peripheral" : "Central" ) );
log_printf( &logger, " Bonded : %s\r\n\n",
( 0xFF == pkg.payload[ 8 ] ) ? "NO" : "YES" );
}
else if ( BT122A_MSG_ID_EVT_CONNECTION_CLOSED == pkg.msg_id )
{
log_printf( &logger, "<<< Connection 0x%.2X: CLOSED\r\n\n", ( uint16_t ) pkg.payload[ 2 ] );
}
break;
}
case BT122A_MSG_CLASS_SM:
{
if ( BT122A_MSG_ID_EVT_SM_BONDED == pkg.msg_id )
{
log_printf( &logger, "<<< Connection 0x%.2X: %s\r\n\n",
( uint16_t ) pkg.payload[ 0 ], ( char * )
( 0xFF != pkg.payload[ 1 ] ? "BONDED" : "NOT BONDED" ) );
}
break;
}
case BT122A_MSG_CLASS_RFCOMM:
{
if ( BT122A_MSG_ID_EVT_RFCOMM_OPENED == pkg.msg_id )
{
log_printf( &logger, "<<< RFCOMM connection 0x%.2X: OPENED\r\n", ( uint16_t ) pkg.payload[ 0 ] );
log_printf( &logger, " Address of remote device: " );
log_printf( &logger, "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\r\n\n", ( uint16_t ) pkg.payload[ 6 ],
( uint16_t ) pkg.payload[ 5 ],
( uint16_t ) pkg.payload[ 4 ],
( uint16_t ) pkg.payload[ 3 ],
( uint16_t ) pkg.payload[ 2 ],
( uint16_t ) pkg.payload[ 1 ] );
}
else if ( BT122A_MSG_ID_EVT_RFCOMM_MODEM_STATUS == pkg.msg_id )
{
log_printf( &logger, "<<< RFCOMM connection 0x%.2X status: 0x%.2X\r\n\n",
( uint16_t ) pkg.payload[ 0 ],
( uint16_t ) pkg.payload[ 1 ] );
}
break;
}
default:
{
log_printf( &logger, "<<< Message Type: 0x%.2X\r\n", ( uint16_t ) pkg.msg_type );
log_printf( &logger, " Payload len: 0x%.2X\r\n", ( uint16_t ) pkg.payload_len );
log_printf( &logger, " Message Class: 0x%.2X\r\n", ( uint16_t ) pkg.msg_class );
log_printf( &logger, " Message ID: 0x%.2X\r\n", ( uint16_t ) pkg.msg_id );
if ( pkg.payload_len > 0 )
{
log_printf( &logger, " Payload: " );
for ( uint8_t cnt = 0; cnt < pkg.payload_len; cnt++ )
{
log_printf( &logger, " 0x%.2X ", ( uint16_t ) pkg.payload[ cnt ] );
}
log_printf( &logger, "\r\n\n" );
}
break;
}
}
}
// ------------------------------------------------------------------------ END
额外支持
资源
类别:蓝牙/蓝牙低功耗

































