The MCR20A Wireless UART application functions as an wireless UART bridge between two (one-to-one) or several (one to many) boards. The application can be used with both a TERM, or with software that is capable of opening a serial port and writing to or reading from it. The characters sent or received are not necessarily ASCII printable characters.

Dependencies:   fsl_phy_mcr20a fsl_smac mbed-rtos mbed

Fork of mcr20_wireless_uart by Freescale

By default, the application uses broadcast addresses for OTA communication. This way, the application can be directly downloaded and run without any user intervention. The following use case assumes no changes have been done to the project.

  • Two (or more) MCR20A platforms (plugged into the FRDM-K64F Freescale Freedom Development platform) have to be connected to the PC using the mini/micro-USB cables.
  • The code must be downloaded on the platforms via CMSIS-DAP (or other means).
  • After that, two or more TERM applications must be opened, and the serial ports must be configured with the same baud rate as the one in the project (default baud rate is 115200). Other necessary serial configurations are 8 bit, no parity, and 1 stop bit.
  • To start the setup, each platform must be reset, and one of the (user) push buttons found on the MCR20A platform must be pressed. The user can press any of the non-reset buttons on the FRDM-K64F Freescale Freedom Development platform as well. *This initiates the state machine of the application so user can start.

Documentation

SMAC Demo Applications User Guide

