This program is guided to help establish a connection between two RFM95 900MHz LoRa radio modules using Maxim Integrated's Feather MCUs (MAX32630FTHR Mbed and the MAX32620FTHR Mbed). Once the radios are configured after powering on and if the radios are wired correctly, the two radios will self identify as either a master or a slave, and will then proceed to PING and PONG back and forth. Information about what is happening between the radios can be seen if the two boards are hooked up to a USB COM port through the included DAPLINK/MAX32625PICO modules.

Dependencies:   BufferedSerial SX1276GenericLib USBDeviceHT max32630fthr

Fork of MAX326xxFTHR_LoRa_PingPong by Devin Alexander

Committer:
Helmut64
Date:
Wed May 10 08:48:46 2017 +0000
Revision:
0:c43b6919ae15
Child:
8:3b0d7b4ff28f
Initial checkin Lora support for the STM B_L072Z_LRWAN1 board out of the box.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Helmut64 0:c43b6919ae15 1 /*
Helmut64 0:c43b6919ae15 2 * Copyright (c) 2017 Helmut Tschemernjak
Helmut64 0:c43b6919ae15 3 * 30826 Garbsen (Hannover) Germany
Helmut64 0:c43b6919ae15 4 * Licensed under the Apache License, Version 2.0);
Helmut64 0:c43b6919ae15 5 */
Helmut64 0:c43b6919ae15 6 #include "main.h"
Helmut64 0:c43b6919ae15 7
Helmut64 0:c43b6919ae15 8
Helmut64 0:c43b6919ae15 9 DigitalOut myled(LED1);
Helmut64 0:c43b6919ae15 10 BufferedSerial *ser;
Helmut64 0:c43b6919ae15 11
Helmut64 0:c43b6919ae15 12 int main() {
Helmut64 0:c43b6919ae15 13 SystemClock_Config();
Helmut64 0:c43b6919ae15 14 ser = new BufferedSerial(USBTX, USBRX);
Helmut64 0:c43b6919ae15 15 ser->baud(115200*2);
Helmut64 0:c43b6919ae15 16 ser->format(8);
Helmut64 0:c43b6919ae15 17 ser->printf("Hello World\n\r");
Helmut64 0:c43b6919ae15 18 myled = 1;
Helmut64 0:c43b6919ae15 19
Helmut64 0:c43b6919ae15 20 SX1276PingPong();
Helmut64 0:c43b6919ae15 21 }
Helmut64 0:c43b6919ae15 22
Helmut64 0:c43b6919ae15 23
Helmut64 0:c43b6919ae15 24
Helmut64 0:c43b6919ae15 25
Helmut64 0:c43b6919ae15 26 void SystemClock_Config(void)
Helmut64 0:c43b6919ae15 27 {
Helmut64 0:c43b6919ae15 28 #ifdef B_L072Z_LRWAN1_LORA
Helmut64 0:c43b6919ae15 29 /*
Helmut64 0:c43b6919ae15 30 * The L072Z_LRWAN1_LORA clock setup is somewhat differnt from the Nucleo board.
Helmut64 0:c43b6919ae15 31 * It has no LSE.
Helmut64 0:c43b6919ae15 32 */
Helmut64 0:c43b6919ae15 33 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
Helmut64 0:c43b6919ae15 34 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
Helmut64 0:c43b6919ae15 35
Helmut64 0:c43b6919ae15 36 /* Enable HSE Oscillator and Activate PLL with HSE as source */
Helmut64 0:c43b6919ae15 37 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
Helmut64 0:c43b6919ae15 38 RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
Helmut64 0:c43b6919ae15 39 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
Helmut64 0:c43b6919ae15 40 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
Helmut64 0:c43b6919ae15 41 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
Helmut64 0:c43b6919ae15 42 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
Helmut64 0:c43b6919ae15 43 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
Helmut64 0:c43b6919ae15 44 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
Helmut64 0:c43b6919ae15 45
Helmut64 0:c43b6919ae15 46 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Helmut64 0:c43b6919ae15 47 // Error_Handler();
Helmut64 0:c43b6919ae15 48 }
Helmut64 0:c43b6919ae15 49
Helmut64 0:c43b6919ae15 50 /* Set Voltage scale1 as MCU will run at 32MHz */
Helmut64 0:c43b6919ae15 51 __HAL_RCC_PWR_CLK_ENABLE();
Helmut64 0:c43b6919ae15 52 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
Helmut64 0:c43b6919ae15 53
Helmut64 0:c43b6919ae15 54 /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */
Helmut64 0:c43b6919ae15 55 while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};
Helmut64 0:c43b6919ae15 56
Helmut64 0:c43b6919ae15 57 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
Helmut64 0:c43b6919ae15 58 clocks dividers */
Helmut64 0:c43b6919ae15 59 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
Helmut64 0:c43b6919ae15 60 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
Helmut64 0:c43b6919ae15 61 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
Helmut64 0:c43b6919ae15 62 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
Helmut64 0:c43b6919ae15 63 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
Helmut64 0:c43b6919ae15 64 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
Helmut64 0:c43b6919ae15 65 // Error_Handler();
Helmut64 0:c43b6919ae15 66 }
Helmut64 0:c43b6919ae15 67 #endif
Helmut64 0:c43b6919ae15 68 }
Helmut64 0:c43b6919ae15 69
Helmut64 0:c43b6919ae15 70 void dump(const char *title, const void *data, int len, bool dwords)
Helmut64 0:c43b6919ae15 71 {
Helmut64 0:c43b6919ae15 72 dprintf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
Helmut64 0:c43b6919ae15 73
Helmut64 0:c43b6919ae15 74 int i, j, cnt;
Helmut64 0:c43b6919ae15 75 unsigned char *u;
Helmut64 0:c43b6919ae15 76 const int width = 16;
Helmut64 0:c43b6919ae15 77 const int seppos = 7;
Helmut64 0:c43b6919ae15 78
Helmut64 0:c43b6919ae15 79 cnt = 0;
Helmut64 0:c43b6919ae15 80 u = (unsigned char *)data;
Helmut64 0:c43b6919ae15 81 while (len > 0) {
Helmut64 0:c43b6919ae15 82 ser->printf("%08x: ", (unsigned int)data + cnt);
Helmut64 0:c43b6919ae15 83 if (dwords) {
Helmut64 0:c43b6919ae15 84 unsigned int *ip = ( unsigned int *)u;
Helmut64 0:c43b6919ae15 85 ser->printf(" 0x%08x\r\n", *ip);
Helmut64 0:c43b6919ae15 86 u+= 4;
Helmut64 0:c43b6919ae15 87 len -= 4;
Helmut64 0:c43b6919ae15 88 cnt += 4;
Helmut64 0:c43b6919ae15 89 continue;
Helmut64 0:c43b6919ae15 90 }
Helmut64 0:c43b6919ae15 91 cnt += width;
Helmut64 0:c43b6919ae15 92 j = len < width ? len : width;
Helmut64 0:c43b6919ae15 93 for (i = 0; i < j; i++) {
Helmut64 0:c43b6919ae15 94 ser->printf("%2.2x ", *(u + i));
Helmut64 0:c43b6919ae15 95 if (i == seppos)
Helmut64 0:c43b6919ae15 96 ser->putc(' ');
Helmut64 0:c43b6919ae15 97 }
Helmut64 0:c43b6919ae15 98 ser->putc(' ');
Helmut64 0:c43b6919ae15 99 if (j < width) {
Helmut64 0:c43b6919ae15 100 i = width - j;
Helmut64 0:c43b6919ae15 101 if (i > seppos + 1)
Helmut64 0:c43b6919ae15 102 ser->putc(' ');
Helmut64 0:c43b6919ae15 103 while (i--) {
Helmut64 0:c43b6919ae15 104 printf("%s", " ");
Helmut64 0:c43b6919ae15 105 }
Helmut64 0:c43b6919ae15 106 }
Helmut64 0:c43b6919ae15 107 for (i = 0; i < j; i++) {
Helmut64 0:c43b6919ae15 108 int c = *(u + i);
Helmut64 0:c43b6919ae15 109 if (c >= ' ' && c <= '~')
Helmut64 0:c43b6919ae15 110 ser->putc(c);
Helmut64 0:c43b6919ae15 111 else
Helmut64 0:c43b6919ae15 112 ser->putc('.');
Helmut64 0:c43b6919ae15 113 if (i == seppos)
Helmut64 0:c43b6919ae15 114 ser->putc(' ');
Helmut64 0:c43b6919ae15 115 }
Helmut64 0:c43b6919ae15 116 len -= width;
Helmut64 0:c43b6919ae15 117 u += width;
Helmut64 0:c43b6919ae15 118 ser->printf("\r\n");
Helmut64 0:c43b6919ae15 119 }
Helmut64 0:c43b6919ae15 120 ser->printf("--\r\n");
Helmut64 0:c43b6919ae15 121 }