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_Calibration.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 Configuration and management of SPIRIT VCO-RCO calibration.
group-Avnet 0:478cfd88041f 8 *
group-Avnet 0:478cfd88041f 9 * @attention
group-Avnet 0:478cfd88041f 10 *
group-Avnet 0:478cfd88041f 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
group-Avnet 0:478cfd88041f 12 *
group-Avnet 0:478cfd88041f 13 * Redistribution and use in source and binary forms, with or without modification,
group-Avnet 0:478cfd88041f 14 * are permitted provided that the following conditions are met:
group-Avnet 0:478cfd88041f 15 * 1. Redistributions of source code must retain the above copyright notice,
group-Avnet 0:478cfd88041f 16 * this list of conditions and the following disclaimer.
group-Avnet 0:478cfd88041f 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
group-Avnet 0:478cfd88041f 18 * this list of conditions and the following disclaimer in the documentation
group-Avnet 0:478cfd88041f 19 * and/or other materials provided with the distribution.
group-Avnet 0:478cfd88041f 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
group-Avnet 0:478cfd88041f 21 * may be used to endorse or promote products derived from this software
group-Avnet 0:478cfd88041f 22 * without specific prior written permission.
group-Avnet 0:478cfd88041f 23 *
group-Avnet 0:478cfd88041f 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
group-Avnet 0:478cfd88041f 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
group-Avnet 0:478cfd88041f 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
group-Avnet 0:478cfd88041f 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
group-Avnet 0:478cfd88041f 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
group-Avnet 0:478cfd88041f 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
group-Avnet 0:478cfd88041f 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
group-Avnet 0:478cfd88041f 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
group-Avnet 0:478cfd88041f 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
group-Avnet 0:478cfd88041f 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
group-Avnet 0:478cfd88041f 34 *
group-Avnet 0:478cfd88041f 35 ******************************************************************************
group-Avnet 0:478cfd88041f 36 */
group-Avnet 0:478cfd88041f 37
group-Avnet 0:478cfd88041f 38 /* Includes ------------------------------------------------------------------*/
group-Avnet 0:478cfd88041f 39 #include "SPIRIT_Calibration.h"
group-Avnet 0:478cfd88041f 40 #include "MCU_Interface.h"
group-Avnet 0:478cfd88041f 41
group-Avnet 0:478cfd88041f 42
group-Avnet 0:478cfd88041f 43
group-Avnet 0:478cfd88041f 44
group-Avnet 0:478cfd88041f 45 /**
group-Avnet 0:478cfd88041f 46 * @addtogroup SPIRIT_Libraries
group-Avnet 0:478cfd88041f 47 * @{
group-Avnet 0:478cfd88041f 48 */
group-Avnet 0:478cfd88041f 49
group-Avnet 0:478cfd88041f 50
group-Avnet 0:478cfd88041f 51 /**
group-Avnet 0:478cfd88041f 52 * @addtogroup SPIRIT_Calibration
group-Avnet 0:478cfd88041f 53 * @{
group-Avnet 0:478cfd88041f 54 */
group-Avnet 0:478cfd88041f 55
group-Avnet 0:478cfd88041f 56
group-Avnet 0:478cfd88041f 57 /**
group-Avnet 0:478cfd88041f 58 * @defgroup Calibration_Private_TypesDefinitions Calibration Private Types Definitions
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 */
group-Avnet 0:478cfd88041f 65
group-Avnet 0:478cfd88041f 66
group-Avnet 0:478cfd88041f 67 /**
group-Avnet 0:478cfd88041f 68 * @defgroup Calibration_Private_Defines Calibration Private Defines
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 */
group-Avnet 0:478cfd88041f 76
group-Avnet 0:478cfd88041f 77
group-Avnet 0:478cfd88041f 78 /**
group-Avnet 0:478cfd88041f 79 * @defgroup Calibration_Private_Macros Calibration Private Macros
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
group-Avnet 0:478cfd88041f 87
group-Avnet 0:478cfd88041f 88 /**
group-Avnet 0:478cfd88041f 89 * @defgroup Calibration_Private_Variables Calibration Private Variables
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
group-Avnet 0:478cfd88041f 98
group-Avnet 0:478cfd88041f 99 /**
group-Avnet 0:478cfd88041f 100 * @defgroup Calibration_Private_FunctionPrototypes Calibration Private Function Prototypes
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
group-Avnet 0:478cfd88041f 109 /**
group-Avnet 0:478cfd88041f 110 * @defgroup Calibration_Private_Functions Calibration Private Functions
group-Avnet 0:478cfd88041f 111 * @{
group-Avnet 0:478cfd88041f 112 */
group-Avnet 0:478cfd88041f 113
group-Avnet 0:478cfd88041f 114 /**
group-Avnet 0:478cfd88041f 115 * @brief Enables or Disables the RCO calibration.
group-Avnet 0:478cfd88041f 116 * @param xNewState new state for RCO calibration.
group-Avnet 0:478cfd88041f 117 This parameter can be S_ENABLE or S_DISABLE.
group-Avnet 0:478cfd88041f 118 * @retval None.
group-Avnet 0:478cfd88041f 119 */
group-Avnet 0:478cfd88041f 120 void SpiritCalibrationRco(SpiritFunctionalState xNewState)
group-Avnet 0:478cfd88041f 121 {
group-Avnet 0:478cfd88041f 122 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 123
group-Avnet 0:478cfd88041f 124 /* Check the parameters */
group-Avnet 0:478cfd88041f 125 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
group-Avnet 0:478cfd88041f 126
group-Avnet 0:478cfd88041f 127 /* Reads the register value */
group-Avnet 0:478cfd88041f 128 g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 129
group-Avnet 0:478cfd88041f 130 /* Build new value for the register */
group-Avnet 0:478cfd88041f 131 if(xNewState==S_ENABLE)
group-Avnet 0:478cfd88041f 132 {
group-Avnet 0:478cfd88041f 133 tempRegValue |= PROTOCOL2_RCO_CALIBRATION_MASK;
group-Avnet 0:478cfd88041f 134 }
group-Avnet 0:478cfd88041f 135 else
group-Avnet 0:478cfd88041f 136 {
group-Avnet 0:478cfd88041f 137 tempRegValue &= ~PROTOCOL2_RCO_CALIBRATION_MASK;
group-Avnet 0:478cfd88041f 138 }
group-Avnet 0:478cfd88041f 139
group-Avnet 0:478cfd88041f 140 /* Writes register to enable or disable the RCO calibration */
group-Avnet 0:478cfd88041f 141 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 142
group-Avnet 0:478cfd88041f 143 }
group-Avnet 0:478cfd88041f 144
group-Avnet 0:478cfd88041f 145
group-Avnet 0:478cfd88041f 146 /**
group-Avnet 0:478cfd88041f 147 * @brief Enables or Disables the VCO calibration.
group-Avnet 0:478cfd88041f 148 * @param xNewState new state for VCO calibration.
group-Avnet 0:478cfd88041f 149 This parameter can be S_ENABLE or S_DISABLE.
group-Avnet 0:478cfd88041f 150 * @retval None.
group-Avnet 0:478cfd88041f 151 */
group-Avnet 0:478cfd88041f 152 void SpiritCalibrationVco(SpiritFunctionalState xNewState)
group-Avnet 0:478cfd88041f 153 {
group-Avnet 0:478cfd88041f 154 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 155
group-Avnet 0:478cfd88041f 156 /* Check the parameters */
group-Avnet 0:478cfd88041f 157 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
group-Avnet 0:478cfd88041f 158
group-Avnet 0:478cfd88041f 159 /* Reads the register value */
group-Avnet 0:478cfd88041f 160 g_xStatus = SpiritSpiReadRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 161
group-Avnet 0:478cfd88041f 162 /* Build new value for the register */
group-Avnet 0:478cfd88041f 163 if(xNewState==S_ENABLE)
group-Avnet 0:478cfd88041f 164 tempRegValue |= PROTOCOL2_VCO_CALIBRATION_MASK;
group-Avnet 0:478cfd88041f 165 else
group-Avnet 0:478cfd88041f 166 tempRegValue &= ~PROTOCOL2_VCO_CALIBRATION_MASK;
group-Avnet 0:478cfd88041f 167
group-Avnet 0:478cfd88041f 168 /* Writes register to enable or disable the VCO calibration */
group-Avnet 0:478cfd88041f 169 g_xStatus = SpiritSpiWriteRegisters(PROTOCOL2_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 170
group-Avnet 0:478cfd88041f 171 }
group-Avnet 0:478cfd88041f 172
group-Avnet 0:478cfd88041f 173
group-Avnet 0:478cfd88041f 174 /**
group-Avnet 0:478cfd88041f 175 * @brief Sets the RCO calibration words.
group-Avnet 0:478cfd88041f 176 * @param cRwt RWT word for RCO calibration.
group-Avnet 0:478cfd88041f 177 * This parameter can be a value of uint8_t.
group-Avnet 0:478cfd88041f 178 * @param cRfb RFB word for RCO calibration.
group-Avnet 0:478cfd88041f 179 * This parameter can be a value of uint8_t.
group-Avnet 0:478cfd88041f 180 * @retval None.
group-Avnet 0:478cfd88041f 181 */
group-Avnet 0:478cfd88041f 182 void SpiritCalibrationSetRcoCalWords(uint8_t cRwt, uint8_t cRfb)
group-Avnet 0:478cfd88041f 183 {
group-Avnet 0:478cfd88041f 184 uint8_t tempRegValue[2];
group-Avnet 0:478cfd88041f 185
group-Avnet 0:478cfd88041f 186 /* Build the value of RWT and the MSbits of the RFB word */
group-Avnet 0:478cfd88041f 187 tempRegValue[0] = (cRwt << 4) | (cRfb >> 1);
group-Avnet 0:478cfd88041f 188
group-Avnet 0:478cfd88041f 189 /* Reads the register value to update the LSbit of RFB */
group-Avnet 0:478cfd88041f 190 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue[1]);
group-Avnet 0:478cfd88041f 191
group-Avnet 0:478cfd88041f 192 /* Build new value for the register */
group-Avnet 0:478cfd88041f 193 tempRegValue[1] = (tempRegValue[1] & 0x7F) | (cRfb<<7);
group-Avnet 0:478cfd88041f 194
group-Avnet 0:478cfd88041f 195 /* Writes the new value for RCO calibration words */
group-Avnet 0:478cfd88041f 196 g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN2_BASE, 2, tempRegValue);
group-Avnet 0:478cfd88041f 197
group-Avnet 0:478cfd88041f 198 }
group-Avnet 0:478cfd88041f 199
group-Avnet 0:478cfd88041f 200
group-Avnet 0:478cfd88041f 201 /**
group-Avnet 0:478cfd88041f 202 * @brief Returns the RCO calibration words.
group-Avnet 0:478cfd88041f 203 * @param pcRwt pointer to the variable in which the RWT word has to be stored.
group-Avnet 0:478cfd88041f 204 * This parameter is a variable of uint8_t*.
group-Avnet 0:478cfd88041f 205 * @param pcRfb pointer to the variable in which the RFB word has to be stored.
group-Avnet 0:478cfd88041f 206 * This parameter is a variable of uint8_t*.
group-Avnet 0:478cfd88041f 207 * @retval None.
group-Avnet 0:478cfd88041f 208 */
group-Avnet 0:478cfd88041f 209 void SpiritCalibrationGetRcoCalWords(uint8_t* pcRwt, uint8_t* pcRfb)
group-Avnet 0:478cfd88041f 210 {
group-Avnet 0:478cfd88041f 211 uint8_t tempRegValue[2];
group-Avnet 0:478cfd88041f 212
group-Avnet 0:478cfd88041f 213 /* Reads the registers values */
group-Avnet 0:478cfd88041f 214 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_OUT1_BASE, 2, tempRegValue);
group-Avnet 0:478cfd88041f 215
group-Avnet 0:478cfd88041f 216 /* Build the RWT value */
group-Avnet 0:478cfd88041f 217 (*pcRwt) = tempRegValue[0] >> 4;
group-Avnet 0:478cfd88041f 218 /* Build the RFB value */
group-Avnet 0:478cfd88041f 219 (*pcRfb) = (tempRegValue[0] & 0x0F)<<1 | (tempRegValue[1]>>7);
group-Avnet 0:478cfd88041f 220
group-Avnet 0:478cfd88041f 221 }
group-Avnet 0:478cfd88041f 222
group-Avnet 0:478cfd88041f 223
group-Avnet 0:478cfd88041f 224 /**
group-Avnet 0:478cfd88041f 225 * @brief Returns the VCO calibration data from internal VCO calibrator.
group-Avnet 0:478cfd88041f 226 * @param None.
group-Avnet 0:478cfd88041f 227 * @retval uint8_t VCO calibration data word.
group-Avnet 0:478cfd88041f 228 */
group-Avnet 0:478cfd88041f 229 uint8_t SpiritCalibrationGetVcoCalData(void)
group-Avnet 0:478cfd88041f 230 {
group-Avnet 0:478cfd88041f 231 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 232
group-Avnet 0:478cfd88041f 233 /* Reads the register value */
group-Avnet 0:478cfd88041f 234 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_OUT0_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 235
group-Avnet 0:478cfd88041f 236 /* Build and returns the VCO calibration data value */
group-Avnet 0:478cfd88041f 237 return (tempRegValue & 0x7F);
group-Avnet 0:478cfd88041f 238
group-Avnet 0:478cfd88041f 239 }
group-Avnet 0:478cfd88041f 240
group-Avnet 0:478cfd88041f 241
group-Avnet 0:478cfd88041f 242 /**
group-Avnet 0:478cfd88041f 243 * @brief Sets the VCO calibration data to be used in TX mode.
group-Avnet 0:478cfd88041f 244 * @param cVcoCalData calibration data word to be set.
group-Avnet 0:478cfd88041f 245 * This parameter is a variable of uint8_t.
group-Avnet 0:478cfd88041f 246 * @retval None.
group-Avnet 0:478cfd88041f 247 */
group-Avnet 0:478cfd88041f 248 void SpiritCalibrationSetVcoCalDataTx(uint8_t cVcoCalData)
group-Avnet 0:478cfd88041f 249 {
group-Avnet 0:478cfd88041f 250 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 251
group-Avnet 0:478cfd88041f 252 /* Reads the register value */
group-Avnet 0:478cfd88041f 253 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 254
group-Avnet 0:478cfd88041f 255 /* Build the value to be written */
group-Avnet 0:478cfd88041f 256 tempRegValue &= 0x80;
group-Avnet 0:478cfd88041f 257 tempRegValue |= cVcoCalData;
group-Avnet 0:478cfd88041f 258
group-Avnet 0:478cfd88041f 259 /* Writes the new value of calibration data in TX */
group-Avnet 0:478cfd88041f 260 g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 261
group-Avnet 0:478cfd88041f 262 }
group-Avnet 0:478cfd88041f 263
group-Avnet 0:478cfd88041f 264
group-Avnet 0:478cfd88041f 265 /**
group-Avnet 0:478cfd88041f 266 * @brief Returns the actual VCO calibration data used in TX mode.
group-Avnet 0:478cfd88041f 267 * @param None.
group-Avnet 0:478cfd88041f 268 * @retval uint8_t Calibration data word used in TX mode.
group-Avnet 0:478cfd88041f 269 */
group-Avnet 0:478cfd88041f 270 uint8_t SpiritCalibrationGetVcoCalDataTx(void)
group-Avnet 0:478cfd88041f 271 {
group-Avnet 0:478cfd88041f 272 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 273
group-Avnet 0:478cfd88041f 274 /* Reads the register containing the calibration data word used in TX mode */
group-Avnet 0:478cfd88041f 275 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 276
group-Avnet 0:478cfd88041f 277 /* Mask the VCO_CALIBR_TX field and returns the value */
group-Avnet 0:478cfd88041f 278 return (tempRegValue & 0x7F);
group-Avnet 0:478cfd88041f 279
group-Avnet 0:478cfd88041f 280 }
group-Avnet 0:478cfd88041f 281
group-Avnet 0:478cfd88041f 282
group-Avnet 0:478cfd88041f 283 /**
group-Avnet 0:478cfd88041f 284 * @brief Sets the VCO calibration data to be used in RX mode.
group-Avnet 0:478cfd88041f 285 * @param cVcoCalData calibration data word to be set.
group-Avnet 0:478cfd88041f 286 * This parameter is a variable of uint8_t.
group-Avnet 0:478cfd88041f 287 * @retval None.
group-Avnet 0:478cfd88041f 288 */
group-Avnet 0:478cfd88041f 289 void SpiritCalibrationSetVcoCalDataRx(uint8_t cVcoCalData)
group-Avnet 0:478cfd88041f 290 {
group-Avnet 0:478cfd88041f 291 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 292
group-Avnet 0:478cfd88041f 293 /* Reads the register value */
group-Avnet 0:478cfd88041f 294 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN0_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 295
group-Avnet 0:478cfd88041f 296 /* Build the value to be written */
group-Avnet 0:478cfd88041f 297 tempRegValue &= 0x80;
group-Avnet 0:478cfd88041f 298 tempRegValue |= cVcoCalData;
group-Avnet 0:478cfd88041f 299
group-Avnet 0:478cfd88041f 300 /* Writes the new value of calibration data in RX */
group-Avnet 0:478cfd88041f 301 g_xStatus = SpiritSpiWriteRegisters(RCO_VCO_CALIBR_IN0_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 Returns the actual VCO calibration data used in RX mode.
group-Avnet 0:478cfd88041f 308 * @param None.
group-Avnet 0:478cfd88041f 309 * @retval uint8_t Calibration data word used in RX mode.
group-Avnet 0:478cfd88041f 310 */
group-Avnet 0:478cfd88041f 311 uint8_t SpiritCalibrationGetVcoCalDataRx(void)
group-Avnet 0:478cfd88041f 312 {
group-Avnet 0:478cfd88041f 313 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 314
group-Avnet 0:478cfd88041f 315 /* Reads the register containing the calibration data word used in TX mode */
group-Avnet 0:478cfd88041f 316 g_xStatus = SpiritSpiReadRegisters(RCO_VCO_CALIBR_IN0_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 317
group-Avnet 0:478cfd88041f 318 /* Mask the VCO_CALIBR_RX field and returns the value */
group-Avnet 0:478cfd88041f 319 return (tempRegValue & 0x7F);
group-Avnet 0:478cfd88041f 320
group-Avnet 0:478cfd88041f 321 }
group-Avnet 0:478cfd88041f 322
group-Avnet 0:478cfd88041f 323
group-Avnet 0:478cfd88041f 324 /**
group-Avnet 0:478cfd88041f 325 * @brief Sets the VCO calibration window.
group-Avnet 0:478cfd88041f 326 * @param xRefWord value of REFWORD corresponding to the Ref_period according to the formula: CALIBRATION_WIN = 11*Ref_period/fxo.
group-Avnet 0:478cfd88041f 327 This parameter can be a value of @ref VcoWin.
group-Avnet 0:478cfd88041f 328 * @retval None.
group-Avnet 0:478cfd88041f 329 */
group-Avnet 0:478cfd88041f 330 void SpiritCalibrationSetVcoWindow(VcoWin xRefWord)
group-Avnet 0:478cfd88041f 331 {
group-Avnet 0:478cfd88041f 332 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 333
group-Avnet 0:478cfd88041f 334 /* Check the parameters */
group-Avnet 0:478cfd88041f 335 s_assert_param(IS_VCO_WIN(xRefWord));
group-Avnet 0:478cfd88041f 336
group-Avnet 0:478cfd88041f 337 /* Reads the register value */
group-Avnet 0:478cfd88041f 338 g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 339
group-Avnet 0:478cfd88041f 340 /* Build the values to be written */
group-Avnet 0:478cfd88041f 341 tempRegValue &= 0xFC;
group-Avnet 0:478cfd88041f 342 tempRegValue |= xRefWord;
group-Avnet 0:478cfd88041f 343
group-Avnet 0:478cfd88041f 344 /* Writes the new value of VCO calibration window */
group-Avnet 0:478cfd88041f 345 g_xStatus = SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 346
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 * @brief Returns the VCO calibration window.
group-Avnet 0:478cfd88041f 352 * @param None.
group-Avnet 0:478cfd88041f 353 * @retval VcoWin Value of REFWORD corresponding to the Ref_period according to the formula: CALIBRATION_WIN = 11*Ref_period/fxo.
group-Avnet 0:478cfd88041f 354 * This parameter can be a value of @ref VcoWin.
group-Avnet 0:478cfd88041f 355 */
group-Avnet 0:478cfd88041f 356 VcoWin SpiritCalibrationGetVcoWindow(void)
group-Avnet 0:478cfd88041f 357 {
group-Avnet 0:478cfd88041f 358 uint8_t tempRegValue1, tempRegValue2;
group-Avnet 0:478cfd88041f 359 VcoWin refWord;
group-Avnet 0:478cfd88041f 360
group-Avnet 0:478cfd88041f 361 /* Reads the register containing the REFWORD value */
group-Avnet 0:478cfd88041f 362 g_xStatus = SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue1);
group-Avnet 0:478cfd88041f 363
group-Avnet 0:478cfd88041f 364 /* Reads the Xtal configuration */
group-Avnet 0:478cfd88041f 365 g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue2);
group-Avnet 0:478cfd88041f 366
group-Avnet 0:478cfd88041f 367 /* Mask the REFWORD field */
group-Avnet 0:478cfd88041f 368 tempRegValue1 &= 0x03;
group-Avnet 0:478cfd88041f 369
group-Avnet 0:478cfd88041f 370 /* Mask the 24_26_MHz_SELECT field */
group-Avnet 0:478cfd88041f 371 tempRegValue2 = ((tempRegValue2 & 0x40)>>6);
group-Avnet 0:478cfd88041f 372
group-Avnet 0:478cfd88041f 373 /* In case of 26 MHz crystal */
group-Avnet 0:478cfd88041f 374 if(tempRegValue2)
group-Avnet 0:478cfd88041f 375 {
group-Avnet 0:478cfd88041f 376 switch(tempRegValue1)
group-Avnet 0:478cfd88041f 377 {
group-Avnet 0:478cfd88041f 378 case 0:
group-Avnet 0:478cfd88041f 379 refWord = CALIB_TIME_6_77_US_26MHZ;
group-Avnet 0:478cfd88041f 380 break;
group-Avnet 0:478cfd88041f 381 case 1:
group-Avnet 0:478cfd88041f 382 refWord = CALIB_TIME_13_54_US_26MHZ;
group-Avnet 0:478cfd88041f 383 break;
group-Avnet 0:478cfd88041f 384 case 2:
group-Avnet 0:478cfd88041f 385 refWord = CALIB_TIME_27_08_US_26MHZ;
group-Avnet 0:478cfd88041f 386 break;
group-Avnet 0:478cfd88041f 387 case 3:
group-Avnet 0:478cfd88041f 388 refWord = CALIB_TIME_54_15_US_26MHZ;
group-Avnet 0:478cfd88041f 389 break;
group-Avnet 0:478cfd88041f 390 }
group-Avnet 0:478cfd88041f 391 }
group-Avnet 0:478cfd88041f 392
group-Avnet 0:478cfd88041f 393 /* In case of 24 MHz crystal */
group-Avnet 0:478cfd88041f 394 else
group-Avnet 0:478cfd88041f 395 {
group-Avnet 0:478cfd88041f 396 switch(tempRegValue1)
group-Avnet 0:478cfd88041f 397 {
group-Avnet 0:478cfd88041f 398 case 0:
group-Avnet 0:478cfd88041f 399 refWord = CALIB_TIME_7_33_US_24MHZ;
group-Avnet 0:478cfd88041f 400 break;
group-Avnet 0:478cfd88041f 401 case 1:
group-Avnet 0:478cfd88041f 402 refWord = CALIB_TIME_14_67_US_24MHZ;
group-Avnet 0:478cfd88041f 403 break;
group-Avnet 0:478cfd88041f 404 case 2:
group-Avnet 0:478cfd88041f 405 refWord = CALIB_TIME_29_33_US_24MHZ;
group-Avnet 0:478cfd88041f 406 break;
group-Avnet 0:478cfd88041f 407 case 3:
group-Avnet 0:478cfd88041f 408 refWord = CALIB_TIME_58_67_US_24MHZ;
group-Avnet 0:478cfd88041f 409 break;
group-Avnet 0:478cfd88041f 410 }
group-Avnet 0:478cfd88041f 411 }
group-Avnet 0:478cfd88041f 412
group-Avnet 0:478cfd88041f 413 return refWord;
group-Avnet 0:478cfd88041f 414
group-Avnet 0:478cfd88041f 415 }
group-Avnet 0:478cfd88041f 416
group-Avnet 0:478cfd88041f 417 /**
group-Avnet 0:478cfd88041f 418 * @brief Selects a VCO.
group-Avnet 0:478cfd88041f 419 * @param xVco can be VCO_H or VCO_L according to which VCO select.
group-Avnet 0:478cfd88041f 420 * This parameter can be a value of @ref VcoSel.
group-Avnet 0:478cfd88041f 421 * @retval None.
group-Avnet 0:478cfd88041f 422 */
group-Avnet 0:478cfd88041f 423 void SpiritCalibrationSelectVco(VcoSel xVco)
group-Avnet 0:478cfd88041f 424 {
group-Avnet 0:478cfd88041f 425 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 426
group-Avnet 0:478cfd88041f 427 /* Check the parameter */
group-Avnet 0:478cfd88041f 428 s_assert_param(IS_VCO_SEL(xVco));
group-Avnet 0:478cfd88041f 429
group-Avnet 0:478cfd88041f 430 SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 431
group-Avnet 0:478cfd88041f 432 tempRegValue &= 0xF9;
group-Avnet 0:478cfd88041f 433
group-Avnet 0:478cfd88041f 434 if(xVco == VCO_H)
group-Avnet 0:478cfd88041f 435 {
group-Avnet 0:478cfd88041f 436 tempRegValue |= 0x02;
group-Avnet 0:478cfd88041f 437
group-Avnet 0:478cfd88041f 438 }
group-Avnet 0:478cfd88041f 439 else
group-Avnet 0:478cfd88041f 440 {
group-Avnet 0:478cfd88041f 441 tempRegValue |= 0x04;
group-Avnet 0:478cfd88041f 442 }
group-Avnet 0:478cfd88041f 443 SpiritSpiWriteRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
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 * @brief Returns the VCO selected.
group-Avnet 0:478cfd88041f 451 * @param void.
group-Avnet 0:478cfd88041f 452 * @retval VCO_H or VCO_L according to which VCO selected.
group-Avnet 0:478cfd88041f 453 * This parameter can be a value of @ref VcoSel.
group-Avnet 0:478cfd88041f 454 */
group-Avnet 0:478cfd88041f 455 VcoSel SpiritCalibrationGetVcoSelecttion(void)
group-Avnet 0:478cfd88041f 456 {
group-Avnet 0:478cfd88041f 457 uint8_t tempRegValue;
group-Avnet 0:478cfd88041f 458
group-Avnet 0:478cfd88041f 459 SpiritSpiReadRegisters(SYNTH_CONFIG1_BASE, 1, &tempRegValue);
group-Avnet 0:478cfd88041f 460
group-Avnet 0:478cfd88041f 461 tempRegValue = (tempRegValue>>1)&0x3;
group-Avnet 0:478cfd88041f 462
group-Avnet 0:478cfd88041f 463 if(tempRegValue == 0x01)
group-Avnet 0:478cfd88041f 464 {
group-Avnet 0:478cfd88041f 465 return VCO_H;
group-Avnet 0:478cfd88041f 466
group-Avnet 0:478cfd88041f 467 }
group-Avnet 0:478cfd88041f 468 else
group-Avnet 0:478cfd88041f 469 {
group-Avnet 0:478cfd88041f 470 return VCO_L;
group-Avnet 0:478cfd88041f 471 }
group-Avnet 0:478cfd88041f 472
group-Avnet 0:478cfd88041f 473 }
group-Avnet 0:478cfd88041f 474
group-Avnet 0:478cfd88041f 475
group-Avnet 0:478cfd88041f 476 /**
group-Avnet 0:478cfd88041f 477 *@}
group-Avnet 0:478cfd88041f 478 */
group-Avnet 0:478cfd88041f 479
group-Avnet 0:478cfd88041f 480 /**
group-Avnet 0:478cfd88041f 481 *@}
group-Avnet 0:478cfd88041f 482 */
group-Avnet 0:478cfd88041f 483
group-Avnet 0:478cfd88041f 484
group-Avnet 0:478cfd88041f 485 /**
group-Avnet 0:478cfd88041f 486 *@}
group-Avnet 0:478cfd88041f 487 */
group-Avnet 0:478cfd88041f 488
group-Avnet 0:478cfd88041f 489
group-Avnet 0:478cfd88041f 490
group-Avnet 0:478cfd88041f 491 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/