TYBLE16 serial communication (UART) for both "Central" and "Peripheral".

Dependencies:   RingBuffer

Fork of TYBLE16_BME280_data_sender by Kenji Arai

Please refer following page.
/users/kenjiArai/notebook/tyble16-module--uart-communication-between-central/#

Committer:
kenjiArai
Date:
Sun Nov 19 09:46:27 2017 +0000
Revision:
2:f44ef892b2b2
Parent:
1:f2982d4f4037
TYBLE16 serial communication (UART)  for both "Central" and "Peripheral".

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:c3a498a8091c 1 /*
kenjiArai 0:c3a498a8091c 2 * Mbed Application program / Using Akizuki BLE Module AE-TYBLE16
kenjiArai 0:c3a498a8091c 3 * on-board module : TAIYO YUDEN BLE 4.2 TYSA-B (EYSGJNAWY-WX)
kenjiArai 0:c3a498a8091c 4 *
kenjiArai 0:c3a498a8091c 5 * http://akizukidenshi.com/catalog/g/gK-12339/
kenjiArai 0:c3a498a8091c 6 *
kenjiArai 0:c3a498a8091c 7 * Refernce document
kenjiArai 0:c3a498a8091c 8 * https://www.yuden.co.jp/wireless_module/document/datareport2/jp/
kenjiArai 0:c3a498a8091c 9 * TY_BLE_EYSGJNAWY_WX_BriefDataReport_V1_3_20170925J.pdf
kenjiArai 0:c3a498a8091c 10 *
kenjiArai 0:c3a498a8091c 11 * Copyright (c) 2017 Kenji Arai / JH1PJL
kenjiArai 0:c3a498a8091c 12 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:c3a498a8091c 13 * http://mbed.org/users/kenjiArai/
kenjiArai 0:c3a498a8091c 14 * Created: October 27th, 2017
kenjiArai 2:f44ef892b2b2 15 * Revised: November 19th, 2017
kenjiArai 0:c3a498a8091c 16 */
kenjiArai 0:c3a498a8091c 17
kenjiArai 0:c3a498a8091c 18 /*
kenjiArai 0:c3a498a8091c 19 Tested condition
kenjiArai 2:f44ef892b2b2 20 mbed-os-5.6.4 & mbed Rev.157(release 155?)
kenjiArai 2:f44ef892b2b2 21 Nucleo-F446RE TYBLE16 /also F411RE
kenjiArai 2:f44ef892b2b2 22 PA_9 (D8) pin5 / P0.03(UART_RX)
kenjiArai 2:f44ef892b2b2 23 PA_10(D2) pin6 / P0.01(UART_TX)
kenjiArai 2:f44ef892b2b2 24 pin7 / P0.02(UART_CTS) connected to pin8 / P0.00(UART_RTS)
kenjiArai 2:f44ef892b2b2 25 PB_3 (D3) pin15 / P0.23(MODE) Mode indication
kenjiArai 0:c3a498a8091c 26 +3.3v pin14 / +V
kenjiArai 0:c3a498a8091c 27 GND pin13 / GND
kenjiArai 2:f44ef892b2b2 28 */
kenjiArai 2:f44ef892b2b2 29
kenjiArai 2:f44ef892b2b2 30 /*
kenjiArai 2:f44ef892b2b2 31 --- HOW TO ESTABLISH CENTRAL AND PERIPHERAL UART ---
kenjiArai 2:f44ef892b2b2 32 1) Prepare one peripheral module/TYBLE16
kenjiArai 2:f44ef892b2b2 33 2) Prepare another TYBLE16 module which was programed as "Central mode"
kenjiArai 2:f44ef892b2b2 34 Please refer "TYBLE16_set_Central_or_ Peripheral" program
kenjiArai 2:f44ef892b2b2 35 3) Programing "TYBLE16_Uart_Central_and_Peripheral" into Mbed boards
kenjiArai 2:f44ef892b2b2 36 (same program into both "Central" and "Peripheral" Mbed board)
kenjiArai 2:f44ef892b2b2 37 4) If you turn on both the "Central" and "Peripheral" power at the same time,
kenjiArai 2:f44ef892b2b2 38 the connection is automatically started
kenjiArai 0:c3a498a8091c 39 */
kenjiArai 0:c3a498a8091c 40
kenjiArai 0:c3a498a8091c 41 // Include --------------------------------------------------------------------
kenjiArai 2:f44ef892b2b2 42 #include "mbed.h"
kenjiArai 2:f44ef892b2b2 43 #include "RingBuffer.h"
kenjiArai 0:c3a498a8091c 44
kenjiArai 0:c3a498a8091c 45 // Definition -----------------------------------------------------------------
kenjiArai 2:f44ef892b2b2 46 #define TIME_OUT 5 // 5 sec
kenjiArai 2:f44ef892b2b2 47 #define BF_SIZE_BLE 256
kenjiArai 2:f44ef892b2b2 48 #define BF_SIZE_PC 256
kenjiArai 2:f44ef892b2b2 49 #define BF_SIZE_LINE 32
kenjiArai 0:c3a498a8091c 50
kenjiArai 0:c3a498a8091c 51 // Object/ Constructor --------------------------------------------------------
kenjiArai 0:c3a498a8091c 52 Serial pc(USBTX,USBRX);
kenjiArai 2:f44ef892b2b2 53 Serial tyble16(D8, D2);
kenjiArai 2:f44ef892b2b2 54 DigitalIn tyble16_mode(D3);
kenjiArai 2:f44ef892b2b2 55 Ticker t;
kenjiArai 2:f44ef892b2b2 56 RingBuffer ble_bf(BF_SIZE_BLE);
kenjiArai 2:f44ef892b2b2 57 RingBuffer pc_bf(BF_SIZE_PC);
kenjiArai 0:c3a498a8091c 58
kenjiArai 0:c3a498a8091c 59 // RAM ------------------------------------------------------------------------
kenjiArai 0:c3a498a8091c 60
kenjiArai 0:c3a498a8091c 61 // ROM / Constant data --------------------------------------------------------
kenjiArai 0:c3a498a8091c 62
kenjiArai 0:c3a498a8091c 63 // Function prototypes --------------------------------------------------------
kenjiArai 0:c3a498a8091c 64 void check_connection(void);
kenjiArai 2:f44ef892b2b2 65 void excute_command(char *);
kenjiArai 2:f44ef892b2b2 66 void ble_rx(void);
kenjiArai 2:f44ef892b2b2 67 void pc_rx(void);
kenjiArai 0:c3a498a8091c 68
kenjiArai 0:c3a498a8091c 69 //------------------------------------------------------------------------------
kenjiArai 0:c3a498a8091c 70 // Control Program
kenjiArai 0:c3a498a8091c 71 //------------------------------------------------------------------------------
kenjiArai 0:c3a498a8091c 72 int main()
kenjiArai 0:c3a498a8091c 73 {
kenjiArai 2:f44ef892b2b2 74 static char rcv_bf[BF_SIZE_LINE];
kenjiArai 0:c3a498a8091c 75 static uint8_t n = 0;
kenjiArai 0:c3a498a8091c 76 char c = 0;
kenjiArai 0:c3a498a8091c 77
kenjiArai 2:f44ef892b2b2 78 tyble16.attach(&ble_rx, Serial::RxIrq); // Set interrupt handler
kenjiArai 2:f44ef892b2b2 79 pc.attach(&pc_rx, Serial::RxIrq); // Set interrupt handler
kenjiArai 2:f44ef892b2b2 80 pc.printf("\r\nUART/TYBLE16(%s, %s UTC)\r\n", __DATE__, __TIME__);
kenjiArai 2:f44ef892b2b2 81 tyble16.printf("I'm TYBLE16\r\n");
kenjiArai 0:c3a498a8091c 82 t.attach(check_connection, 1);
kenjiArai 0:c3a498a8091c 83 while(true){
kenjiArai 2:f44ef892b2b2 84 while(ble_bf.check() != 0){
kenjiArai 2:f44ef892b2b2 85 //----- receive data -----------------------------------------------
kenjiArai 2:f44ef892b2b2 86 c = ble_bf.read(); // data received
kenjiArai 0:c3a498a8091c 87 pc.putc(c); // show to console
kenjiArai 0:c3a498a8091c 88 rcv_bf[n++] = c; // save int buf
kenjiArai 2:f44ef892b2b2 89 // avoid buffer overflow
kenjiArai 2:f44ef892b2b2 90 if (n >= (BF_SIZE_LINE - 5)){ n = (BF_SIZE_LINE - 5);}
kenjiArai 0:c3a498a8091c 91 if (c == '\n'){ // end one line
kenjiArai 0:c3a498a8091c 92 pc.putc('\r');
kenjiArai 0:c3a498a8091c 93 rcv_bf[n] = 0;
kenjiArai 2:f44ef892b2b2 94 if (n >3){ // command ~?\r\n ?=specified one character
kenjiArai 2:f44ef892b2b2 95 if ((rcv_bf[0] == '~') && (rcv_bf[2] == '\r')){
kenjiArai 2:f44ef892b2b2 96 excute_command(rcv_bf);
kenjiArai 0:c3a498a8091c 97 }
kenjiArai 0:c3a498a8091c 98 }
kenjiArai 0:c3a498a8091c 99 n = 0; // Clear buffer
kenjiArai 0:c3a498a8091c 100 }
kenjiArai 0:c3a498a8091c 101 }
kenjiArai 2:f44ef892b2b2 102 while(pc_bf.check() != 0){
kenjiArai 2:f44ef892b2b2 103 //----- send data --------------------------------------------------
kenjiArai 2:f44ef892b2b2 104 char c = pc_bf.read();
kenjiArai 0:c3a498a8091c 105 tyble16.putc(c);
kenjiArai 0:c3a498a8091c 106 pc.putc(c); // echo back
kenjiArai 0:c3a498a8091c 107 if(c == '\r'){ // if CR then put LF
kenjiArai 0:c3a498a8091c 108 tyble16.putc('\n');
kenjiArai 0:c3a498a8091c 109 pc.putc('\n');
kenjiArai 0:c3a498a8091c 110 }
kenjiArai 0:c3a498a8091c 111 }
kenjiArai 0:c3a498a8091c 112 }
kenjiArai 0:c3a498a8091c 113 }
kenjiArai 0:c3a498a8091c 114
kenjiArai 2:f44ef892b2b2 115 // special command (You can make your own commands)
kenjiArai 2:f44ef892b2b2 116 void excute_command(char *buf)
kenjiArai 0:c3a498a8091c 117 {
kenjiArai 2:f44ef892b2b2 118 char c = buf[1];
kenjiArai 2:f44ef892b2b2 119 switch (c){
kenjiArai 2:f44ef892b2b2 120 case 'x': // corrent -> nothing to do
kenjiArai 2:f44ef892b2b2 121 tyble16.printf("Accept 'x' Command\r\n");
kenjiArai 2:f44ef892b2b2 122 break;
kenjiArai 2:f44ef892b2b2 123 case '?': // Help
kenjiArai 2:f44ef892b2b2 124 tyble16.printf("Command not available\r\n");
kenjiArai 2:f44ef892b2b2 125 tyble16.printf("Please set your own command\r\n");
kenjiArai 2:f44ef892b2b2 126 break;
kenjiArai 2:f44ef892b2b2 127 default: // no available command
kenjiArai 2:f44ef892b2b2 128 tyble16.printf("Command not available\r\n");
kenjiArai 2:f44ef892b2b2 129 break;
kenjiArai 0:c3a498a8091c 130 }
kenjiArai 0:c3a498a8091c 131 }
kenjiArai 0:c3a498a8091c 132
kenjiArai 2:f44ef892b2b2 133 // Interrupt routine / Data from BLE
kenjiArai 2:f44ef892b2b2 134 void ble_rx()
kenjiArai 2:f44ef892b2b2 135 {
kenjiArai 2:f44ef892b2b2 136 ble_bf.save(tyble16.getc()); // BLE RX data save into ring buffer
kenjiArai 2:f44ef892b2b2 137 }
kenjiArai 2:f44ef892b2b2 138
kenjiArai 2:f44ef892b2b2 139 // Interrupt routine / Data from PC
kenjiArai 2:f44ef892b2b2 140 void pc_rx()
kenjiArai 2:f44ef892b2b2 141 {
kenjiArai 2:f44ef892b2b2 142 pc_bf.save(pc.getc()); // PC RX data save into ring buffer
kenjiArai 2:f44ef892b2b2 143 }
kenjiArai 2:f44ef892b2b2 144
kenjiArai 0:c3a498a8091c 145 // Every one second, check communication status
kenjiArai 0:c3a498a8091c 146 void check_connection(void)
kenjiArai 0:c3a498a8091c 147 {
kenjiArai 0:c3a498a8091c 148 static int8_t counter = 0;
kenjiArai 0:c3a498a8091c 149
kenjiArai 2:f44ef892b2b2 150 if (tyble16_mode == 0){ // Not connected
kenjiArai 0:c3a498a8091c 151 if (++counter >= TIME_OUT){
kenjiArai 2:f44ef892b2b2 152 // Software reset
kenjiArai 2:f44ef892b2b2 153 tyble16.puts("BRS\r\n");
kenjiArai 0:c3a498a8091c 154 counter = 0;
kenjiArai 0:c3a498a8091c 155 }
kenjiArai 0:c3a498a8091c 156 } else {
kenjiArai 0:c3a498a8091c 157 counter = 0;
kenjiArai 0:c3a498a8091c 158 }
kenjiArai 0:c3a498a8091c 159 }