point-2-point demo

Dependencies:   sx12xx_hal

radio chip selection

Radio chip driver is not included, because these options are available.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

TX trigger selection

Edit main.h to define DIGITAL_TRIGGER or ANALOG_TRIGGER to chose whether transmit is initiated by digital pin (button/jumper) or analog pin(s) level change.

This project is intended to be used on two LoRa shields.

Each board sits in continuous RX mode, waiting for request packet.
If the received packet has good CRC, the packet is acknowledged along with read of ADC sample from the replying device.
The original request packet also contains instruction to set level of output pin.

Both sides of the link are running the same code, and each can initiate a transmission at any time.
No addressing is used, so only two nodes can operate on the radio channel.

Committer:
Wayne Roberts
Date:
Wed May 30 10:20:36 2018 -0700
Revision:
3:cd312fc32558
Parent:
2:5131512b4eb9
Child:
4:b5dd459ac390
add tx trigger on analog input change

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:1d8d218c5cc5 1 #include "sx127x_lora.h"
dudmuck 1:d95d135a4fb4 2 #include "uart_cmds.h"
dudmuck 0:1d8d218c5cc5 3
Wayne Roberts 3:cd312fc32558 4 //#define ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 5
dudmuck 0:1d8d218c5cc5 6 DigitalOut myled(LED1);
dudmuck 0:1d8d218c5cc5 7
dudmuck 0:1d8d218c5cc5 8 SPI spi(D11, D12, D13); // mosi, miso, sclk
dudmuck 0:1d8d218c5cc5 9 // dio0, dio1, nss, spi, rst
dudmuck 0:1d8d218c5cc5 10 SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield
dudmuck 0:1d8d218c5cc5 11
dudmuck 0:1d8d218c5cc5 12 SX127x_lora lora(radio);
dudmuck 0:1d8d218c5cc5 13 DigitalInOut rfsw(A4); // for SX1276 arduino shield
dudmuck 0:1d8d218c5cc5 14
dudmuck 0:1d8d218c5cc5 15 InterruptIn user_button(USER_BUTTON);
dudmuck 0:1d8d218c5cc5 16 Timer t;
dudmuck 0:1d8d218c5cc5 17 Ticker ticker;
dudmuck 0:1d8d218c5cc5 18 AnalogIn a1(A1);
Wayne Roberts 3:cd312fc32558 19 #define AIN_REST_THRESHOLD 96 // 12bit left justified
dudmuck 0:1d8d218c5cc5 20 DigitalOut pc6_out(PC_6);
dudmuck 0:1d8d218c5cc5 21
Wayne Roberts 3:cd312fc32558 22 #ifndef ANALOG_TX_TRIGGER
dudmuck 0:1d8d218c5cc5 23 DigitalOut jumper_out(PC_10);
dudmuck 0:1d8d218c5cc5 24 InterruptIn jumper_in(PC_12);
Wayne Roberts 3:cd312fc32558 25 volatile bool start_tx;
Wayne Roberts 3:cd312fc32558 26 #endif /* !ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 27
dudmuck 0:1d8d218c5cc5 28 void rfsw_callback()
dudmuck 0:1d8d218c5cc5 29 {
dudmuck 0:1d8d218c5cc5 30 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
dudmuck 0:1d8d218c5cc5 31 rfsw = 1;
dudmuck 0:1d8d218c5cc5 32 else
dudmuck 0:1d8d218c5cc5 33 rfsw = 0;
dudmuck 0:1d8d218c5cc5 34 }
dudmuck 0:1d8d218c5cc5 35
dudmuck 0:1d8d218c5cc5 36 /**********************************************************************/
dudmuck 0:1d8d218c5cc5 37
dudmuck 0:1d8d218c5cc5 38 uint8_t out_pin_state;
dudmuck 0:1d8d218c5cc5 39
dudmuck 0:1d8d218c5cc5 40
dudmuck 0:1d8d218c5cc5 41 static uint16_t crc16( uint8_t *buffer, uint16_t length )
dudmuck 0:1d8d218c5cc5 42 {
dudmuck 0:1d8d218c5cc5 43 uint16_t i;
dudmuck 0:1d8d218c5cc5 44 // The CRC calculation follows CCITT
dudmuck 0:1d8d218c5cc5 45 const uint16_t polynom = 0x1021;
dudmuck 0:1d8d218c5cc5 46 // CRC initial value
dudmuck 0:1d8d218c5cc5 47 uint16_t crc = 0x0000;
dudmuck 0:1d8d218c5cc5 48
dudmuck 0:1d8d218c5cc5 49 if( buffer == NULL )
dudmuck 0:1d8d218c5cc5 50 {
dudmuck 0:1d8d218c5cc5 51 return 0;
dudmuck 0:1d8d218c5cc5 52 }
dudmuck 0:1d8d218c5cc5 53
dudmuck 0:1d8d218c5cc5 54 for( i = 0; i < length; ++i )
dudmuck 0:1d8d218c5cc5 55 {
dudmuck 0:1d8d218c5cc5 56 uint16_t j;
dudmuck 0:1d8d218c5cc5 57 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:1d8d218c5cc5 58 for( j = 0; j < 8; ++j )
dudmuck 0:1d8d218c5cc5 59 {
dudmuck 0:1d8d218c5cc5 60 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:1d8d218c5cc5 61 }
dudmuck 0:1d8d218c5cc5 62 }
dudmuck 0:1d8d218c5cc5 63
dudmuck 0:1d8d218c5cc5 64 return crc;
dudmuck 0:1d8d218c5cc5 65 }
dudmuck 0:1d8d218c5cc5 66
dudmuck 0:1d8d218c5cc5 67 void tx_ack()
dudmuck 0:1d8d218c5cc5 68 {
dudmuck 0:1d8d218c5cc5 69 uint8_t n = 0;
dudmuck 0:1d8d218c5cc5 70 uint16_t crc;
dudmuck 0:1d8d218c5cc5 71
dudmuck 0:1d8d218c5cc5 72 if (radio.rx_buf[0] == CMD_OUT_PIN) {
dudmuck 0:1d8d218c5cc5 73 uint16_t ain = a1.read_u16();
dudmuck 0:1d8d218c5cc5 74 radio.tx_buf[n++] = CMD_OUT_PIN_ACK;
dudmuck 0:1d8d218c5cc5 75 /* TODO read analog pin and digital input pin */
dudmuck 0:1d8d218c5cc5 76 radio.tx_buf[n++] = ain;
dudmuck 0:1d8d218c5cc5 77 radio.tx_buf[n++] = ain >> 8;
dudmuck 0:1d8d218c5cc5 78 } else
dudmuck 0:1d8d218c5cc5 79 radio.tx_buf[n++] = 0xff;
dudmuck 0:1d8d218c5cc5 80
dudmuck 0:1d8d218c5cc5 81 crc = crc16(radio.tx_buf, n);
dudmuck 0:1d8d218c5cc5 82 radio.tx_buf[n++] = crc;
dudmuck 0:1d8d218c5cc5 83 radio.tx_buf[n++] = crc >> 8;
dudmuck 0:1d8d218c5cc5 84
dudmuck 0:1d8d218c5cc5 85 lora.RegPayloadLength = n;
dudmuck 0:1d8d218c5cc5 86 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 0:1d8d218c5cc5 87
dudmuck 0:1d8d218c5cc5 88 lora.start_tx(lora.RegPayloadLength); /* begin transmission */
dudmuck 0:1d8d218c5cc5 89
dudmuck 0:1d8d218c5cc5 90 while (lora.service() != SERVICE_TX_DONE) /* wait for transmission to complete */
dudmuck 0:1d8d218c5cc5 91 ;
dudmuck 0:1d8d218c5cc5 92
dudmuck 0:1d8d218c5cc5 93 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:1d8d218c5cc5 94 }
dudmuck 0:1d8d218c5cc5 95
dudmuck 1:d95d135a4fb4 96 void radio_tx(uint8_t* payload, uint8_t payload_len)
dudmuck 0:1d8d218c5cc5 97 {
dudmuck 0:1d8d218c5cc5 98 int i;
dudmuck 1:d95d135a4fb4 99 uint8_t n = 0;
dudmuck 1:d95d135a4fb4 100 uint16_t crc;
dudmuck 1:d95d135a4fb4 101
dudmuck 1:d95d135a4fb4 102 while (payload_len > 0) {
dudmuck 1:d95d135a4fb4 103 //printf("n%u, paylen%u\r\n", n, payload_len);
dudmuck 1:d95d135a4fb4 104 payload_len--;
dudmuck 1:d95d135a4fb4 105 radio.tx_buf[payload_len] = payload[payload_len];
dudmuck 1:d95d135a4fb4 106 n++;
dudmuck 1:d95d135a4fb4 107 }
dudmuck 1:d95d135a4fb4 108
dudmuck 1:d95d135a4fb4 109 crc = crc16(radio.tx_buf, n);
dudmuck 1:d95d135a4fb4 110 radio.tx_buf[n++] = crc;
dudmuck 1:d95d135a4fb4 111 radio.tx_buf[n++] = crc >> 8;
dudmuck 1:d95d135a4fb4 112
dudmuck 1:d95d135a4fb4 113 lora.RegPayloadLength = n;
dudmuck 1:d95d135a4fb4 114 radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
dudmuck 0:1d8d218c5cc5 115
dudmuck 0:1d8d218c5cc5 116 for (i = 0; i < 3; i++) {
dudmuck 0:1d8d218c5cc5 117 int rx_timeout_at;
dudmuck 0:1d8d218c5cc5 118
dudmuck 0:1d8d218c5cc5 119 lora.start_tx(lora.RegPayloadLength); /* begin transmission */
dudmuck 0:1d8d218c5cc5 120
dudmuck 0:1d8d218c5cc5 121 while (lora.service() != SERVICE_TX_DONE) /* wait for transmission to complete */
dudmuck 0:1d8d218c5cc5 122 ;
dudmuck 0:1d8d218c5cc5 123 rx_timeout_at = t.read_us() + 200000;
dudmuck 0:1d8d218c5cc5 124
dudmuck 0:1d8d218c5cc5 125 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:1d8d218c5cc5 126
dudmuck 0:1d8d218c5cc5 127 while (t.read_us() < rx_timeout_at) {
dudmuck 0:1d8d218c5cc5 128 if (lora.service() == SERVICE_READ_FIFO) {
dudmuck 0:1d8d218c5cc5 129 uint16_t rx_crc;
dudmuck 2:5131512b4eb9 130 printf("rssi:%ddBm snr:%.1fdB ", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0);
dudmuck 0:1d8d218c5cc5 131 rx_crc = radio.rx_buf[lora.RegRxNbBytes-2];
dudmuck 0:1d8d218c5cc5 132 rx_crc |= radio.rx_buf[lora.RegRxNbBytes-1] << 8;
dudmuck 0:1d8d218c5cc5 133 crc = crc16(radio.rx_buf, lora.RegRxNbBytes-2);
dudmuck 0:1d8d218c5cc5 134 if (crc == rx_crc) {
dudmuck 0:1d8d218c5cc5 135 printf("crcOk %u\r\n", i);
dudmuck 0:1d8d218c5cc5 136 if (radio.rx_buf[0] == CMD_OUT_PIN_ACK) {
dudmuck 2:5131512b4eb9 137 uint16_t ain = radio.rx_buf[1];
dudmuck 2:5131512b4eb9 138 ain |= radio.rx_buf[2] << 8;
dudmuck 0:1d8d218c5cc5 139 printf("ain %u\r\n", ain);
dudmuck 0:1d8d218c5cc5 140 }
dudmuck 0:1d8d218c5cc5 141 return;
dudmuck 0:1d8d218c5cc5 142 } else
dudmuck 0:1d8d218c5cc5 143 printf("crcFail %04x != %04x\r\n", crc, rx_crc);
dudmuck 0:1d8d218c5cc5 144 }
dudmuck 0:1d8d218c5cc5 145 }
dudmuck 0:1d8d218c5cc5 146 printf("rx-timeout %u\r\n", i);
dudmuck 0:1d8d218c5cc5 147 } // ..for()
dudmuck 0:1d8d218c5cc5 148 }
dudmuck 0:1d8d218c5cc5 149
Wayne Roberts 3:cd312fc32558 150 #ifndef ANALOG_TX_TRIGGER
dudmuck 0:1d8d218c5cc5 151 void button_isr()
dudmuck 0:1d8d218c5cc5 152 {
dudmuck 0:1d8d218c5cc5 153 if (!jumper_in.read())
dudmuck 0:1d8d218c5cc5 154 start_tx = true;
dudmuck 0:1d8d218c5cc5 155 }
dudmuck 0:1d8d218c5cc5 156
dudmuck 0:1d8d218c5cc5 157 void auto_tx()
dudmuck 0:1d8d218c5cc5 158 {
dudmuck 0:1d8d218c5cc5 159 if (jumper_in.read())
dudmuck 0:1d8d218c5cc5 160 start_tx = true;
dudmuck 0:1d8d218c5cc5 161 else
dudmuck 0:1d8d218c5cc5 162 ticker.detach();
dudmuck 0:1d8d218c5cc5 163 }
Wayne Roberts 3:cd312fc32558 164 #endif /* !ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 165
dudmuck 0:1d8d218c5cc5 166 int main()
dudmuck 0:1d8d218c5cc5 167 {
Wayne Roberts 3:cd312fc32558 168 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 169 uint16_t prev_ain;
Wayne Roberts 3:cd312fc32558 170 int8_t ain_movement;
Wayne Roberts 3:cd312fc32558 171 bool ain_sent;
Wayne Roberts 3:cd312fc32558 172 #else
dudmuck 0:1d8d218c5cc5 173 bool jin = false;
dudmuck 0:1d8d218c5cc5 174
dudmuck 0:1d8d218c5cc5 175 jumper_out = 1;
dudmuck 0:1d8d218c5cc5 176 jumper_in.mode(PullDown);
dudmuck 0:1d8d218c5cc5 177
dudmuck 0:1d8d218c5cc5 178 while (!user_button) {
dudmuck 0:1d8d218c5cc5 179 printf("button-lo\r\n");
dudmuck 0:1d8d218c5cc5 180 wait(0.01);
dudmuck 0:1d8d218c5cc5 181 }
dudmuck 0:1d8d218c5cc5 182 user_button.fall(&button_isr);
Wayne Roberts 3:cd312fc32558 183 #endif /* !ANALOG_TX_TRIGGER */
Wayne Roberts 3:cd312fc32558 184 printf("\r\n2reset\r\n");
dudmuck 0:1d8d218c5cc5 185 t.start();
dudmuck 0:1d8d218c5cc5 186
dudmuck 0:1d8d218c5cc5 187 radio.rf_switch = rfsw_callback;
dudmuck 0:1d8d218c5cc5 188
dudmuck 0:1d8d218c5cc5 189 radio.set_frf_MHz(917.3);
dudmuck 0:1d8d218c5cc5 190 lora.enable();
dudmuck 0:1d8d218c5cc5 191 lora.setBw_KHz(500);
dudmuck 0:1d8d218c5cc5 192 lora.setSf(9);
dudmuck 0:1d8d218c5cc5 193
dudmuck 0:1d8d218c5cc5 194 /* RFO or PABOOST choice:
dudmuck 0:1d8d218c5cc5 195 * SX1276 shield: RFO if using 900MHz, or PA_BOOST if using 433MHz
dudmuck 0:1d8d218c5cc5 196 */
dudmuck 0:1d8d218c5cc5 197 rfsw.input();
dudmuck 0:1d8d218c5cc5 198 if (rfsw.read()) {
dudmuck 0:1d8d218c5cc5 199 printf("LAS\r\n");
dudmuck 0:1d8d218c5cc5 200 /* LAS HF=PA_BOOST LF=RFO */
dudmuck 0:1d8d218c5cc5 201 if (radio.HF)
dudmuck 0:1d8d218c5cc5 202 radio.RegPaConfig.bits.PaSelect = 1;
dudmuck 0:1d8d218c5cc5 203 else
dudmuck 0:1d8d218c5cc5 204 radio.RegPaConfig.bits.PaSelect = 0;
dudmuck 0:1d8d218c5cc5 205 } else {
dudmuck 0:1d8d218c5cc5 206 /* MAS shield board, only RFO TX */
dudmuck 0:1d8d218c5cc5 207 radio.RegPaConfig.bits.PaSelect = 0;
dudmuck 0:1d8d218c5cc5 208 printf("MAS\r\n");
dudmuck 0:1d8d218c5cc5 209 }
dudmuck 0:1d8d218c5cc5 210 rfsw.output();
dudmuck 0:1d8d218c5cc5 211 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:1d8d218c5cc5 212
dudmuck 0:1d8d218c5cc5 213 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:1d8d218c5cc5 214
Wayne Roberts 3:cd312fc32558 215 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 216 prev_ain = a1.read_u16();
Wayne Roberts 3:cd312fc32558 217 ain_movement = 0;
Wayne Roberts 3:cd312fc32558 218 ain_sent = false;
Wayne Roberts 3:cd312fc32558 219 #endif /* ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 220 for (;;) {
Wayne Roberts 3:cd312fc32558 221 #ifdef ANALOG_TX_TRIGGER
Wayne Roberts 3:cd312fc32558 222 uint16_t ain = a1.read_u16();
Wayne Roberts 3:cd312fc32558 223 uint16_t diff = abs(ain-prev_ain);
Wayne Roberts 3:cd312fc32558 224 if (diff > AIN_REST_THRESHOLD) {
Wayne Roberts 3:cd312fc32558 225 ain_sent = false;
Wayne Roberts 3:cd312fc32558 226 if (ain_movement < 1)
Wayne Roberts 3:cd312fc32558 227 ain_movement = 1;
Wayne Roberts 3:cd312fc32558 228 else {
Wayne Roberts 3:cd312fc32558 229 if (++ain_movement > 16)
Wayne Roberts 3:cd312fc32558 230 ain_movement = 16;
Wayne Roberts 3:cd312fc32558 231 }
Wayne Roberts 3:cd312fc32558 232 } else {
Wayne Roberts 3:cd312fc32558 233 /* steady state */
Wayne Roberts 3:cd312fc32558 234 if (ain_movement > 0)
Wayne Roberts 3:cd312fc32558 235 ain_movement = 0;
Wayne Roberts 3:cd312fc32558 236 else {
Wayne Roberts 3:cd312fc32558 237 if (--ain_movement < -16) {
Wayne Roberts 3:cd312fc32558 238 ain_movement = -16;
Wayne Roberts 3:cd312fc32558 239 if (!ain_sent) {
Wayne Roberts 3:cd312fc32558 240 uint8_t buf[4];
Wayne Roberts 3:cd312fc32558 241 printf("## %02x ##\r\n", ain >> 8);
Wayne Roberts 3:cd312fc32558 242 buf[0] = CMD_PWM;
Wayne Roberts 3:cd312fc32558 243 buf[1] = 120; // Hz
Wayne Roberts 3:cd312fc32558 244 buf[2] = ain >> 8; // duty
Wayne Roberts 3:cd312fc32558 245 radio_tx(buf, 3);
Wayne Roberts 3:cd312fc32558 246 ain_sent = true;
Wayne Roberts 3:cd312fc32558 247 }
Wayne Roberts 3:cd312fc32558 248 }
Wayne Roberts 3:cd312fc32558 249 }
Wayne Roberts 3:cd312fc32558 250 }
Wayne Roberts 3:cd312fc32558 251 //printf("%05u diff:%04u move:%d\r\n", ain, diff, ain_movement);
Wayne Roberts 3:cd312fc32558 252 prev_ain = ain;
Wayne Roberts 3:cd312fc32558 253 wait_us(5000);
Wayne Roberts 3:cd312fc32558 254
Wayne Roberts 3:cd312fc32558 255 #else
dudmuck 0:1d8d218c5cc5 256
dudmuck 0:1d8d218c5cc5 257 if (jumper_in.read()) {
dudmuck 0:1d8d218c5cc5 258 if (!jin) {
dudmuck 0:1d8d218c5cc5 259 ticker.attach(auto_tx, 0.5);
dudmuck 0:1d8d218c5cc5 260 jin = true;
dudmuck 0:1d8d218c5cc5 261 }
dudmuck 0:1d8d218c5cc5 262 } else {
dudmuck 0:1d8d218c5cc5 263 jin = false;
dudmuck 0:1d8d218c5cc5 264 }
dudmuck 0:1d8d218c5cc5 265
dudmuck 0:1d8d218c5cc5 266 if (start_tx) {
dudmuck 1:d95d135a4fb4 267 start_tx = false;
dudmuck 1:d95d135a4fb4 268
dudmuck 1:d95d135a4fb4 269 uint8_t buf[2];
dudmuck 0:1d8d218c5cc5 270 out_pin_state ^= 1;
dudmuck 1:d95d135a4fb4 271 buf[0] = CMD_OUT_PIN;
dudmuck 1:d95d135a4fb4 272 buf[1] = out_pin_state;
dudmuck 1:d95d135a4fb4 273 printf("start_tx...\r\n");
dudmuck 1:d95d135a4fb4 274 radio_tx(buf, 2);
dudmuck 0:1d8d218c5cc5 275 }
Wayne Roberts 3:cd312fc32558 276 #endif /* !ANALOG_TX_TRIGGER */
dudmuck 0:1d8d218c5cc5 277 if (lora.service() == SERVICE_READ_FIFO) {
dudmuck 0:1d8d218c5cc5 278 uint16_t crc, rx_crc;
dudmuck 0:1d8d218c5cc5 279 int i;
dudmuck 0:1d8d218c5cc5 280 for (i = 0; i < lora.RegRxNbBytes; i++) {
dudmuck 0:1d8d218c5cc5 281 printf("%02x ", radio.rx_buf[i]);
dudmuck 0:1d8d218c5cc5 282 }
dudmuck 2:5131512b4eb9 283 printf(" rssi:%ddBm, snr:%.1fdB\r\n", lora.get_pkt_rssi(), lora.RegPktSnrValue / 4.0);
dudmuck 0:1d8d218c5cc5 284 rx_crc = radio.rx_buf[lora.RegRxNbBytes-2];
dudmuck 0:1d8d218c5cc5 285 rx_crc |= radio.rx_buf[lora.RegRxNbBytes-1] << 8;
dudmuck 0:1d8d218c5cc5 286 crc = crc16(radio.rx_buf, lora.RegRxNbBytes-2);
dudmuck 0:1d8d218c5cc5 287 if (crc == rx_crc) {
dudmuck 0:1d8d218c5cc5 288 printf("crcOk\r\n");
dudmuck 1:d95d135a4fb4 289 if (!parse_radio_rx(radio.rx_buf) && radio.rx_buf[0] == CMD_OUT_PIN) {
dudmuck 0:1d8d218c5cc5 290 pc6_out.write(radio.rx_buf[1]);
dudmuck 0:1d8d218c5cc5 291 printf("out pin state: %u", radio.rx_buf[1]);
dudmuck 0:1d8d218c5cc5 292 }
dudmuck 0:1d8d218c5cc5 293 printf("\r\n");
dudmuck 0:1d8d218c5cc5 294 tx_ack();
dudmuck 0:1d8d218c5cc5 295 } else
dudmuck 0:1d8d218c5cc5 296 printf("crc %04x != %04x\r\n", crc, rx_crc);
dudmuck 0:1d8d218c5cc5 297 } // ..if something received
dudmuck 1:d95d135a4fb4 298
dudmuck 1:d95d135a4fb4 299 uart_service();
dudmuck 0:1d8d218c5cc5 300 } // ..for (;;)
dudmuck 0:1d8d218c5cc5 301 }
dudmuck 0:1d8d218c5cc5 302