Added support for the WNC M14A2A Cellular LTE Data Module.

Dependencies:   WNC14A2AInterface

Easy Connect

Easily add all supported connectivity methods to your mbed OS project

This project is derived from https://developer.mbed.org/teams/sandbox/code/simple-mbed-client-example/file/dd6231df71bb/easy-connect.lib. It give user the ability to switch between connectivity methods and includes support for the WNC14A2A Data Module. The `NetworkInterface` API makes this easy, but you still need a mechanism for the user to select the connection method, The selection is made by modifying the `mbed_app.json` file and using `easy_connect()` from your application.

Specifying connectivity method

To add support for the WNC14A2A, add the following to your ``mbed_app.json`` file:

mbed_app.json

{
    "config": {
        "network-interface":{
            "help": "options are ETHERNET,WIFI_ESP8266,WIFI_ODIN,MESH_LOWPAN_ND,MESH_THREAD,WNC14A2A",
            "value": "WNC14A2A"
        }
    },
}

After you choose `WNC14A2A` you'll also need to indicate if you want debug output or not by Enabling (true) or Disabling (false) WNC_DEBUG.

If WNC_DEBUG is enabled, there are 3 different levels of debug output (selected via bit settings). These debug levels are set using the following values:

ValueDescription
1Basic WNC driver debug output
2Comprehensive WNC driver debug output
4Network Layer debug output

You can have any combination of these three bit values for a total value of 0 – 7.

WNC Debug Settings

    "config": {
        "WNC_DEBUG": {
            "value": false
        },
        "WNC_DEBUG_SETTING": {
            "value": 4
        },
    }

Using Easy Connect from your application

Easy Connect has just one function which will either return a `NetworkInterface`-pointer or `NULL`:

Sample Code

#include "easy-connect.h"

int main(int, char**) {
    NetworkInterface* network = easy_connect(true); /* has 1 argument, enable_logging (pass in true to log to serial port) */
    if (!network) {
        printf("Connecting to the network failed... See serial output.\r\n");
        return 1;
    }
 
    // Rest of your program
}

Tested on

  • K64F with Ethernet.
  • AT&T Cellular IoT Starter Kit with WNC M14A2A Cellular Data Module

The WNCInterface class currently supports the following version(s):

  • MPSS: M14A2A_v11.50.164451 APSS: M14A2A_v11.53.164451

License

