boards/arm/stm32/stm32f4discovery/: Add board support to external LoRa NiceRF module

This commit is contained in:
Alan Carvalho de Assis
2020-01-12 10:59:30 -06:00
committed by Gregory Nutt
parent 6309165fe0
commit 29f480f57f
7 changed files with 286 additions and 8 deletions
@@ -41,6 +41,7 @@ Contents
- RTC DS1307
- SSD1289
- UG-2864AMBAG01 / UG-2864HSWEG01
- NiceRF LoRa (2AD66-LoRa V2)
- HCI UART
- STM32F4Discovery-specific Configuration Options
- BASIC
@@ -642,6 +643,15 @@ Darcy Gong recently added support for the UG-2864HSWEG01 OLED which is also
an option with this configuration. I have little technical information about
the UG-2864HSWEG01 interface (see boards/arm/stm32/stm32f4discovery/src/up_ug2864hsweg01.c).
NiceRF LoRa (2AD66-LoRa V2)
===========================
It is possible to wire an external LoRa module to STM32F4Discovery board.
First connect the GND and VCC (to 3.3V) and then connect the SCK label to PA5,
connnect the MISO to PA6, connect the MOSI to PA7, connect the NSS to PD8,
connect DIO0 to PD0 and finally connect NRESET to PD4.
HCI UART
========
@@ -81,6 +81,10 @@ ifeq ($(CONFIG_LCD_ST7567),y)
CSRCS += stm32_st7567.c
endif
ifeq ($(CONFIG_LPWAN_SX127X),y)
CSRCS += stm32_sx127x.c
endif
ifeq ($(CONFIG_INPUT_NUNCHUCK),y)
CSRCS += stm32_nunchuck.c
endif
@@ -466,5 +466,13 @@ int stm32_bringup(void)
}
#endif
#ifdef CONFIG_LPWAN_SX127X
ret = stm32_lpwaninitialize();
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: Failed to initialize wireless driver: %d\n", ret);
}
#endif /* CONFIG_LPWAN_SX127X */
return ret;
}
@@ -78,6 +78,10 @@ void weak_function stm32_spidev_initialize(void)
#if defined(CONFIG_LCD_MAX7219) || defined(CONFIG_LEDS_MAX7219)
stm32_configgpio(GPIO_MAX7219_CS); /* MAX7219 chip select */
#endif
#ifdef CONFIG_LPWAN_SX127X
stm32_configgpio(GPIO_SX127X_CS); /* SX127x chip select*/
#endif
#if defined(CONFIG_LCD_ST7567)
stm32_configgpio(STM32_LCD_CS); /* ST7567 chip select */
#endif
@@ -126,6 +130,12 @@ void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected)
{
spiinfo("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
#ifdef CONFIG_LPWAN_SX127X
if (devid == SPIDEV_LPWAN(0))
{
stm32_gpiowrite(GPIO_SX127X_CS, !selected);
}
#endif
#ifdef CONFIG_LCD_ST7567
if (devid == SPIDEV_DISPLAY(0))
{
@@ -153,7 +163,16 @@ void stm32_spi1select(FAR struct spi_dev_s *dev, uint32_t devid, bool selected)
uint8_t stm32_spi1status(FAR struct spi_dev_s *dev, uint32_t devid)
{
return 0;
uint8_t status = 0;
#ifdef CONFIG_LPWAN_SX127X
if (devid == SPIDEV_LPWAN(0))
{
status |= SPI_STATUS_PRESENT;
}
#endif
return status;
}
#endif
@@ -0,0 +1,216 @@
/****************************************************************************
* boards/arm/stm32/stm32f4discovery/src/stm32_boot.c
*
* Copyright (C) 2019 Gregory Nutt. All rights reserved.
* Authors: Mateusz Szafoni <raiden00@railab.me>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <assert.h>
#include <debug.h>
#include <nuttx/board.h>
#include <nuttx/signal.h>
#include <nuttx/wireless/lpwan/sx127x.h>
#include <arch/board/board.h>
#include "stm32_gpio.h"
#include "stm32_exti.h"
#include "stm32_spi.h"
#include "stm32f4discovery.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* SX127X on SPI1 bus */
#define SX127X_SPI 1
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
static void sx127x_chip_reset(void);
static int sx127x_opmode_change(int opmode);
static int sx127x_freq_select(uint32_t freq);
static int sx127x_pa_select(bool enable);
static int sx127x_irq0_attach(xcpt_t isr, FAR void *arg);
/****************************************************************************
* Private Data
****************************************************************************/
struct sx127x_lower_s lower =
{
.irq0attach = sx127x_irq0_attach,
.reset = sx127x_chip_reset,
.opmode_change = sx127x_opmode_change,
.freq_select = sx127x_freq_select,
.pa_select = sx127x_pa_select,
.pa_force = false
};
static bool g_high_power_output = false;
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: sx127x_irq0_attach
****************************************************************************/
static int sx127x_irq0_attach(xcpt_t isr, FAR void *arg)
{
wlinfo("Attach DIO0 IRQ\n");
/* IRQ on rising edge */
stm32_gpiosetevent(GPIO_SX127X_DIO0, true, false, false, isr, arg);
return OK;
}
/****************************************************************************
* Name: sx127x_chip_reset
****************************************************************************/
static void sx127x_chip_reset(void)
{
wlinfo("SX127X RESET\n");
/* Configure reset as output */
stm32_configgpio(GPIO_SX127X_RESET);
/* Set pin to zero */
stm32_gpiowrite(GPIO_SX127X_RESET, false);
/* Wait 1 ms */
nxsig_usleep(1000);
/* Configure reset as input */
stm32_configgpio(GPIO_SX127X_RESET | GPIO_INPUT | GPIO_FLOAT);
/* Wait 10 ms */
nxsig_usleep(10000);
}
/****************************************************************************
* Name: sx127x_opmode_change
****************************************************************************/
static int sx127x_opmode_change(int opmode)
{
/* Nothing to do */
return OK;
}
/****************************************************************************
* Name: sx127x_freq_select
****************************************************************************/
static int sx127x_freq_select(uint32_t freq)
{
int ret = OK;
/* Only HF supported (BAND3 - 860-930 MHz) */
if (freq < SX127X_HFBAND_THR)
{
ret = -EINVAL;
wlerr("LF band not supported\n");
}
return ret;
}
/****************************************************************************
* Name: sx127x_pa_select
****************************************************************************/
static int sx127x_pa_select(bool enable)
{
g_high_power_output = enable;
return OK;
}
/****************************************************************************
* Public Functions
****************************************************************************/
int stm32_lpwaninitialize(void)
{
FAR struct spi_dev_s *spidev;
int ret = OK;
wlinfo("Register the sx127x module\n");
/* Setup DIO0 */
stm32_configgpio(GPIO_SX127X_DIO0);
/* Init SPI bus */
spidev = stm32_spibus_initialize(SX127X_SPI);
if (!spidev)
{
wlerr("ERROR: Failed to initialize SPI %d bus\n", SX127X_SPI);
ret = -ENODEV;
goto errout;
}
/* Initialize SX127X */
ret = sx127x_register(spidev, &lower);
if (ret < 0)
{
wlerr("ERROR: Failed to register sx127x\n");
goto errout;
}
errout:
return ret;
}
@@ -242,6 +242,13 @@
#define GPIO_CS43L22_RESET (GPIO_OUTPUT|GPIO_SPEED_50MHz|GPIO_PORTD|GPIO_PIN4)
/* LoRa SX127x */
#define GPIO_SX127X_DIO0 (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTD|GPIO_PIN0)
#define GPIO_SX127X_RESET (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_OUTPUT_CLEAR|\
GPIO_SPEED_50MHz|GPIO_PORTD|GPIO_PIN4)
/* PWM
*
* The STM32F4 Discovery has no real on-board PWM devices, but the board can be
@@ -262,6 +269,9 @@
#define GPIO_MAX6675_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN8)
#define GPIO_SX127X_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
GPIO_OUTPUT_SET|GPIO_PORTD|GPIO_PIN8)
#define GPIO_MAX7219_CS (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\
GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN3)
@@ -477,6 +487,17 @@ int stm32_bmp180initialize(FAR const char *devpath);
int stm32_lis3dshinitialize(FAR const char *devpath);
#endif
/*****************************************************************************
* Name: stm32_lpwaninitialize
*
* Description:
* Initialize SX127X LPWAN interaface.
****************************************************************************/
#ifdef CONFIG_LPWAN_SX127X
int stm32_lpwaninitialize(void);
#endif
/****************************************************************************
* Name: stm32_mmcsdinitialize
*
+1 -1
View File
@@ -58,7 +58,7 @@
#include "sx127x.h"
/* TODO:
* - OOK communication (RX+TX) deosnt work yet
* - OOK communication (RX+TX) doesn't work yet
* - Channel Activity Detection (CAD) for LORA
* - frequency hopping for LORA and FSK/OOK
* - modulation shaping for FSK/OOK