Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Prototype RF Driver for STM Sub-1 GHz RF Expansion Boards based on the SPSGRF-868 and SPSGRF-915 Modules for STM32 Nucleo
Currently supported boards:
Note, in order to use expansion board X-NUCLEO-IDS01A4
in mbed you need to perform the following HW modifications on the board:
- Unmount resistor
R4
- Mount resistor
R7
Furthermore, on some Nucleo development boards (e.g. the NUCLEO_F429ZI), in order to be able to use Ethernet together with these Sub-1 GHz RF expansion boards, you need to compile this driver with macro SPIRIT1_SPI_MOSI=PB_5
defined, while the development board typically requires some HW modification as e.g. described here!
This driver can be used together with the 6LoWPAN stack (a.k.a. Nanostack).
source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Gpio.c
- Committer:
- Wolfgang Betz
- Date:
- 2018-01-18
- Revision:
- 77:a9a9807bf3ed
- Parent:
- 67:93bec0baf1de
File content as of revision 77:a9a9807bf3ed:
/** ****************************************************************************** * @file SPIRIT_Gpio.c * @author VMA division - AMS * @version 3.2.2 * @date 08-July-2015 * @brief This file provides all the low level API to manage SPIRIT GPIO. * @details * * @attention * * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> * * 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 of STMicroelectronics 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 HOLDER 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. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "SPIRIT_Gpio.h" #include "MCU_Interface.h" /** @addtogroup SPIRIT_Libraries * @{ */ /** @addtogroup SPIRIT_Gpio * @{ */ /** @defgroup Gpio_Private_TypesDefinitions GPIO Private Types Definitions * @{ */ /** * @} */ /** @defgroup Gpio_Private_Defines GPIO Private Defines * @{ */ /** * @} */ /** @defgroup Gpio_Private_Macros GPIO Private Macros * @{ */ /** * @} */ /** @defgroup Gpio_Private_Variables GPIO Private Variables * @{ */ /** * @} */ /** @defgroup Gpio_Private_FunctionPrototypes GPIO Private Function Prototypes * @{ */ /** * @} */ /** @defgroup Gpio_Private_Functions GPIO Private Functions * @{ */ /** * @brief Initializes the SPIRIT GPIOx according to the specified * parameters in the pxGpioInitStruct. * @param pxGpioInitStruct pointer to a SGpioInit structure that * contains the configuration information for the specified SPIRIT GPIO. * @retval None. */ void SpiritGpioInit(SGpioInit* pxGpioInitStruct) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_GPIO(pxGpioInitStruct->xSpiritGpioPin)); s_assert_param(IS_SPIRIT_GPIO_MODE(pxGpioInitStruct->xSpiritGpioMode)); s_assert_param(IS_SPIRIT_GPIO_IO(pxGpioInitStruct->xSpiritGpioIO)); tempRegValue = ((uint8_t)(pxGpioInitStruct->xSpiritGpioMode) | (uint8_t)(pxGpioInitStruct->xSpiritGpioIO)); g_xStatus = SpiritSpiWriteRegisters(pxGpioInitStruct->xSpiritGpioPin, 1, &tempRegValue); } /** * @brief Enables or Disables the output of temperature sensor on SPIRIT GPIO_0. * @param xNewState new state for temperature sensor. * This parameter can be: S_ENABLE or S_DISABLE. * @retval None. */ void SpiritGpioTemperatureSensor(SpiritFunctionalState xNewState) { uint8_t tempRegValue = 0x00; uint8_t gpio0tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); /* Reads the ANA_FUNC_CONF0 register and mask the result to enable or disable the temperature sensor */ g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); if(xNewState == S_ENABLE) { tempRegValue |= TEMPERATURE_SENSOR_MASK; } else { tempRegValue &= (~TEMPERATURE_SENSOR_MASK); gpio0tempRegValue = 0x0A; /* Default value */ } g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue); /* Sets the SPIRIT GPIO_0 according to input request */ g_xStatus = SpiritSpiWriteRegisters(GPIO0_CONF_BASE, 1, &gpio0tempRegValue); } /** * @brief Forces SPIRIT GPIO_x configured as digital output, to VDD or GND. * @param xGpioX Specifies the GPIO to be configured. * This parameter can be one of following parameters: * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0 * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1 * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2 * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3 * @param xLevel Specifies the level. * This parameter can be: HIGH or LOW. * @retval None. */ void SpiritGpioSetLevel(SpiritGpioPin xGpioX, OutputLevel xLevel) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_GPIO(xGpioX)); s_assert_param(IS_SPIRIT_GPIO_LEVEL(xLevel)); /* Reads the SPIRIT_GPIOx register and mask the GPIO_SELECT field */ g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue); tempRegValue &= 0x04; /* Sets the value of the SPIRIT GPIO register according to the specified level */ if(xLevel == HIGH) { tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_VDD | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; } else { tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_GND | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP; } /* Writes the SPIRIT GPIO register */ g_xStatus = SpiritSpiWriteRegisters(xGpioX, 1, &tempRegValue); } /** * @brief Returns output value (VDD or GND) of SPIRIT GPIO_x, when it is configured as digital output. * @param xGpioX Specifies the GPIO to be read. * This parameter can be one of following parameters: * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0 * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1 * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2 * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3 * @retval OutputLevel Logical level of selected GPIO configured as digital output. * This parameter can be: HIGH or LOW. */ OutputLevel SpiritGpioGetLevel(SpiritGpioPin xGpioX) { uint8_t tempRegValue = 0x00; OutputLevel level; /* Check the parameters */ s_assert_param(IS_SPIRIT_GPIO(xGpioX)); /* Reads the SPIRIT_GPIOx register */ g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue); /* Mask the GPIO_SELECT field and returns the value according */ tempRegValue &= 0xF8; if(tempRegValue == SPIRIT_GPIO_DIG_OUT_VDD) { level = HIGH; } else { level = LOW; } return level; } /** * @brief Enables or Disables the MCU clock output. * @param xNewState new state for the MCU clock output. * This parameter can be: S_ENABLE or S_DISABLE. * @retval None. */ void SpiritGpioClockOutput(SpiritFunctionalState xNewState) { uint8_t tempRegValue; /* Check the parameters */ s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState)); /* Reads the MCU_CK_CONF register and mask the result to enable or disable the clock output */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); if(xNewState) { tempRegValue |= MCU_CK_ENABLE; } else { tempRegValue &= (~MCU_CK_ENABLE); } /* Writes the MCU_CK_CONF register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); } /** * @brief Initializes the SPIRIT Clock Output according to the specified * parameters in the xClockOutputInitStruct. * @param pxClockOutputInitStruct pointer to a ClockOutputInit structure that * contains the configuration information for the SPIRIT Clock Output. * @retval None. * @note The function SpiritGpioClockOutput() must be called in order to enable * or disable the MCU clock dividers. */ void SpiritGpioClockOutputInit(ClockOutputInit* pxClockOutputInitStruct) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(pxClockOutputInitStruct->xClockOutputXOPrescaler)); s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(pxClockOutputInitStruct->xClockOutputRCOPrescaler)); s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(pxClockOutputInitStruct->xExtraClockCycles)); /* Calculates the register value to write according to the specified configuration */ tempRegValue = ((uint8_t)(pxClockOutputInitStruct->xClockOutputXOPrescaler) | (uint8_t)(pxClockOutputInitStruct->xClockOutputRCOPrescaler) | \ (uint8_t)(pxClockOutputInitStruct->xExtraClockCycles)); /* Writes the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); } /** * @brief Sets the XO ratio as clock output. * @param xXOPrescaler the XO prescaler to be used as clock output. * This parameter can be any value of @ref ClockOutputXOPrescaler . * @retval None */ void SpiritGpioSetXOPrescaler(ClockOutputXOPrescaler xXOPrescaler) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(xXOPrescaler)); /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the XO_RATIO field and writes the new value */ tempRegValue &= 0x61; tempRegValue |= ((uint8_t)xXOPrescaler); /* Writes the new XO prescaler in the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); } /** * @brief Returns the settled XO prescaler as clock output. * @param None. * @retval ClockOutputXOPrescaler Settled XO prescaler used for clock * output. This parameter can be a value of @ref ClockOutputXOPrescaler . */ ClockOutputXOPrescaler SpiritGpioGetXOPrescaler(void) { uint8_t tempRegValue = 0x00; /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the XO_RATIO field and return the value */ return ((ClockOutputXOPrescaler)(tempRegValue & 0x1E)); } /** * @brief Sets the RCO ratio as clock output * @param xRCOPrescaler the RCO prescaler to be used as clock output. * This parameter can be any value of @ref ClockOutputRCOPrescaler . * @retval None. */ void SpiritGpioSetRCOPrescaler(ClockOutputRCOPrescaler xRCOPrescaler) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(xRCOPrescaler)); /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the RCO_RATIO field and writes the new value */ tempRegValue &= 0xFE; tempRegValue |= ((uint8_t)xRCOPrescaler); /* Writes the new RCO prescaler in the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); } /** * @brief Returns the settled RCO prescaler as clock output. * @param None. * @retval ClockOutputRCOPrescaler Settled RCO prescaler used for clock * output. This parameter can be a value of @ref ClockOutputRCOPrescaler. */ ClockOutputRCOPrescaler SpiritGpioGetRCOPrescaler(void) { uint8_t tempRegValue = 0x00; /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the RCO_RATIO field and returns the value */ return ((ClockOutputRCOPrescaler)(tempRegValue & 0x01)); } /** * @brief Sets the RCO ratio as clock output. * @param xExtraCycles the number of extra clock cycles provided before switching * to STANDBY state. This parameter can be any value of @ref ExtraClockCycles . * @retval None. */ void SpiritGpioSetExtraClockCycles(ExtraClockCycles xExtraCycles) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xExtraCycles)); /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the CLOCK_TAIL field and writes the new value */ tempRegValue &= 0x9F; tempRegValue |= ((uint8_t)xExtraCycles); /* Writes the new number of extra clock cycles in the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); } /** * @brief Returns the settled RCO prescaler as clock output. * @param None. * @retval ExtraClockCycles Settled number of extra clock cycles * provided before switching to STANDBY state. This parameter can be * any value of @ref ExtraClockCycles . */ ExtraClockCycles SpiritGpioGetExtraClockCycles(void) { uint8_t tempRegValue = 0x00; /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the CLOCK_TAIL field and returns the value */ return ((ExtraClockCycles)(tempRegValue & 0x60)); } /** * @} */ /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/