This library is released under the Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License and may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Committer:
group-Avnet
Date:
Wed Apr 19 01:08:11 2017 +0000
Revision:
0:478cfd88041f
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-Avnet 0:478cfd88041f 1 /**
group-Avnet 0:478cfd88041f 2 ******************************************************************************
group-Avnet 0:478cfd88041f 3 * @file SPIRIT_Gpio.c
group-Avnet 0:478cfd88041f 4 * @author VMA division - AMS
group-Avnet 0:478cfd88041f 5 * @version 3.2.2
group-Avnet 0:478cfd88041f 6 * @date 08-July-2015
group-Avnet 0:478cfd88041f 7 * @brief This file provides all the low level API to manage SPIRIT GPIO.
group-Avnet 0:478cfd88041f 8 * @details
group-Avnet 0:478cfd88041f 9 *
group-Avnet 0:478cfd88041f 10 * @attention
group-Avnet 0:478cfd88041f 11 *
group-Avnet 0:478cfd88041f 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
group-Avnet 0:478cfd88041f 13 *
group-Avnet 0:478cfd88041f 14 * Redistribution and use in source and binary forms, with or without modification,
group-Avnet 0:478cfd88041f 15 * are permitted provided that the following conditions are met:
group-Avnet 0:478cfd88041f 16 * 1. Redistributions of source code must retain the above copyright notice,
group-Avnet 0:478cfd88041f 17 * this list of conditions and the following disclaimer.
group-Avnet 0:478cfd88041f 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
group-Avnet 0:478cfd88041f 19 * this list of conditions and the following disclaimer in the documentation
group-Avnet 0:478cfd88041f 20 * and/or other materials provided with the distribution.
group-Avnet 0:478cfd88041f 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
group-Avnet 0:478cfd88041f 22 * may be used to endorse or promote products derived from this software
group-Avnet 0:478cfd88041f 23 * without specific prior written permission.
group-Avnet 0:478cfd88041f 24 *
group-Avnet 0:478cfd88041f 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
group-Avnet 0:478cfd88041f 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
group-Avnet 0:478cfd88041f 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
group-Avnet 0:478cfd88041f 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
group-Avnet 0:478cfd88041f 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
group-Avnet 0:478cfd88041f 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
group-Avnet 0:478cfd88041f 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
group-Avnet 0:478cfd88041f 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
group-Avnet 0:478cfd88041f 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
group-Avnet 0:478cfd88041f 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
group-Avnet 0:478cfd88041f 35 *
group-Avnet 0:478cfd88041f 36 ******************************************************************************
group-Avnet 0:478cfd88041f 37 */
group-Avnet 0:478cfd88041f 38
group-Avnet 0:478cfd88041f 39 /* Includes ------------------------------------------------------------------*/
group-Avnet 0:478cfd88041f 40 #include "SPIRIT_Gpio.h"
group-Avnet 0:478cfd88041f 41 #include "MCU_Interface.h"
group-Avnet 0:478cfd88041f 42
group-Avnet 0:478cfd88041f 43
group-Avnet 0:478cfd88041f 44 /** @addtogroup SPIRIT_Libraries
group-Avnet 0:478cfd88041f 45 * @{
group-Avnet 0:478cfd88041f 46 */
group-Avnet 0:478cfd88041f 47
group-Avnet 0:478cfd88041f 48
group-Avnet 0:478cfd88041f 49 /** @addtogroup SPIRIT_Gpio
group-Avnet 0:478cfd88041f 50 * @{
group-Avnet 0:478cfd88041f 51 */
group-Avnet 0:478cfd88041f 52
group-Avnet 0:478cfd88041f 53
group-Avnet 0:478cfd88041f 54 /** @defgroup Gpio_Private_TypesDefinitions GPIO Private Types Definitions
group-Avnet 0:478cfd88041f 55 * @{
group-Avnet 0:478cfd88041f 56 */
group-Avnet 0:478cfd88041f 57
group-Avnet 0:478cfd88041f 58
group-Avnet 0:478cfd88041f 59 /**
group-Avnet 0:478cfd88041f 60 * @}
group-Avnet 0:478cfd88041f 61 */
group-Avnet 0:478cfd88041f 62
group-Avnet 0:478cfd88041f 63
group-Avnet 0:478cfd88041f 64 /** @defgroup Gpio_Private_Defines GPIO Private Defines
group-Avnet 0:478cfd88041f 65 * @{
group-Avnet 0:478cfd88041f 66 */
group-Avnet 0:478cfd88041f 67
group-Avnet 0:478cfd88041f 68
group-Avnet 0:478cfd88041f 69 /**
group-Avnet 0:478cfd88041f 70 * @}
group-Avnet 0:478cfd88041f 71 */
group-Avnet 0:478cfd88041f 72
group-Avnet 0:478cfd88041f 73
group-Avnet 0:478cfd88041f 74
group-Avnet 0:478cfd88041f 75 /** @defgroup Gpio_Private_Macros GPIO Private Macros
group-Avnet 0:478cfd88041f 76 * @{
group-Avnet 0:478cfd88041f 77 */
group-Avnet 0:478cfd88041f 78
group-Avnet 0:478cfd88041f 79
group-Avnet 0:478cfd88041f 80 /**
group-Avnet 0:478cfd88041f 81 * @}
group-Avnet 0:478cfd88041f 82 */
group-Avnet 0:478cfd88041f 83
group-Avnet 0:478cfd88041f 84
group-Avnet 0:478cfd88041f 85
group-Avnet 0:478cfd88041f 86 /** @defgroup Gpio_Private_Variables GPIO Private Variables
group-Avnet 0:478cfd88041f 87 * @{
group-Avnet 0:478cfd88041f 88 */
group-Avnet 0:478cfd88041f 89
group-Avnet 0:478cfd88041f 90
group-Avnet 0:478cfd88041f 91 /**
group-Avnet 0:478cfd88041f 92 * @}
group-Avnet 0:478cfd88041f 93 */
group-Avnet 0:478cfd88041f 94
group-Avnet 0:478cfd88041f 95
group-Avnet 0:478cfd88041f 96
group-Avnet 0:478cfd88041f 97 /** @defgroup Gpio_Private_FunctionPrototypes GPIO Private Function Prototypes
group-Avnet 0:478cfd88041f 98 * @{
group-Avnet 0:478cfd88041f 99 */
group-Avnet 0:478cfd88041f 100
group-Avnet 0:478cfd88041f 101
group-Avnet 0:478cfd88041f 102 /**
group-Avnet 0:478cfd88041f 103 * @}
group-Avnet 0:478cfd88041f 104 */
group-Avnet 0:478cfd88041f 105
group-Avnet 0:478cfd88041f 106
group-Avnet 0:478cfd88041f 107
group-Avnet 0:478cfd88041f 108 /** @defgroup Gpio_Private_Functions GPIO Private Functions
group-Avnet 0:478cfd88041f 109 * @{
group-Avnet 0:478cfd88041f 110 */
group-Avnet 0:478cfd88041f 111
group-Avnet 0:478cfd88041f 112 /**
group-Avnet 0:478cfd88041f 113 * @brief Initializes the SPIRIT GPIOx according to the specified
group-Avnet 0:478cfd88041f 114 * parameters in the pxGpioInitStruct.
group-Avnet 0:478cfd88041f 115 * @param pxGpioInitStruct pointer to a SGpioInit structure that
group-Avnet 0:478cfd88041f 116 * contains the configuration information for the specified SPIRIT GPIO.
group-Avnet 0:478cfd88041f 117 * @retval None.
group-Avnet 0:478cfd88041f 118 */
group-Avnet 0:478cfd88041f 119 void SpiritGpioInit(SGpioInit* pxGpioInitStruct)
group-Avnet 0:478cfd88041f 120 {
group-Avnet 0:478cfd88041f 121 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 122
group-Avnet 0:478cfd88041f 123 /* Check the parameters */
group-Avnet 0:478cfd88041f 124 s_assert_param(IS_SPIRIT_GPIO(pxGpioInitStruct->xSpiritGpioPin));
group-Avnet 0:478cfd88041f 125 s_assert_param(IS_SPIRIT_GPIO_MODE(pxGpioInitStruct->xSpiritGpioMode));
group-Avnet 0:478cfd88041f 126 s_assert_param(IS_SPIRIT_GPIO_IO(pxGpioInitStruct->xSpiritGpioIO));
group-Avnet 0:478cfd88041f 127
group-Avnet 0:478cfd88041f 128 tempRegValue = ((uint8_t)(pxGpioInitStruct->xSpiritGpioMode) | (uint8_t)(pxGpioInitStruct->xSpiritGpioIO));
group-Avnet 0:478cfd88041f 129
group-Avnet 0:478cfd88041f 130 g_xStatus = SpiritSpiWriteRegisters(pxGpioInitStruct->xSpiritGpioPin, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 131
group-Avnet 0:478cfd88041f 132 }
group-Avnet 0:478cfd88041f 133
group-Avnet 0:478cfd88041f 134
group-Avnet 0:478cfd88041f 135 /**
group-Avnet 0:478cfd88041f 136 * @brief Enables or Disables the output of temperature sensor on SPIRIT GPIO_0.
group-Avnet 0:478cfd88041f 137 * @param xNewState new state for temperature sensor.
group-Avnet 0:478cfd88041f 138 * This parameter can be: S_ENABLE or S_DISABLE.
group-Avnet 0:478cfd88041f 139 * @retval None.
group-Avnet 0:478cfd88041f 140 */
group-Avnet 0:478cfd88041f 141 void SpiritGpioTemperatureSensor(SpiritFunctionalState xNewState)
group-Avnet 0:478cfd88041f 142 {
group-Avnet 0:478cfd88041f 143 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 144 uint8_t gpio0tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 145
group-Avnet 0:478cfd88041f 146 /* Check the parameters */
group-Avnet 0:478cfd88041f 147 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
group-Avnet 0:478cfd88041f 148
group-Avnet 0:478cfd88041f 149 /* Reads the ANA_FUNC_CONF0 register and mask the result to enable or disable the
group-Avnet 0:478cfd88041f 150 temperature sensor */
group-Avnet 0:478cfd88041f 151 g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 152 if(xNewState == S_ENABLE)
group-Avnet 0:478cfd88041f 153 {
group-Avnet 0:478cfd88041f 154 tempRegValue |= TEMPERATURE_SENSOR_MASK;
group-Avnet 0:478cfd88041f 155 }
group-Avnet 0:478cfd88041f 156 else
group-Avnet 0:478cfd88041f 157 {
group-Avnet 0:478cfd88041f 158 tempRegValue &= (~TEMPERATURE_SENSOR_MASK);
group-Avnet 0:478cfd88041f 159 gpio0tempRegValue = 0x0A; /* Default value */
group-Avnet 0:478cfd88041f 160 }
group-Avnet 0:478cfd88041f 161 g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 162
group-Avnet 0:478cfd88041f 163 /* Sets the SPIRIT GPIO_0 according to input request */
group-Avnet 0:478cfd88041f 164 g_xStatus = SpiritSpiWriteRegisters(GPIO0_CONF_BASE, 1, &gpio0tempRegValue);
group-Avnet 0:478cfd88041f 165
group-Avnet 0:478cfd88041f 166 }
group-Avnet 0:478cfd88041f 167
group-Avnet 0:478cfd88041f 168
group-Avnet 0:478cfd88041f 169 /**
group-Avnet 0:478cfd88041f 170 * @brief Forces SPIRIT GPIO_x configured as digital output, to VDD or GND.
group-Avnet 0:478cfd88041f 171 * @param xGpioX Specifies the GPIO to be configured.
group-Avnet 0:478cfd88041f 172 * This parameter can be one of following parameters:
group-Avnet 0:478cfd88041f 173 * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0
group-Avnet 0:478cfd88041f 174 * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1
group-Avnet 0:478cfd88041f 175 * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2
group-Avnet 0:478cfd88041f 176 * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3
group-Avnet 0:478cfd88041f 177 * @param xLevel Specifies the level.
group-Avnet 0:478cfd88041f 178 * This parameter can be: HIGH or LOW.
group-Avnet 0:478cfd88041f 179 * @retval None.
group-Avnet 0:478cfd88041f 180 */
group-Avnet 0:478cfd88041f 181 void SpiritGpioSetLevel(SpiritGpioPin xGpioX, OutputLevel xLevel)
group-Avnet 0:478cfd88041f 182 {
group-Avnet 0:478cfd88041f 183 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 184
group-Avnet 0:478cfd88041f 185 /* Check the parameters */
group-Avnet 0:478cfd88041f 186 s_assert_param(IS_SPIRIT_GPIO(xGpioX));
group-Avnet 0:478cfd88041f 187 s_assert_param(IS_SPIRIT_GPIO_LEVEL(xLevel));
group-Avnet 0:478cfd88041f 188
group-Avnet 0:478cfd88041f 189 /* Reads the SPIRIT_GPIOx register and mask the GPIO_SELECT field */
group-Avnet 0:478cfd88041f 190 g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 191 tempRegValue &= 0x04;
group-Avnet 0:478cfd88041f 192
group-Avnet 0:478cfd88041f 193 /* Sets the value of the SPIRIT GPIO register according to the specified level */
group-Avnet 0:478cfd88041f 194 if(xLevel == HIGH)
group-Avnet 0:478cfd88041f 195 {
group-Avnet 0:478cfd88041f 196 tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_VDD | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP;
group-Avnet 0:478cfd88041f 197 }
group-Avnet 0:478cfd88041f 198 else
group-Avnet 0:478cfd88041f 199 {
group-Avnet 0:478cfd88041f 200 tempRegValue |= (uint8_t)SPIRIT_GPIO_DIG_OUT_GND | (uint8_t)SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_HP;
group-Avnet 0:478cfd88041f 201 }
group-Avnet 0:478cfd88041f 202
group-Avnet 0:478cfd88041f 203 /* Writes the SPIRIT GPIO register */
group-Avnet 0:478cfd88041f 204 g_xStatus = SpiritSpiWriteRegisters(xGpioX, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 205
group-Avnet 0:478cfd88041f 206 }
group-Avnet 0:478cfd88041f 207
group-Avnet 0:478cfd88041f 208
group-Avnet 0:478cfd88041f 209 /**
group-Avnet 0:478cfd88041f 210 * @brief Returns output value (VDD or GND) of SPIRIT GPIO_x, when it is configured as digital output.
group-Avnet 0:478cfd88041f 211 * @param xGpioX Specifies the GPIO to be read.
group-Avnet 0:478cfd88041f 212 * This parameter can be one of following parameters:
group-Avnet 0:478cfd88041f 213 * @arg SPIRIT_GPIO_0: SPIRIT GPIO_0
group-Avnet 0:478cfd88041f 214 * @arg SPIRIT_GPIO_1: SPIRIT GPIO_1
group-Avnet 0:478cfd88041f 215 * @arg SPIRIT_GPIO_2: SPIRIT GPIO_2
group-Avnet 0:478cfd88041f 216 * @arg SPIRIT_GPIO_3: SPIRIT GPIO_3
group-Avnet 0:478cfd88041f 217 * @retval OutputLevel Logical level of selected GPIO configured as digital output.
group-Avnet 0:478cfd88041f 218 * This parameter can be: HIGH or LOW.
group-Avnet 0:478cfd88041f 219 */
group-Avnet 0:478cfd88041f 220 OutputLevel SpiritGpioGetLevel(SpiritGpioPin xGpioX)
group-Avnet 0:478cfd88041f 221 {
group-Avnet 0:478cfd88041f 222 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 223 OutputLevel level;
group-Avnet 0:478cfd88041f 224
group-Avnet 0:478cfd88041f 225 /* Check the parameters */
group-Avnet 0:478cfd88041f 226 s_assert_param(IS_SPIRIT_GPIO(xGpioX));
group-Avnet 0:478cfd88041f 227
group-Avnet 0:478cfd88041f 228 /* Reads the SPIRIT_GPIOx register */
group-Avnet 0:478cfd88041f 229 g_xStatus = SpiritSpiReadRegisters(xGpioX, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 230
group-Avnet 0:478cfd88041f 231 /* Mask the GPIO_SELECT field and returns the value according */
group-Avnet 0:478cfd88041f 232 tempRegValue &= 0xF8;
group-Avnet 0:478cfd88041f 233 if(tempRegValue == SPIRIT_GPIO_DIG_OUT_VDD)
group-Avnet 0:478cfd88041f 234 {
group-Avnet 0:478cfd88041f 235 level = HIGH;
group-Avnet 0:478cfd88041f 236 }
group-Avnet 0:478cfd88041f 237 else
group-Avnet 0:478cfd88041f 238 {
group-Avnet 0:478cfd88041f 239 level = LOW;
group-Avnet 0:478cfd88041f 240 }
group-Avnet 0:478cfd88041f 241
group-Avnet 0:478cfd88041f 242 return level;
group-Avnet 0:478cfd88041f 243
group-Avnet 0:478cfd88041f 244 }
group-Avnet 0:478cfd88041f 245
group-Avnet 0:478cfd88041f 246
group-Avnet 0:478cfd88041f 247 /**
group-Avnet 0:478cfd88041f 248 * @brief Enables or Disables the MCU clock output.
group-Avnet 0:478cfd88041f 249 * @param xNewState new state for the MCU clock output.
group-Avnet 0:478cfd88041f 250 * This parameter can be: S_ENABLE or S_DISABLE.
group-Avnet 0:478cfd88041f 251 * @retval None.
group-Avnet 0:478cfd88041f 252 */
group-Avnet 0:478cfd88041f 253 void SpiritGpioClockOutput(SpiritFunctionalState xNewState)
group-Avnet 0:478cfd88041f 254 {
group-Avnet 0:478cfd88041f 255 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 256
group-Avnet 0:478cfd88041f 257 /* Check the parameters */
group-Avnet 0:478cfd88041f 258 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
group-Avnet 0:478cfd88041f 259
group-Avnet 0:478cfd88041f 260 /* Reads the MCU_CK_CONF register and mask the result to enable or disable the clock output */
group-Avnet 0:478cfd88041f 261 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 262
group-Avnet 0:478cfd88041f 263 if(xNewState)
group-Avnet 0:478cfd88041f 264 {
group-Avnet 0:478cfd88041f 265 tempRegValue |= MCU_CK_ENABLE;
group-Avnet 0:478cfd88041f 266 }
group-Avnet 0:478cfd88041f 267 else
group-Avnet 0:478cfd88041f 268 {
group-Avnet 0:478cfd88041f 269 tempRegValue &= (~MCU_CK_ENABLE);
group-Avnet 0:478cfd88041f 270 }
group-Avnet 0:478cfd88041f 271
group-Avnet 0:478cfd88041f 272 /* Writes the MCU_CK_CONF register */
group-Avnet 0:478cfd88041f 273 g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 274
group-Avnet 0:478cfd88041f 275 }
group-Avnet 0:478cfd88041f 276
group-Avnet 0:478cfd88041f 277
group-Avnet 0:478cfd88041f 278 /**
group-Avnet 0:478cfd88041f 279 * @brief Initializes the SPIRIT Clock Output according to the specified
group-Avnet 0:478cfd88041f 280 * parameters in the xClockOutputInitStruct.
group-Avnet 0:478cfd88041f 281 * @param pxClockOutputInitStruct pointer to a ClockOutputInit structure that
group-Avnet 0:478cfd88041f 282 * contains the configuration information for the SPIRIT Clock Output.
group-Avnet 0:478cfd88041f 283 * @retval None.
group-Avnet 0:478cfd88041f 284 * @note The function SpiritGpioClockOutput() must be called in order to enable
group-Avnet 0:478cfd88041f 285 * or disable the MCU clock dividers.
group-Avnet 0:478cfd88041f 286 */
group-Avnet 0:478cfd88041f 287 void SpiritGpioClockOutputInit(ClockOutputInit* pxClockOutputInitStruct)
group-Avnet 0:478cfd88041f 288 {
group-Avnet 0:478cfd88041f 289 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 290
group-Avnet 0:478cfd88041f 291 /* Check the parameters */
group-Avnet 0:478cfd88041f 292 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(pxClockOutputInitStruct->xClockOutputXOPrescaler));
group-Avnet 0:478cfd88041f 293 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(pxClockOutputInitStruct->xClockOutputRCOPrescaler));
group-Avnet 0:478cfd88041f 294 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(pxClockOutputInitStruct->xExtraClockCycles));
group-Avnet 0:478cfd88041f 295
group-Avnet 0:478cfd88041f 296 /* Calculates the register value to write according to the specified configuration */
group-Avnet 0:478cfd88041f 297 tempRegValue = ((uint8_t)(pxClockOutputInitStruct->xClockOutputXOPrescaler) | (uint8_t)(pxClockOutputInitStruct->xClockOutputRCOPrescaler) | \
group-Avnet 0:478cfd88041f 298 (uint8_t)(pxClockOutputInitStruct->xExtraClockCycles));
group-Avnet 0:478cfd88041f 299
group-Avnet 0:478cfd88041f 300 /* Writes the MCU_CLOCK register */
group-Avnet 0:478cfd88041f 301 g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 302
group-Avnet 0:478cfd88041f 303 }
group-Avnet 0:478cfd88041f 304
group-Avnet 0:478cfd88041f 305
group-Avnet 0:478cfd88041f 306 /**
group-Avnet 0:478cfd88041f 307 * @brief Sets the XO ratio as clock output.
group-Avnet 0:478cfd88041f 308 * @param xXOPrescaler the XO prescaler to be used as clock output.
group-Avnet 0:478cfd88041f 309 * This parameter can be any value of @ref ClockOutputXOPrescaler .
group-Avnet 0:478cfd88041f 310 * @retval None
group-Avnet 0:478cfd88041f 311 */
group-Avnet 0:478cfd88041f 312 void SpiritGpioSetXOPrescaler(ClockOutputXOPrescaler xXOPrescaler)
group-Avnet 0:478cfd88041f 313 {
group-Avnet 0:478cfd88041f 314 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 315
group-Avnet 0:478cfd88041f 316 /* Check the parameters */
group-Avnet 0:478cfd88041f 317 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(xXOPrescaler));
group-Avnet 0:478cfd88041f 318
group-Avnet 0:478cfd88041f 319 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 320 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 321
group-Avnet 0:478cfd88041f 322 /* Mask the XO_RATIO field and writes the new value */
group-Avnet 0:478cfd88041f 323 tempRegValue &= 0x61;
group-Avnet 0:478cfd88041f 324 tempRegValue |= ((uint8_t)xXOPrescaler);
group-Avnet 0:478cfd88041f 325
group-Avnet 0:478cfd88041f 326 /* Writes the new XO prescaler in the MCU_CLOCK register */
group-Avnet 0:478cfd88041f 327 g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 328
group-Avnet 0:478cfd88041f 329 }
group-Avnet 0:478cfd88041f 330
group-Avnet 0:478cfd88041f 331
group-Avnet 0:478cfd88041f 332 /**
group-Avnet 0:478cfd88041f 333 * @brief Returns the settled XO prescaler as clock output.
group-Avnet 0:478cfd88041f 334 * @param None.
group-Avnet 0:478cfd88041f 335 * @retval ClockOutputXOPrescaler Settled XO prescaler used for clock
group-Avnet 0:478cfd88041f 336 * output. This parameter can be a value of @ref ClockOutputXOPrescaler .
group-Avnet 0:478cfd88041f 337 */
group-Avnet 0:478cfd88041f 338 ClockOutputXOPrescaler SpiritGpioGetXOPrescaler(void)
group-Avnet 0:478cfd88041f 339 {
group-Avnet 0:478cfd88041f 340 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 341
group-Avnet 0:478cfd88041f 342 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 343 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 344
group-Avnet 0:478cfd88041f 345 /* Mask the XO_RATIO field and return the value */
group-Avnet 0:478cfd88041f 346 return ((ClockOutputXOPrescaler)(tempRegValue & 0x1E));
group-Avnet 0:478cfd88041f 347
group-Avnet 0:478cfd88041f 348 }
group-Avnet 0:478cfd88041f 349
group-Avnet 0:478cfd88041f 350
group-Avnet 0:478cfd88041f 351 /**
group-Avnet 0:478cfd88041f 352 * @brief Sets the RCO ratio as clock output
group-Avnet 0:478cfd88041f 353 * @param xRCOPrescaler the RCO prescaler to be used as clock output.
group-Avnet 0:478cfd88041f 354 * This parameter can be any value of @ref ClockOutputRCOPrescaler .
group-Avnet 0:478cfd88041f 355 * @retval None.
group-Avnet 0:478cfd88041f 356 */
group-Avnet 0:478cfd88041f 357 void SpiritGpioSetRCOPrescaler(ClockOutputRCOPrescaler xRCOPrescaler)
group-Avnet 0:478cfd88041f 358 {
group-Avnet 0:478cfd88041f 359 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 360
group-Avnet 0:478cfd88041f 361 /* Check the parameters */
group-Avnet 0:478cfd88041f 362 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(xRCOPrescaler));
group-Avnet 0:478cfd88041f 363
group-Avnet 0:478cfd88041f 364 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 365 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 366
group-Avnet 0:478cfd88041f 367 /* Mask the RCO_RATIO field and writes the new value */
group-Avnet 0:478cfd88041f 368 tempRegValue &= 0xFE;
group-Avnet 0:478cfd88041f 369 tempRegValue |= ((uint8_t)xRCOPrescaler);
group-Avnet 0:478cfd88041f 370
group-Avnet 0:478cfd88041f 371 /* Writes the new RCO prescaler in the MCU_CLOCK register */
group-Avnet 0:478cfd88041f 372 g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 373
group-Avnet 0:478cfd88041f 374 }
group-Avnet 0:478cfd88041f 375
group-Avnet 0:478cfd88041f 376
group-Avnet 0:478cfd88041f 377 /**
group-Avnet 0:478cfd88041f 378 * @brief Returns the settled RCO prescaler as clock output.
group-Avnet 0:478cfd88041f 379 * @param None.
group-Avnet 0:478cfd88041f 380 * @retval ClockOutputRCOPrescaler Settled RCO prescaler used for clock
group-Avnet 0:478cfd88041f 381 * output. This parameter can be a value of @ref ClockOutputRCOPrescaler.
group-Avnet 0:478cfd88041f 382 */
group-Avnet 0:478cfd88041f 383 ClockOutputRCOPrescaler SpiritGpioGetRCOPrescaler(void)
group-Avnet 0:478cfd88041f 384 {
group-Avnet 0:478cfd88041f 385 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 386
group-Avnet 0:478cfd88041f 387 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 388 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 389
group-Avnet 0:478cfd88041f 390 /* Mask the RCO_RATIO field and returns the value */
group-Avnet 0:478cfd88041f 391 return ((ClockOutputRCOPrescaler)(tempRegValue & 0x01));
group-Avnet 0:478cfd88041f 392
group-Avnet 0:478cfd88041f 393 }
group-Avnet 0:478cfd88041f 394
group-Avnet 0:478cfd88041f 395
group-Avnet 0:478cfd88041f 396 /**
group-Avnet 0:478cfd88041f 397 * @brief Sets the RCO ratio as clock output.
group-Avnet 0:478cfd88041f 398 * @param xExtraCycles the number of extra clock cycles provided before switching
group-Avnet 0:478cfd88041f 399 * to STANDBY state. This parameter can be any value of @ref ExtraClockCycles .
group-Avnet 0:478cfd88041f 400 * @retval None.
group-Avnet 0:478cfd88041f 401 */
group-Avnet 0:478cfd88041f 402 void SpiritGpioSetExtraClockCycles(ExtraClockCycles xExtraCycles)
group-Avnet 0:478cfd88041f 403 {
group-Avnet 0:478cfd88041f 404 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 405
group-Avnet 0:478cfd88041f 406 /* Check the parameters */
group-Avnet 0:478cfd88041f 407 s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xExtraCycles));
group-Avnet 0:478cfd88041f 408
group-Avnet 0:478cfd88041f 409 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 410 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 411
group-Avnet 0:478cfd88041f 412 /* Mask the CLOCK_TAIL field and writes the new value */
group-Avnet 0:478cfd88041f 413 tempRegValue &= 0x9F;
group-Avnet 0:478cfd88041f 414 tempRegValue |= ((uint8_t)xExtraCycles);
group-Avnet 0:478cfd88041f 415
group-Avnet 0:478cfd88041f 416 /* Writes the new number of extra clock cycles in the MCU_CLOCK register */
group-Avnet 0:478cfd88041f 417 g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 418
group-Avnet 0:478cfd88041f 419 }
group-Avnet 0:478cfd88041f 420
group-Avnet 0:478cfd88041f 421
group-Avnet 0:478cfd88041f 422 /**
group-Avnet 0:478cfd88041f 423 * @brief Returns the settled RCO prescaler as clock output.
group-Avnet 0:478cfd88041f 424 * @param None.
group-Avnet 0:478cfd88041f 425 * @retval ExtraClockCycles Settled number of extra clock cycles
group-Avnet 0:478cfd88041f 426 * provided before switching to STANDBY state. This parameter can be
group-Avnet 0:478cfd88041f 427 * any value of @ref ExtraClockCycles .
group-Avnet 0:478cfd88041f 428 */
group-Avnet 0:478cfd88041f 429 ExtraClockCycles SpiritGpioGetExtraClockCycles(void)
group-Avnet 0:478cfd88041f 430 {
group-Avnet 0:478cfd88041f 431 uint8_t tempRegValue = 0x00;
group-Avnet 0:478cfd88041f 432
group-Avnet 0:478cfd88041f 433 /* Reads the MCU_CLK_CONFIG register */
group-Avnet 0:478cfd88041f 434 g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 435
group-Avnet 0:478cfd88041f 436 /* Mask the CLOCK_TAIL field and returns the value */
group-Avnet 0:478cfd88041f 437 return ((ExtraClockCycles)(tempRegValue & 0x60));
group-Avnet 0:478cfd88041f 438
group-Avnet 0:478cfd88041f 439 }
group-Avnet 0:478cfd88041f 440
group-Avnet 0:478cfd88041f 441
group-Avnet 0:478cfd88041f 442 /**
group-Avnet 0:478cfd88041f 443 * @}
group-Avnet 0:478cfd88041f 444 */
group-Avnet 0:478cfd88041f 445
group-Avnet 0:478cfd88041f 446
group-Avnet 0:478cfd88041f 447 /**
group-Avnet 0:478cfd88041f 448 * @}
group-Avnet 0:478cfd88041f 449 */
group-Avnet 0:478cfd88041f 450
group-Avnet 0:478cfd88041f 451
group-Avnet 0:478cfd88041f 452 /**
group-Avnet 0:478cfd88041f 453 * @}
group-Avnet 0:478cfd88041f 454 */
group-Avnet 0:478cfd88041f 455
group-Avnet 0:478cfd88041f 456
group-Avnet 0:478cfd88041f 457
group-Avnet 0:478cfd88041f 458 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/