5.1.1.5 BLE Transparent UART
This section enables users create a central device and send/receive characters between two connected BLE devices over Microchip proprietary Transparent UART profile. The central and peripheral devices in this tutorial are two WBZ351 devices. The following instructions are applicable for a BLE central device.
Users can choose to either run the precompiled Application Example hex file provided on the WBZ351 Curiosity Board or follow the steps to develop the application from scratch.
It is recommended to follow the examples in sequence to understand the basic concepts before progressing to the advanced topics.
Recommended Readings
-
Getting Started with Application Building Blocks – See Building Block Examples from Related Links.
-
Getting Started with Central Building Blocks – See Central Devices from Related Links.
- See BLE Transparent UART from Related Links.
- See BLE Connection from Related Links.
- See BLE Multilink Transparent UART from Related Links.
-
BLE Software Specification – See MPLAB® Harmony Wireless BLE in Reference Documentation from Related Links.
Hardware Requirement
| S. No. | Tool | Quantity |
|---|---|---|
| 1 | WBZ351 Curiosity Board | 2 |
| 2 | Micro USB cable | 2 |
SDK Setup
Refer to Getting Started with Software Development from Related Links.
Software Requirement
To install Tera Term tool, refer to the Tera Term web page in Reference Documentation from Related Links.
Smartphone Application
None
Programming the Precompiled Hex File or Application Example
Using MPLAB® X IPE:
- Central Device – Import and program the
precompiled hex file:
.<Discover Path>\wireless_apps_pic32cxbz3_wbz35\apps\ble\building_blocks\central\profiles_services\central_trp_uart\hex - Peripheral Device – Import and program
the precompiled hex file:
<Discover Path>\wireless_apps_pic32cxbz3_wbz35\apps\ble\building_blocks\peripheral\profiles_services\peripheral_trp_uart\hex - For detailed steps, refer to
Programming a Device in MPLAB® IPE in Reference
Documentation from Related Links.Note: Ensure to choose the correct Device and Tool information.
Using MPLAB® X IDE:
- Perform the following the steps mentioned in Running a Precompiled Example. For more information, refer to Running a Precompiled Application Example from Related Links.
- Central Device – Open and program the
application
located incentral_trp_uart.X.<Discover Path>\wireless_apps_pic32cxbz3_wbz35\apps\ble\building_blocks\central\profiles_services\central_trp_uart\firmware - Peripheral Device – Open and program the
application
peripheral_trp_uart.Xlocated in.<Discover Path>\wireless_apps_pic32cxbz3_wbz35\apps\ble\building_blocks\peripheral\profiles_services\peripheral_trp_uart\firmware -
For more details on how to find the Discover path, refer to Download Application Example from Discover in Running a Precompiled Application Example from Related Links.
Demo Description
Scanning– At the initiation of the scan process.Connected!– Upon successful connection.Disconnected– When the connection is lost, within a terminal emulator interface.
- Baud Rate/Speed – 115200 (as configured in SERCOM configuration)
- Parity – None
- Data Bits – 8
- Stop Bits – 1
- Flow Control – None
Enter application data in the terminal emulator to send it to the connected peripheral device.
Testing
Users must use another WBZ351 Curiosity Board configured as BLE Transparent UART with External Flash OTA. For more details, refer to the BLE Transparent UART with External Flash OTA from Related Links.
Configure two WBZ351 Curiosity boards as peripheral and central devices to experience the demo.
This section assumes that a user has already programmed the
peripheral_trp_uart and central_trp_uart application on
two WBZ351 Curiosity Boards.
- Board 1 – WBZ351 Curiosity Board programmed with
peripheral_trp_uart.- Open Tera Term and configure as
mentioned below:Terminal Settings
- Baud Rate/Speed – 115200 (as configured in SERCOM configuration)
- Parity – None
- Data Bits – 8
- Stop Bits – 1
- Flow Control – None
Figure 5-40. Board 1 Tera Term Settings - For terminal setup configuration, go to Setup>Terminal.
- For serial port setup and connection, go to Setup>Serial Port.
- Reset the board. Upon reset, the
Advertisingmessage appears on the Tera Term.
- Open Tera Term and configure as
mentioned below:
- Board 2 – WBZ351 Curiosity Board Programmed with
central_trp_uart.- Open TeraTerm and configure as
mentioned below:Terminal Settings
- Baud Rate/Speed – 115200 (as configured in SERCOM configuration)
- Parity – None
- Data Bits – 8
- Stop Bits – 1
- Flow Control – None
Figure 5-41. Board 2 Tera Term Settings - For terminal setup configuration, go to Setup>Terminal.
- For serial port setup and connection, go to Setup>Serial Port.
- Reset the board. Upon reset, the
Scanningmessage appears on the Tera Term. - Upon finding peripheral device with
public address {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6} message
Found Peer Nodewill be displayed and a connection request will be initiatedInitiating Connection.
- Open TeraTerm and configure as
mentioned below:
Connected! message on respective terminal windows.Developing the Application from Scratch using MCC
- Create a new harmony project. For more details, see Creating a New MCC Harmony Project from Related Links.
- Import Component Configuration
- This step helps users to setup the
basic components and configuration required to develop this application. The imported
file is of format
.mc4and is located in the path.<Discover Path>\wireless_apps_pic32cxbz3_wbz35\apps\ble\building_blocks\central\profiles_services\central_trp_uart\firmware\central_trp_uart.X. - For more details on importing the component configuration, refer to Importing Existing App Example Configuration .
Note: Import and export functionality of component configuration helps users to start from a known working setup of MCC configuration. - This step helps users to setup the
basic components and configuration required to develop this application. The imported
file is of format
- Accept Dependencies or Satisfiers
- If prompted to resolve dependencies or add required modules. Click Yes.
- MPLAB® MCC automatically adds any required drivers or middleware.
- Verify Project GraphIn Project Graph window, confirm that all expected components are present. For more details, see the following figure.
Figure 5-44. Project Graph
Verifying Scan and Connection Configuration
- Open the Project Graph
- In MPLAB® X IDE, with MCC open, locate the Project Graph tab. In the Project Graph tab, the user can see all the components and their relationships to the project.
- Select the BLE Stack Component
- Click on the BLE Stack component in project graph. This opens the “BLE Stack” component Configuration Options tab.
- In the “BLE Stack” Configuration
Options tab, the user can set the parameters as per the requirement as
illustrated in the following figure.
Figure 5-45. BLE Stack Configuration
- Click Transparent Profile
component in the project graph. This opens the “Transparent Profile” component
Configuration Options tab.
- Check Enable Client Role.
Figure 5-46. Transparent Profile Configuration
Generating Code
For more details on code generation, refer to MPLAB Code Configurator (MCC) Code Generation from Related Links.
Files and Routines Automatically generated by the MCC
initialization.capp_ble.c| Source Files | Usage |
|---|---|
app.c | Application State machine, includes calls for Initialization of all BLE stack (GAP,GATT, SMP and L2CAP) related component configurations |
|
| Source Code for the BLE stack related component configurations, code related
to function calls from app.c |
app_ble\app_ble_handler.c | All GAP, GATT, SMP and L2CAP Event handlers |
app_ble\app_trspc_handler.c | All Transparent UART Client related Event handlers |
ble_trspc.c | All Transparent Client Functions for user application |
|
Note:
app.c is autogenerated and has a state machine based
Application code sample. The users can use this template to develop their
application. | |
ble_gap.h: This header file contains BLE GAP functions and is automatically included in theapp.cfile.ble_trspc.h: This header file associated with API’s and structures related to BLE Transparent Client functions for application user.
- MCC generates and adds the code to
initialize the BLE Stack GAP, GATT, L2CAP and SMP in
APP_BleStackInit()function. APP_BleStackInit()is the API that will be called inside the application’s Initial stateAPP_STATE_INITinapp.c.
User Application Development
- Include
- Include the user action. For more information, refer to User Action from Related Links.
- The user must include the header
file
ble_trspc.hinapp.c, BLE Transparent UART Server related API’s are available in this file. - The user must include the header
file
osal/osal_freertos_extend.hinapp_trsps_handler.c, OSAL related API’s are available in this file. definitions.hin all the files where UART will be used to print debug information.Note:definitions.his not specific to just UART peripheral, instead it must be included in all application source files where peripheral functionality will be exercised.
- Start
Scanning
// Scanning Enabled BLE_GAP_SetScanningEnable(true, BLE_GAP_SCAN_FD_ENABLE, BLE_GAP_SCAN_MODE_OBSERVER, 1000); // Output the state string to UART SERCOM0_USART_Write((uint8_t *)"Scanning \r\n", 11);
Figure 5-51. Start Scanning - This API is called in the
application’s initial state,
APP_STATE_INIT, inapp.c. The scan duration is 100 seconds.
- This API is called in the
application’s initial state,
- Scan Results and initiating a BLE
Connection
BLE_GAP_EVT_ADV_REPORTevent is generated upon finding Advertisements on legacy channels.- The user can initiate a BLE
connection by using the
BLE_GAP_CreateConnection(&createConnParam_t;API.
// code snippet to filter scan results and initiate connection if (p_event->eventField.evtAdvReport.addr.addr[0] == 0xA1 && p_event->eventField.evtAdvReport.addr.addr[1] == 0xA2) { SERCOM0_USART_Write((uint8_t *)"Found Peer Node\r\n", 17); BLE_GAP_CreateConnParams_T createConnParam_t; createConnParam_t.scanInterval = 0x3C; // 37.5 ms createConnParam_t.scanWindow = 0x1E; // 18.75 ms createConnParam_t.filterPolicy = BLE_GAP_SCAN_FP_ACCEPT_ALL; createConnParam_t.peerAddr.addrType = p_event->eventField.evtAdvReport.addr.addrType; memcpy(createConnParam_t.peerAddr.addr, p_event->eventField.evtAdvReport.addr.addr, GAP_MAX_BD_ADDRESS_LEN); createConnParam_t.connParams.intervalMin = 0x10; // 20ms createConnParam_t.connParams.intervalMax = 0x10; // 20ms createConnParam_t.connParams.latency = 0; createConnParam_t.connParams.supervisionTimeout = 0x48; // 720ms SERCOM0_USART_Write((uint8_t *)"Initiating Connection\r\n", 23); BLE_GAP_CreateConnection(&createConnParam_t); }
Figure 5-52. app_ble_handler.c - Connected and Disconnected
Events
- In
app_ble_handler.c "BLE_GAP_EVT_CONNECTED"event will be generated when a BLE connection is completed
- In
- Connection Handler
- The user needs to save the connection handle associated with the peer peripheral device for data exchange after a BLE connection.
- This information is available in
the
p_event->eventField.evtConnect.connHandle.// Global variable extern uint16_t conn_hdl; // Connected event SERCOM0_USART_Write((uint8_t *)"Connected\r\n", 11); conn_hdl = p_event->eventField.evtConnect.connHandle; // Disconnected event SERCOM0_USART_Write((uint8_t *)"Disconnected\r\n", 14);
Figure 5-53. app_ble_handler.c
- Scan Timeout Event
- In
app_ble_handler.cBLE_GAP_EVT_SCAN_TIMEOUTevent is generated when BLE Scan duration expires.
SERCOM0_USART_Write((uint8_t *)"Scan Completed! \r\n", 18);
Figure 5-54. Scan Timeout Event - In
- Scan Timeout Event
- In
app_ble_handler.cBLE_GAP_EVT_SCAN_TIMEOUTevent is generated when BLE Scan duration expires.
SERCOM0_USART_Write((uint8_t *)"Scan Completed! \r\n", 18);Figure 5-55. Scan Timeout Event - In
- Transmit Data
- Add
APP_MSG_UART_CBto the generatedAPP_MsgId_Tinapp.h.Figure 5-56. Transmit Data - Use the
BLE_TRSPC_SendData(conn_hdl , 1, &data);API for sending data towards the central device.Note: The precompiled application example uses a UART callback to initiate the data transmission upon receiving a character on UART.
Here is an example implementation for transmitting the received data over UART using the
BLE_TRSPC_SendDataAPI.uint16_t conn_hdl;// connection handle info captured @BLE_GAP_EVT_CONNECTED event uint8_t uart_data; void uart_cb(SERCOM_USART_EVENT event, uintptr_t context) { APP_Msg_T appMsg; // If RX data from UART reached threshold (previously set to 1) if( event == SERCOM_USART_EVENT_READ_THRESHOLD_REACHED ) { // Read 1 byte data from UART SERCOM0_USART_Read(&uart_data, 1); appMsg.msgId = APP_MSG_UART_CB; OSAL_QUEUE_Send(&appData.appQueue, &appMsg, 0); } } void APP_UartCBHandler() { // Send the data from UART to connected device through Transparent service BLE_TRSPC_SendData(conn_hdl, 1, &uart_data); } //////////////////////////////////////////////////////////////////////////////////// // Register call back when data is available on UART for Peripheral Device to send // Enable UART Read SERCOM0_USART_ReadNotificationEnable(true, true); // Set UART RX notification threshold to be 1 SERCOM0_USART_ReadThresholdSet(1); // Register the UART RX callback function SERCOM0_USART_ReadCallbackRegister(uart_cb, (uintptr_t)NULL); //////////////////////////////////////////////////////////////////////////////////// //If msg received in Queue, handle the Queue message based on msgID if (OSAL_QUEUE_Receive(&appData.appQueue, &appMsg, OSAL_WAIT_FOREVER)) { if(p_appMsg->msgId==APP_MSG_BLE_STACK_EVT) { // Pass BLE Stack Event Message to User Application for handling APP_BleStackEvtHandler((STACK_Event_T *)p_appMsg->msgData); } else if(p_appMsg->msgId==APP_MSG_BLE_STACK_LOG) { // Pass BLE LOG Event Message to User Application for handling APP_BleStackLogHandler((BT_SYS_LogEvent_T *)p_appMsg->msgData); } else if(p_appMsg->msgId==APP_MSG_UART_CB) { // Transparent UART Client Data transfer Event APP_UartCBHandler(); } }
Figure 5-57. app.cFigure 5-58. app.cFigure 5-59. app.c - Add
- Receive Data
- The system generates the
BLE_TRSPC_EVT_RECEIVE_DATAevent when the central device sends data. - Users need to use the
BLE_TRSPC_GetDataLength(&data_len)API to extract the length of application data received. - To retrieve the data, use the
BLE_TRSPC_GetData(&conn_hdl, data);API, whereconn_hdlis the value obtained from the Connection Handler section.
Note:BLE_TRSPC_Event_T p_eventstructure stores the information about BLE transparent UART callback functions.Example Implementation for printing the received data from peripheral device over UART
/* TODO: implement your application code.*/ uint16_t data_len; uint8_t *data; // Retrieve received data length BLE_TRSPC_GetDataLength(p_event->eventField.onReceiveData.connHandle, &data_len); // Allocate memory according to data length data = OSAL_Malloc(data_len); if(data == NULL) break; // Retrieve received data BLE_TRSPC_GetData(p_event->eventField.onReceiveData.connHandle, data); // Output received data to UART SERCOM0_USART_Write(data, data_len); // Free memory OSAL_Free(data);Figure 5-60. app_trspc_handler.c - The system generates the
The users can exercise various other BLE Advertisement functionalities. For more information, refer to MPLAB Harmony Wireless BLE in Reference Documentation from Related Links.
Next Steps
See BLE Multilink Transparent UART from Related Links.