Committer:
sam_grove
Date:
Thu Mar 05 20:35:27 2015 +0000
Revision:
4:d47832caea44
Parent:
RF_Drivers/driverDebug.c@2:3e7685cfb2a7
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 2:3e7685cfb2a7 1 //#include "system_event.h"
sam_grove 2:3e7685cfb2a7 2 //#include <string.h>
sam_grove 2:3e7685cfb2a7 3 //#include "pl_types.h"
sam_grove 2:3e7685cfb2a7 4 //#include "pcer_low_level.h"
sam_grove 2:3e7685cfb2a7 5 //#include "pio_low_level.h"
sam_grove 2:3e7685cfb2a7 6 #include "driverDebug.h"
sam_grove 2:3e7685cfb2a7 7 //#include "uart_low_level.h"
sam_grove 2:3e7685cfb2a7 8 //#include "usart_low_level.h"
sam_grove 2:3e7685cfb2a7 9 //#include "SAMxxBoardDefinitions.h"
sam_grove 2:3e7685cfb2a7 10 //#include "arm_hal_interrupt.h"
sam_grove 2:3e7685cfb2a7 11 #include <stdio.h>
sam_grove 2:3e7685cfb2a7 12
sam_grove 2:3e7685cfb2a7 13 #define debug printf
sam_grove 2:3e7685cfb2a7 14
sam_grove 2:3e7685cfb2a7 15
sam_grove 2:3e7685cfb2a7 16 /**
sam_grove 2:3e7685cfb2a7 17 * Send string to debug port.
sam_grove 2:3e7685cfb2a7 18 *
sam_grove 2:3e7685cfb2a7 19 * \param str String pointer. Have to end by zero ('\0')
sam_grove 2:3e7685cfb2a7 20 *
sam_grove 2:3e7685cfb2a7 21 */
sam_grove 2:3e7685cfb2a7 22 #if 0
sam_grove 2:3e7685cfb2a7 23 void debug_send1(uint8_t *str)
sam_grove 2:3e7685cfb2a7 24 {
sam_grove 2:3e7685cfb2a7 25 while(*str)
sam_grove 2:3e7685cfb2a7 26 {
sam_grove 2:3e7685cfb2a7 27 if (debug_put(*str) == 0)
sam_grove 2:3e7685cfb2a7 28 {
sam_grove 2:3e7685cfb2a7 29 str++;
sam_grove 2:3e7685cfb2a7 30 }
sam_grove 2:3e7685cfb2a7 31 else return;
sam_grove 2:3e7685cfb2a7 32 }
sam_grove 2:3e7685cfb2a7 33 }
sam_grove 2:3e7685cfb2a7 34 #endif
sam_grove 2:3e7685cfb2a7 35
sam_grove 2:3e7685cfb2a7 36 /**
sam_grove 2:3e7685cfb2a7 37 * Send constant string to debug port.
sam_grove 2:3e7685cfb2a7 38 *
sam_grove 2:3e7685cfb2a7 39 * \param str Constant string pointer.
sam_grove 2:3e7685cfb2a7 40 *
sam_grove 2:3e7685cfb2a7 41 */
sam_grove 2:3e7685cfb2a7 42 #if 0
sam_grove 2:3e7685cfb2a7 43 void debug_send_const(prog_uint8_t *str)
sam_grove 2:3e7685cfb2a7 44 {
sam_grove 2:3e7685cfb2a7 45 while(*str)
sam_grove 2:3e7685cfb2a7 46 {
sam_grove 2:3e7685cfb2a7 47 //if (debug_put(*str) == 0)
sam_grove 2:3e7685cfb2a7 48 if (printf(str) == 0)
sam_grove 2:3e7685cfb2a7 49 {
sam_grove 2:3e7685cfb2a7 50 str++;
sam_grove 2:3e7685cfb2a7 51 }
sam_grove 2:3e7685cfb2a7 52 else return;
sam_grove 2:3e7685cfb2a7 53 }
sam_grove 2:3e7685cfb2a7 54 }
sam_grove 2:3e7685cfb2a7 55 #endif
sam_grove 2:3e7685cfb2a7 56
sam_grove 2:3e7685cfb2a7 57 /*
sam_grove 2:3e7685cfb2a7 58 * \brief Help round function.
sam_grove 2:3e7685cfb2a7 59 *
sam_grove 2:3e7685cfb2a7 60 * \param value Divident
sam_grove 2:3e7685cfb2a7 61 * \param divider Divisor
sam_grove 2:3e7685cfb2a7 62 *
sam_grove 2:3e7685cfb2a7 63 * \return Quotient
sam_grove 2:3e7685cfb2a7 64 */
sam_grove 2:3e7685cfb2a7 65 uint32_t debug_round(uint32_t value, uint32_t divider)
sam_grove 2:3e7685cfb2a7 66 {
sam_grove 2:3e7685cfb2a7 67 uint32_t tmp = value;
sam_grove 2:3e7685cfb2a7 68 value *= 10;
sam_grove 2:3e7685cfb2a7 69 value /= divider;
sam_grove 2:3e7685cfb2a7 70 tmp = value;
sam_grove 2:3e7685cfb2a7 71 while(tmp > 10)
sam_grove 2:3e7685cfb2a7 72 tmp -= 10;
sam_grove 2:3e7685cfb2a7 73 if(((tmp & 0x0000000f) > 4) && ((tmp & 0x0000000f) < 10))
sam_grove 2:3e7685cfb2a7 74 value += 10;
sam_grove 2:3e7685cfb2a7 75 if(tmp != 10)
sam_grove 2:3e7685cfb2a7 76 value -= tmp;
sam_grove 2:3e7685cfb2a7 77 value /= 10;
sam_grove 2:3e7685cfb2a7 78 return value;
sam_grove 2:3e7685cfb2a7 79 }
sam_grove 2:3e7685cfb2a7 80
sam_grove 2:3e7685cfb2a7 81 /**
sam_grove 2:3e7685cfb2a7 82 * Print a number to the debug port.
sam_grove 2:3e7685cfb2a7 83 *
sam_grove 2:3e7685cfb2a7 84 * \param width string maximum length
sam_grove 2:3e7685cfb2a7 85 * \param base base number (16 for hex, 10 for decimal etc.)
sam_grove 2:3e7685cfb2a7 86 * \param n number value
sam_grove 2:3e7685cfb2a7 87 *
sam_grove 2:3e7685cfb2a7 88 * \return pointer to the formatted string
sam_grove 2:3e7685cfb2a7 89 */
sam_grove 2:3e7685cfb2a7 90 void debug_integer(uint8_t width, uint8_t base, int16_t n)
sam_grove 2:3e7685cfb2a7 91 {
sam_grove 2:3e7685cfb2a7 92 uint8_t bfr[8];
sam_grove 2:3e7685cfb2a7 93 uint8_t *ptr = bfr;
sam_grove 2:3e7685cfb2a7 94 uint8_t ctr = 0;
sam_grove 2:3e7685cfb2a7 95
sam_grove 2:3e7685cfb2a7 96 if (width > 7) width = 7;
sam_grove 2:3e7685cfb2a7 97
sam_grove 2:3e7685cfb2a7 98 ptr += width;
sam_grove 2:3e7685cfb2a7 99 *ptr-- = 0;
sam_grove 2:3e7685cfb2a7 100
sam_grove 2:3e7685cfb2a7 101 if (base == 16)
sam_grove 2:3e7685cfb2a7 102 {
sam_grove 2:3e7685cfb2a7 103 do
sam_grove 2:3e7685cfb2a7 104 {
sam_grove 2:3e7685cfb2a7 105 *ptr = n & 0x0F;
sam_grove 2:3e7685cfb2a7 106 if (*ptr < 10) *ptr += '0';
sam_grove 2:3e7685cfb2a7 107 else *ptr += ('A'-10);
sam_grove 2:3e7685cfb2a7 108 ptr--;
sam_grove 2:3e7685cfb2a7 109 n >>= 4;
sam_grove 2:3e7685cfb2a7 110 ctr++;
sam_grove 2:3e7685cfb2a7 111 }while((ctr & 1) || (ctr < width));
sam_grove 2:3e7685cfb2a7 112 }
sam_grove 2:3e7685cfb2a7 113 else
sam_grove 2:3e7685cfb2a7 114 {
sam_grove 2:3e7685cfb2a7 115 uint8_t negative = 0;
sam_grove 2:3e7685cfb2a7 116 if (n < 0)
sam_grove 2:3e7685cfb2a7 117 { negative = 1;
sam_grove 2:3e7685cfb2a7 118 n = -n;
sam_grove 2:3e7685cfb2a7 119 }
sam_grove 2:3e7685cfb2a7 120 ctr++;
sam_grove 2:3e7685cfb2a7 121 do
sam_grove 2:3e7685cfb2a7 122 {
sam_grove 2:3e7685cfb2a7 123 *ptr-- = (n % 10) + '0';
sam_grove 2:3e7685cfb2a7 124 n /= 10;
sam_grove 2:3e7685cfb2a7 125 ctr++;
sam_grove 2:3e7685cfb2a7 126 }while ((ctr < width) && n);
sam_grove 2:3e7685cfb2a7 127 if (negative)
sam_grove 2:3e7685cfb2a7 128 {
sam_grove 2:3e7685cfb2a7 129 *ptr-- = '-';
sam_grove 2:3e7685cfb2a7 130 }
sam_grove 2:3e7685cfb2a7 131 else
sam_grove 2:3e7685cfb2a7 132 {
sam_grove 2:3e7685cfb2a7 133 *ptr-- = ' ';
sam_grove 2:3e7685cfb2a7 134 }
sam_grove 2:3e7685cfb2a7 135 }
sam_grove 2:3e7685cfb2a7 136 ptr++;
sam_grove 2:3e7685cfb2a7 137 //debug_send(ptr);
sam_grove 2:3e7685cfb2a7 138 debug(ptr);
sam_grove 2:3e7685cfb2a7 139 }
sam_grove 2:3e7685cfb2a7 140
sam_grove 2:3e7685cfb2a7 141 /**
sam_grove 2:3e7685cfb2a7 142 * Print data array in HEX format. Bytes are separated with colon.
sam_grove 2:3e7685cfb2a7 143 *
sam_grove 2:3e7685cfb2a7 144 * \param ptr Pointer to 8-bit data array.
sam_grove 2:3e7685cfb2a7 145 * \param len Amount of printed bytes
sam_grove 2:3e7685cfb2a7 146 *
sam_grove 2:3e7685cfb2a7 147 */
sam_grove 2:3e7685cfb2a7 148 void printf_array(uint8_t *ptr , uint16_t len)
sam_grove 2:3e7685cfb2a7 149 {
sam_grove 2:3e7685cfb2a7 150 uint16_t i;
sam_grove 2:3e7685cfb2a7 151 for(i=0; i<len; i++)
sam_grove 2:3e7685cfb2a7 152 {
sam_grove 2:3e7685cfb2a7 153 if(i)
sam_grove 2:3e7685cfb2a7 154 {
sam_grove 2:3e7685cfb2a7 155 if(i%16== 0)
sam_grove 2:3e7685cfb2a7 156 {
sam_grove 2:3e7685cfb2a7 157 debug("\r\n");
sam_grove 2:3e7685cfb2a7 158 if(len > 64)
sam_grove 2:3e7685cfb2a7 159 {
sam_grove 2:3e7685cfb2a7 160 uint8_t x =254;
sam_grove 2:3e7685cfb2a7 161 while(x--);
sam_grove 2:3e7685cfb2a7 162 }
sam_grove 2:3e7685cfb2a7 163 }
sam_grove 2:3e7685cfb2a7 164 else
sam_grove 2:3e7685cfb2a7 165 {
sam_grove 2:3e7685cfb2a7 166 debug(":");
sam_grove 2:3e7685cfb2a7 167 }
sam_grove 2:3e7685cfb2a7 168 }
sam_grove 2:3e7685cfb2a7 169 debug_hex(*ptr++);
sam_grove 2:3e7685cfb2a7 170 }
sam_grove 2:3e7685cfb2a7 171 debug("\r\n");
sam_grove 2:3e7685cfb2a7 172 }
sam_grove 2:3e7685cfb2a7 173
sam_grove 2:3e7685cfb2a7 174 /**
sam_grove 2:3e7685cfb2a7 175 * Print a IPv6 address.
sam_grove 2:3e7685cfb2a7 176 *
sam_grove 2:3e7685cfb2a7 177 * \param addr_ptr pointer to ipv6 address
sam_grove 2:3e7685cfb2a7 178 *
sam_grove 2:3e7685cfb2a7 179 */
sam_grove 2:3e7685cfb2a7 180 void printf_ipv6_address(uint8_t *addr_ptr)
sam_grove 2:3e7685cfb2a7 181 {
sam_grove 2:3e7685cfb2a7 182 if(addr_ptr)
sam_grove 2:3e7685cfb2a7 183 {
sam_grove 2:3e7685cfb2a7 184 uint8_t i, d_colon = 0;
sam_grove 2:3e7685cfb2a7 185 uint16_t current_value = 0, last_value = 0;
sam_grove 2:3e7685cfb2a7 186
sam_grove 2:3e7685cfb2a7 187 for(i=0; i< 16;i += 2)
sam_grove 2:3e7685cfb2a7 188 {
sam_grove 2:3e7685cfb2a7 189 current_value = (*addr_ptr++ << 8);
sam_grove 2:3e7685cfb2a7 190 current_value += *addr_ptr++;
sam_grove 2:3e7685cfb2a7 191
sam_grove 2:3e7685cfb2a7 192 if(i == 0)
sam_grove 2:3e7685cfb2a7 193 {
sam_grove 2:3e7685cfb2a7 194 last_value = current_value;
sam_grove 2:3e7685cfb2a7 195 debug_hex(current_value >> 8);
sam_grove 2:3e7685cfb2a7 196 debug_hex(current_value );
sam_grove 2:3e7685cfb2a7 197 debug(":");
sam_grove 2:3e7685cfb2a7 198 }
sam_grove 2:3e7685cfb2a7 199 else
sam_grove 2:3e7685cfb2a7 200 {
sam_grove 2:3e7685cfb2a7 201 if(current_value == 0)
sam_grove 2:3e7685cfb2a7 202 {
sam_grove 2:3e7685cfb2a7 203 if(i== 14)
sam_grove 2:3e7685cfb2a7 204 {
sam_grove 2:3e7685cfb2a7 205 debug(":");
sam_grove 2:3e7685cfb2a7 206 //debug_put('0');
sam_grove 2:3e7685cfb2a7 207 debug("0");
sam_grove 2:3e7685cfb2a7 208 }
sam_grove 2:3e7685cfb2a7 209 else
sam_grove 2:3e7685cfb2a7 210 {
sam_grove 2:3e7685cfb2a7 211 if(last_value == 0)
sam_grove 2:3e7685cfb2a7 212 {
sam_grove 2:3e7685cfb2a7 213 if(d_colon == 0)
sam_grove 2:3e7685cfb2a7 214 {
sam_grove 2:3e7685cfb2a7 215 d_colon=1;
sam_grove 2:3e7685cfb2a7 216 }
sam_grove 2:3e7685cfb2a7 217 }
sam_grove 2:3e7685cfb2a7 218 else
sam_grove 2:3e7685cfb2a7 219 {
sam_grove 2:3e7685cfb2a7 220 if(d_colon == 2)
sam_grove 2:3e7685cfb2a7 221 {
sam_grove 2:3e7685cfb2a7 222 //debug_put('0');
sam_grove 2:3e7685cfb2a7 223 debug("0");
sam_grove 2:3e7685cfb2a7 224 debug(":");
sam_grove 2:3e7685cfb2a7 225 }
sam_grove 2:3e7685cfb2a7 226 }
sam_grove 2:3e7685cfb2a7 227 }
sam_grove 2:3e7685cfb2a7 228 }
sam_grove 2:3e7685cfb2a7 229 else
sam_grove 2:3e7685cfb2a7 230 {
sam_grove 2:3e7685cfb2a7 231 if(last_value == 0)
sam_grove 2:3e7685cfb2a7 232 {
sam_grove 2:3e7685cfb2a7 233 if(d_colon == 1)
sam_grove 2:3e7685cfb2a7 234 {
sam_grove 2:3e7685cfb2a7 235 debug(":");
sam_grove 2:3e7685cfb2a7 236 d_colon = 2;
sam_grove 2:3e7685cfb2a7 237 }
sam_grove 2:3e7685cfb2a7 238 else
sam_grove 2:3e7685cfb2a7 239 {
sam_grove 2:3e7685cfb2a7 240 //debug_put('0');
sam_grove 2:3e7685cfb2a7 241 debug("0");
sam_grove 2:3e7685cfb2a7 242 debug(":");
sam_grove 2:3e7685cfb2a7 243 }
sam_grove 2:3e7685cfb2a7 244 }
sam_grove 2:3e7685cfb2a7 245 if(current_value > 0x00ff)
sam_grove 2:3e7685cfb2a7 246 {
sam_grove 2:3e7685cfb2a7 247 debug_hex(current_value >> 8);
sam_grove 2:3e7685cfb2a7 248 }
sam_grove 2:3e7685cfb2a7 249 debug_hex(current_value );
sam_grove 2:3e7685cfb2a7 250 if(i< 14)
sam_grove 2:3e7685cfb2a7 251 {
sam_grove 2:3e7685cfb2a7 252 debug(":");
sam_grove 2:3e7685cfb2a7 253 }
sam_grove 2:3e7685cfb2a7 254 }
sam_grove 2:3e7685cfb2a7 255 last_value = current_value;
sam_grove 2:3e7685cfb2a7 256 }
sam_grove 2:3e7685cfb2a7 257 }
sam_grove 2:3e7685cfb2a7 258 }
sam_grove 2:3e7685cfb2a7 259 else
sam_grove 2:3e7685cfb2a7 260 {
sam_grove 2:3e7685cfb2a7 261 debug("Address Print: pointer NULL");
sam_grove 2:3e7685cfb2a7 262 }
sam_grove 2:3e7685cfb2a7 263 debug("\r\n");
sam_grove 2:3e7685cfb2a7 264 }
sam_grove 2:3e7685cfb2a7 265