센서보드 RF IRQ 테스트 중

Fork of stm-spirit1-rf-driver by ST

Committer:
jmhong
Date:
Thu Sep 20 04:46:49 2018 +0000
Revision:
85:4ca74d007fe7
Parent:
84:45b9ff78a066
Environmental test.. temp, etc...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 67:93bec0baf1de 1 /**
Wolfgang Betz 67:93bec0baf1de 2 ******************************************************************************
Wolfgang Betz 67:93bec0baf1de 3 * @file SPIRIT_Management.c
Wolfgang Betz 67:93bec0baf1de 4 * @author VMA division - AMS
Wolfgang Betz 67:93bec0baf1de 5 * @version 3.2.2
Wolfgang Betz 67:93bec0baf1de 6 * @date 08-July-2015
Wolfgang Betz 67:93bec0baf1de 7 * @brief The management layer for SPIRIT1 library.
Wolfgang Betz 67:93bec0baf1de 8 * @details
Wolfgang Betz 67:93bec0baf1de 9 *
Wolfgang Betz 67:93bec0baf1de 10 * @attention
Wolfgang Betz 67:93bec0baf1de 11 *
Wolfgang Betz 67:93bec0baf1de 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Wolfgang Betz 67:93bec0baf1de 13 *
Wolfgang Betz 67:93bec0baf1de 14 * Redistribution and use in source and binary forms, with or without modification,
Wolfgang Betz 67:93bec0baf1de 15 * are permitted provided that the following conditions are met:
Wolfgang Betz 67:93bec0baf1de 16 * 1. Redistributions of source code must retain the above copyright notice,
Wolfgang Betz 67:93bec0baf1de 17 * this list of conditions and the following disclaimer.
Wolfgang Betz 67:93bec0baf1de 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Wolfgang Betz 67:93bec0baf1de 19 * this list of conditions and the following disclaimer in the documentation
Wolfgang Betz 67:93bec0baf1de 20 * and/or other materials provided with the distribution.
Wolfgang Betz 67:93bec0baf1de 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Wolfgang Betz 67:93bec0baf1de 22 * may be used to endorse or promote products derived from this software
Wolfgang Betz 67:93bec0baf1de 23 * without specific prior written permission.
Wolfgang Betz 67:93bec0baf1de 24 *
Wolfgang Betz 67:93bec0baf1de 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Wolfgang Betz 67:93bec0baf1de 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Wolfgang Betz 67:93bec0baf1de 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Wolfgang Betz 67:93bec0baf1de 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Wolfgang Betz 67:93bec0baf1de 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Wolfgang Betz 67:93bec0baf1de 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Wolfgang Betz 67:93bec0baf1de 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Wolfgang Betz 67:93bec0baf1de 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Wolfgang Betz 67:93bec0baf1de 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Wolfgang Betz 67:93bec0baf1de 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wolfgang Betz 67:93bec0baf1de 35 *
Wolfgang Betz 67:93bec0baf1de 36 ******************************************************************************
Wolfgang Betz 67:93bec0baf1de 37 */
Wolfgang Betz 67:93bec0baf1de 38
Wolfgang Betz 67:93bec0baf1de 39 /* Includes ------------------------------------------------------------------*/
Wolfgang Betz 67:93bec0baf1de 40 #include "SPIRIT_Management.h"
Wolfgang Betz 67:93bec0baf1de 41
Wolfgang Betz 67:93bec0baf1de 42 /**
Wolfgang Betz 67:93bec0baf1de 43 * @addtogroup SPIRIT_Libraries
Wolfgang Betz 67:93bec0baf1de 44 * @{
Wolfgang Betz 67:93bec0baf1de 45 */
Wolfgang Betz 67:93bec0baf1de 46
Wolfgang Betz 67:93bec0baf1de 47
Wolfgang Betz 67:93bec0baf1de 48 /**
Wolfgang Betz 67:93bec0baf1de 49 * @defgroup SPIRIT_MANAGEMENT SPIRIT Management
Wolfgang Betz 67:93bec0baf1de 50 * @{
Wolfgang Betz 67:93bec0baf1de 51 */
Wolfgang Betz 67:93bec0baf1de 52
jmhong 84:45b9ff78a066 53
jmhong 84:45b9ff78a066 54
jmhong 84:45b9ff78a066 55 //180619 HJM : init 재시작을 위한 카운팅 변수
jmhong 84:45b9ff78a066 56 static int iSpiritManagementErrorCounting = 0;
jmhong 85:4ca74d007fe7 57 #define MAX_ERROR_COUNTING 3
jmhong 84:45b9ff78a066 58 #define RETURN_ERROR_NUMBER 100
jmhong 84:45b9ff78a066 59
jmhong 84:45b9ff78a066 60
Wolfgang Betz 67:93bec0baf1de 61 /**
Wolfgang Betz 67:93bec0baf1de 62 * @brief BS value to write in the SYNT0 register according to the selected band
Wolfgang Betz 67:93bec0baf1de 63 */
Wolfgang Betz 67:93bec0baf1de 64 static const uint8_t s_vectcBandRegValue[4]={SYNT0_BS_6, SYNT0_BS_12, SYNT0_BS_16, SYNT0_BS_32};
Wolfgang Betz 67:93bec0baf1de 65
Wolfgang Betz 67:93bec0baf1de 66 #define COMMUNICATION_STATE_TX 0
Wolfgang Betz 67:93bec0baf1de 67 #define COMMUNICATION_STATE_RX 1
Wolfgang Betz 67:93bec0baf1de 68 #define COMMUNICATION_STATE_NONE 2
Wolfgang Betz 67:93bec0baf1de 69
Wolfgang Betz 67:93bec0baf1de 70 static uint32_t s_nDesiredFrequency;
Wolfgang Betz 67:93bec0baf1de 71
Wolfgang Betz 67:93bec0baf1de 72 static volatile uint8_t s_cCommunicationState = COMMUNICATION_STATE_NONE;
Wolfgang Betz 67:93bec0baf1de 73
Wolfgang Betz 67:93bec0baf1de 74
Wolfgang Betz 67:93bec0baf1de 75 /**
Wolfgang Betz 67:93bec0baf1de 76 * @brief Factor is: B/2 used in the formula for SYNTH word calculation
Wolfgang Betz 67:93bec0baf1de 77 */
Wolfgang Betz 67:93bec0baf1de 78 static const uint8_t s_vectcBHalfFactor[4]={(HIGH_BAND_FACTOR/2), (MIDDLE_BAND_FACTOR/2), (LOW_BAND_FACTOR/2), (VERY_LOW_BAND_FACTOR/2)};
Wolfgang Betz 67:93bec0baf1de 79
Wolfgang Betz 67:93bec0baf1de 80
Wolfgang Betz 67:93bec0baf1de 81 /**
Wolfgang Betz 67:93bec0baf1de 82 * @defgroup SPIRIT_MANAGEMENT_FUNCTIONS SPIRIT Management Functions
Wolfgang Betz 67:93bec0baf1de 83 * @{
Wolfgang Betz 67:93bec0baf1de 84 */
Wolfgang Betz 67:93bec0baf1de 85
Wolfgang Betz 67:93bec0baf1de 86
Wolfgang Betz 67:93bec0baf1de 87 /**
Wolfgang Betz 67:93bec0baf1de 88 * @defgroup WORKAROUND_FUNCTIONS SPIRIT Management Workaround Functions
Wolfgang Betz 67:93bec0baf1de 89 * @{
Wolfgang Betz 67:93bec0baf1de 90 */
Wolfgang Betz 67:93bec0baf1de 91
Wolfgang Betz 67:93bec0baf1de 92 /**
Wolfgang Betz 67:93bec0baf1de 93 * @brief Private SpiritRadioSetFrequencyBase function only used in SpiritManagementWaVcoCalibration.
Wolfgang Betz 67:93bec0baf1de 94 * @param lFBase the base carrier frequency expressed in Hz as unsigned word.
Wolfgang Betz 67:93bec0baf1de 95 * @retval None.
Wolfgang Betz 67:93bec0baf1de 96 */
jmhong 84:45b9ff78a066 97 int SpiritManagementSetFrequencyBase(uint32_t lFBase)
Wolfgang Betz 67:93bec0baf1de 98 {
Wolfgang Betz 67:93bec0baf1de 99 uint32_t synthWord, Fc;
Wolfgang Betz 67:93bec0baf1de 100 uint8_t band = 0, anaRadioRegArray[4], wcp;
Wolfgang Betz 67:93bec0baf1de 101
jmhong 84:45b9ff78a066 102 int iRet = 0;
jmhong 84:45b9ff78a066 103
Wolfgang Betz 67:93bec0baf1de 104 /* Check the parameter */
jmhong 84:45b9ff78a066 105 iRet = s_assert_param(IS_FREQUENCY_BAND(lFBase));
jmhong 84:45b9ff78a066 106 if (RETURN_ERROR_NUMBER == iRet)
jmhong 84:45b9ff78a066 107 {
jmhong 84:45b9ff78a066 108 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 109 }
Wolfgang Betz 67:93bec0baf1de 110
Wolfgang Betz 67:93bec0baf1de 111 /* Search the operating band */
Wolfgang Betz 67:93bec0baf1de 112 if(IS_FREQUENCY_BAND_HIGH(lFBase))
Wolfgang Betz 67:93bec0baf1de 113 {
Wolfgang Betz 67:93bec0baf1de 114 band = HIGH_BAND;
Wolfgang Betz 67:93bec0baf1de 115 }
Wolfgang Betz 67:93bec0baf1de 116 else if(IS_FREQUENCY_BAND_MIDDLE(lFBase))
Wolfgang Betz 67:93bec0baf1de 117 {
Wolfgang Betz 67:93bec0baf1de 118 band = MIDDLE_BAND;
Wolfgang Betz 67:93bec0baf1de 119 }
Wolfgang Betz 67:93bec0baf1de 120 else if(IS_FREQUENCY_BAND_LOW(lFBase))
Wolfgang Betz 67:93bec0baf1de 121 {
Wolfgang Betz 67:93bec0baf1de 122 band = LOW_BAND;
Wolfgang Betz 67:93bec0baf1de 123 }
Wolfgang Betz 67:93bec0baf1de 124 else if(IS_FREQUENCY_BAND_VERY_LOW(lFBase))
Wolfgang Betz 67:93bec0baf1de 125 {
Wolfgang Betz 67:93bec0baf1de 126 band = VERY_LOW_BAND;
Wolfgang Betz 67:93bec0baf1de 127 }
Wolfgang Betz 67:93bec0baf1de 128
Wolfgang Betz 67:93bec0baf1de 129 int32_t FOffset = SpiritRadioGetFrequencyOffset();
Wolfgang Betz 67:93bec0baf1de 130 uint32_t lChannelSpace = SpiritRadioGetChannelSpace();
Wolfgang Betz 67:93bec0baf1de 131 uint8_t cChannelNum = SpiritRadioGetChannel();
Wolfgang Betz 67:93bec0baf1de 132
Wolfgang Betz 67:93bec0baf1de 133 /* Calculates the channel center frequency */
Wolfgang Betz 67:93bec0baf1de 134 Fc = lFBase + FOffset + lChannelSpace*cChannelNum;
jmhong 84:45b9ff78a066 135 //180619 HJM : 여기까지는 spirit1 의 상태값을 그냥 한번만 spi 통신으로 읽어와 저장함.
jmhong 84:45b9ff78a066 136
jmhong 84:45b9ff78a066 137
jmhong 84:45b9ff78a066 138
jmhong 84:45b9ff78a066 139
jmhong 84:45b9ff78a066 140
jmhong 84:45b9ff78a066 141
Wolfgang Betz 67:93bec0baf1de 142
Wolfgang Betz 67:93bec0baf1de 143 /* Reads the reference divider */
Wolfgang Betz 67:93bec0baf1de 144 uint8_t cRefDiv = (uint8_t)SpiritRadioGetRefDiv()+1;
Wolfgang Betz 67:93bec0baf1de 145
Wolfgang Betz 67:93bec0baf1de 146 switch(band)
Wolfgang Betz 67:93bec0baf1de 147 {
Wolfgang Betz 67:93bec0baf1de 148 case VERY_LOW_BAND:
Wolfgang Betz 67:93bec0baf1de 149 if(Fc<161281250)
Wolfgang Betz 67:93bec0baf1de 150 {
Wolfgang Betz 67:93bec0baf1de 151 SpiritCalibrationSelectVco(VCO_L);
Wolfgang Betz 67:93bec0baf1de 152 }
Wolfgang Betz 67:93bec0baf1de 153 else
Wolfgang Betz 67:93bec0baf1de 154 {
Wolfgang Betz 67:93bec0baf1de 155 SpiritCalibrationSelectVco(VCO_H);
Wolfgang Betz 67:93bec0baf1de 156 }
Wolfgang Betz 67:93bec0baf1de 157 break;
Wolfgang Betz 67:93bec0baf1de 158
Wolfgang Betz 67:93bec0baf1de 159 case LOW_BAND:
Wolfgang Betz 67:93bec0baf1de 160 if(Fc<322562500)
Wolfgang Betz 67:93bec0baf1de 161 {
Wolfgang Betz 67:93bec0baf1de 162 SpiritCalibrationSelectVco(VCO_L);
Wolfgang Betz 67:93bec0baf1de 163 }
Wolfgang Betz 67:93bec0baf1de 164 else
Wolfgang Betz 67:93bec0baf1de 165 {
Wolfgang Betz 67:93bec0baf1de 166 SpiritCalibrationSelectVco(VCO_H);
Wolfgang Betz 67:93bec0baf1de 167 }
Wolfgang Betz 67:93bec0baf1de 168 break;
Wolfgang Betz 67:93bec0baf1de 169
Wolfgang Betz 67:93bec0baf1de 170 case MIDDLE_BAND:
Wolfgang Betz 67:93bec0baf1de 171 if(Fc<430083334)
Wolfgang Betz 67:93bec0baf1de 172 {
Wolfgang Betz 67:93bec0baf1de 173 SpiritCalibrationSelectVco(VCO_L);
Wolfgang Betz 67:93bec0baf1de 174 }
Wolfgang Betz 67:93bec0baf1de 175 else
Wolfgang Betz 67:93bec0baf1de 176 {
Wolfgang Betz 67:93bec0baf1de 177 SpiritCalibrationSelectVco(VCO_H);
Wolfgang Betz 67:93bec0baf1de 178 }
Wolfgang Betz 67:93bec0baf1de 179 break;
Wolfgang Betz 67:93bec0baf1de 180
Wolfgang Betz 67:93bec0baf1de 181 case HIGH_BAND:
Wolfgang Betz 67:93bec0baf1de 182 if(Fc<860166667)
Wolfgang Betz 67:93bec0baf1de 183 {
Wolfgang Betz 67:93bec0baf1de 184 SpiritCalibrationSelectVco(VCO_L);
Wolfgang Betz 67:93bec0baf1de 185 }
Wolfgang Betz 67:93bec0baf1de 186 else
Wolfgang Betz 67:93bec0baf1de 187 {
Wolfgang Betz 67:93bec0baf1de 188 SpiritCalibrationSelectVco(VCO_H);
Wolfgang Betz 67:93bec0baf1de 189 }
Wolfgang Betz 67:93bec0baf1de 190 }
Wolfgang Betz 67:93bec0baf1de 191
Wolfgang Betz 67:93bec0baf1de 192 /* Search the VCO charge pump word and set the corresponding register */
Wolfgang Betz 67:93bec0baf1de 193 wcp = SpiritRadioSearchWCP(Fc);
Wolfgang Betz 67:93bec0baf1de 194
Wolfgang Betz 67:93bec0baf1de 195 synthWord = (uint32_t)(lFBase*(((double)(FBASE_DIVIDER*cRefDiv*s_vectcBHalfFactor[band]))/SpiritRadioGetXtalFrequency()));
Wolfgang Betz 67:93bec0baf1de 196
Wolfgang Betz 67:93bec0baf1de 197 /* Build the array of registers values for the analog part */
Wolfgang Betz 67:93bec0baf1de 198 anaRadioRegArray[0] = (uint8_t)(((synthWord>>21)&(0x0000001F))|(wcp<<5));
Wolfgang Betz 67:93bec0baf1de 199 anaRadioRegArray[1] = (uint8_t)((synthWord>>13)&(0x000000FF));
Wolfgang Betz 67:93bec0baf1de 200 anaRadioRegArray[2] = (uint8_t)((synthWord>>5)&(0x000000FF));
Wolfgang Betz 67:93bec0baf1de 201 anaRadioRegArray[3] = (uint8_t)(((synthWord&0x0000001F)<<3)| s_vectcBandRegValue[band]);
Wolfgang Betz 67:93bec0baf1de 202
Wolfgang Betz 67:93bec0baf1de 203 /* Configures the needed Analog Radio registers */
Wolfgang Betz 67:93bec0baf1de 204 g_xStatus = SpiritSpiWriteRegisters(SYNT3_BASE, 4, anaRadioRegArray);
jmhong 84:45b9ff78a066 205
jmhong 84:45b9ff78a066 206 return 0;
Wolfgang Betz 67:93bec0baf1de 207 }
Wolfgang Betz 67:93bec0baf1de 208
Wolfgang Betz 67:93bec0baf1de 209 uint8_t SpiritManagementWaVcoCalibration(void)
Wolfgang Betz 67:93bec0baf1de 210 {
Wolfgang Betz 67:93bec0baf1de 211 uint8_t s_cVcoWordRx;
Wolfgang Betz 67:93bec0baf1de 212 uint8_t s_cVcoWordTx;
Wolfgang Betz 67:93bec0baf1de 213 uint32_t nFreq;
Wolfgang Betz 67:93bec0baf1de 214 uint8_t cRestore = 0;
Wolfgang Betz 67:93bec0baf1de 215 uint8_t cStandby = 0;
Wolfgang Betz 67:93bec0baf1de 216 uint32_t xtal_frequency = SpiritRadioGetXtalFrequency();
Wolfgang Betz 67:93bec0baf1de 217
jmhong 84:45b9ff78a066 218 int iRet = 0;
jmhong 84:45b9ff78a066 219
Wolfgang Betz 67:93bec0baf1de 220 /* Enable the reference divider if the XTAL is between 48 and 52 MHz */
Wolfgang Betz 67:93bec0baf1de 221 if(xtal_frequency>DOUBLE_XTAL_THR)
Wolfgang Betz 67:93bec0baf1de 222 {
Wolfgang Betz 67:93bec0baf1de 223 if(!SpiritRadioGetRefDiv())
Wolfgang Betz 67:93bec0baf1de 224 {
Wolfgang Betz 67:93bec0baf1de 225 cRestore = 1;
Wolfgang Betz 67:93bec0baf1de 226 nFreq = SpiritRadioGetFrequencyBase();
Wolfgang Betz 67:93bec0baf1de 227 SpiritRadioSetRefDiv(S_ENABLE);
jmhong 84:45b9ff78a066 228 //180621 HJM : 여기(아래) 수정함
jmhong 84:45b9ff78a066 229 iRet = SpiritManagementSetFrequencyBase(nFreq);
jmhong 84:45b9ff78a066 230 if (RETURN_ERROR_NUMBER == iRet)
jmhong 84:45b9ff78a066 231 {
jmhong 84:45b9ff78a066 232 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 233 }
Wolfgang Betz 67:93bec0baf1de 234 }
Wolfgang Betz 67:93bec0baf1de 235 }
Wolfgang Betz 67:93bec0baf1de 236 nFreq = SpiritRadioGetFrequencyBase();
Wolfgang Betz 67:93bec0baf1de 237
Wolfgang Betz 67:93bec0baf1de 238 /* Increase the VCO current */
Wolfgang Betz 67:93bec0baf1de 239 uint8_t tmp = 0x19; SpiritSpiWriteRegisters(0xA1,1,&tmp);
Wolfgang Betz 67:93bec0baf1de 240
Wolfgang Betz 67:93bec0baf1de 241 SpiritCalibrationVco(S_ENABLE);
Wolfgang Betz 67:93bec0baf1de 242
Wolfgang Betz 67:93bec0baf1de 243 SpiritRefreshStatus();
jmhong 83:54b207156a91 244 printf("test 9-3 g_xStatus.MC_STATE : [0x%02X] \n", g_xStatus.MC_STATE);
Wolfgang Betz 67:93bec0baf1de 245 if(g_xStatus.MC_STATE == MC_STATE_STANDBY)
Wolfgang Betz 67:93bec0baf1de 246 {
Wolfgang Betz 67:93bec0baf1de 247 cStandby = 1;
Wolfgang Betz 67:93bec0baf1de 248 SpiritCmdStrobeReady();
jmhong 83:54b207156a91 249 printf("test 9-3 1 g_xStatus.MC_STATE : [0x%02X] \n", g_xStatus.MC_STATE);
jmhong 84:45b9ff78a066 250 do
jmhong 84:45b9ff78a066 251 {
Wolfgang Betz 67:93bec0baf1de 252 SpiritRefreshStatus();
jmhong 84:45b9ff78a066 253 printf("test 9-3 2 g_xStatus.MC_STATE : [0x%02X]\n", g_xStatus.MC_STATE);
Wolfgang Betz 67:93bec0baf1de 254 if(g_xStatus.MC_STATE == 0x13)
Wolfgang Betz 67:93bec0baf1de 255 {
Wolfgang Betz 67:93bec0baf1de 256 return 1;
Wolfgang Betz 67:93bec0baf1de 257 }
jmhong 84:45b9ff78a066 258
jmhong 84:45b9ff78a066 259 ++iSpiritManagementErrorCounting;
jmhong 84:45b9ff78a066 260 if (iSpiritManagementErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 261 {
jmhong 84:45b9ff78a066 262 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 263 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 264 }
jmhong 84:45b9ff78a066 265
Wolfgang Betz 67:93bec0baf1de 266 }while(g_xStatus.MC_STATE != MC_STATE_READY);
Wolfgang Betz 67:93bec0baf1de 267 }
jmhong 84:45b9ff78a066 268 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 269
jmhong 84:45b9ff78a066 270
jmhong 84:45b9ff78a066 271
jmhong 84:45b9ff78a066 272
Wolfgang Betz 67:93bec0baf1de 273
Wolfgang Betz 67:93bec0baf1de 274 SpiritCmdStrobeLockTx();
jmhong 83:54b207156a91 275 printf("test 9-4 g_xStatus.MC_STATE : [0x%02X] \n", g_xStatus.MC_STATE);
jmhong 84:45b9ff78a066 276 do
jmhong 84:45b9ff78a066 277 {
Wolfgang Betz 67:93bec0baf1de 278 SpiritRefreshStatus();
jmhong 83:54b207156a91 279 printf("test 9-4 1 g_xStatus.MC_STATE : [0x%02X] \n", g_xStatus.MC_STATE);
Wolfgang Betz 67:93bec0baf1de 280 if(g_xStatus.MC_STATE == 0x13)
Wolfgang Betz 67:93bec0baf1de 281 {
Wolfgang Betz 67:93bec0baf1de 282 return 1;
Wolfgang Betz 67:93bec0baf1de 283 }
jmhong 84:45b9ff78a066 284
jmhong 84:45b9ff78a066 285 ++iSpiritManagementErrorCounting;
jmhong 84:45b9ff78a066 286 if (iSpiritManagementErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 287 {
jmhong 84:45b9ff78a066 288 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 289 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 290 }
jmhong 84:45b9ff78a066 291
Wolfgang Betz 67:93bec0baf1de 292 }while(g_xStatus.MC_STATE != MC_STATE_LOCK);
jmhong 84:45b9ff78a066 293 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 294
jmhong 84:45b9ff78a066 295
jmhong 84:45b9ff78a066 296
jmhong 84:45b9ff78a066 297
Wolfgang Betz 67:93bec0baf1de 298
Wolfgang Betz 67:93bec0baf1de 299 s_cVcoWordTx = SpiritCalibrationGetVcoCalData();
Wolfgang Betz 67:93bec0baf1de 300
Wolfgang Betz 67:93bec0baf1de 301 SpiritCmdStrobeReady();
jmhong 83:54b207156a91 302 printf("test 9-5 g_xStatus.MC_STATE : [0x%02X] \n", g_xStatus.MC_STATE);
Wolfgang Betz 67:93bec0baf1de 303 do{
Wolfgang Betz 67:93bec0baf1de 304 SpiritRefreshStatus();
jmhong 84:45b9ff78a066 305
jmhong 84:45b9ff78a066 306 ++iSpiritManagementErrorCounting;
jmhong 84:45b9ff78a066 307 if (iSpiritManagementErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 308 {
jmhong 84:45b9ff78a066 309 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 310 // reset_board();
jmhong 84:45b9ff78a066 311 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 312 }
jmhong 84:45b9ff78a066 313
Wolfgang Betz 67:93bec0baf1de 314 }while(g_xStatus.MC_STATE != MC_STATE_READY);
jmhong 84:45b9ff78a066 315 iSpiritManagementErrorCounting = 0;
Wolfgang Betz 67:93bec0baf1de 316
Wolfgang Betz 67:93bec0baf1de 317
Wolfgang Betz 67:93bec0baf1de 318 SpiritCmdStrobeLockRx();
Wolfgang Betz 67:93bec0baf1de 319
Wolfgang Betz 67:93bec0baf1de 320 do{
Wolfgang Betz 67:93bec0baf1de 321 SpiritRefreshStatus();
Wolfgang Betz 67:93bec0baf1de 322 if(g_xStatus.MC_STATE == 0x13)
Wolfgang Betz 67:93bec0baf1de 323 {
Wolfgang Betz 67:93bec0baf1de 324 return 1;
Wolfgang Betz 67:93bec0baf1de 325 }
jmhong 84:45b9ff78a066 326
jmhong 84:45b9ff78a066 327 ++iSpiritManagementErrorCounting;
jmhong 84:45b9ff78a066 328 if (iSpiritManagementErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 329 {
jmhong 84:45b9ff78a066 330 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 331 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 332 }
jmhong 84:45b9ff78a066 333
Wolfgang Betz 67:93bec0baf1de 334 }while(g_xStatus.MC_STATE != MC_STATE_LOCK);
jmhong 84:45b9ff78a066 335 iSpiritManagementErrorCounting = 0;
Wolfgang Betz 67:93bec0baf1de 336
Wolfgang Betz 67:93bec0baf1de 337 s_cVcoWordRx = SpiritCalibrationGetVcoCalData();
Wolfgang Betz 67:93bec0baf1de 338
Wolfgang Betz 67:93bec0baf1de 339 SpiritCmdStrobeReady();
Wolfgang Betz 67:93bec0baf1de 340
jmhong 84:45b9ff78a066 341 do
jmhong 84:45b9ff78a066 342 {
Wolfgang Betz 67:93bec0baf1de 343 SpiritRefreshStatus();
Wolfgang Betz 67:93bec0baf1de 344 if(g_xStatus.MC_STATE == 0x13)
Wolfgang Betz 67:93bec0baf1de 345 {
Wolfgang Betz 67:93bec0baf1de 346 return 1;
Wolfgang Betz 67:93bec0baf1de 347 }
jmhong 84:45b9ff78a066 348
jmhong 84:45b9ff78a066 349 ++iSpiritManagementErrorCounting;
jmhong 84:45b9ff78a066 350 if (iSpiritManagementErrorCounting >= MAX_ERROR_COUNTING)
jmhong 84:45b9ff78a066 351 {
jmhong 84:45b9ff78a066 352 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 353 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 354 }
jmhong 84:45b9ff78a066 355
Wolfgang Betz 67:93bec0baf1de 356 }while(g_xStatus.MC_STATE != MC_STATE_READY);
jmhong 84:45b9ff78a066 357 iSpiritManagementErrorCounting = 0;
jmhong 84:45b9ff78a066 358
Wolfgang Betz 67:93bec0baf1de 359
Wolfgang Betz 67:93bec0baf1de 360 if(cStandby == 1)
Wolfgang Betz 67:93bec0baf1de 361 {
Wolfgang Betz 67:93bec0baf1de 362 SpiritCmdStrobeStandby();
Wolfgang Betz 67:93bec0baf1de 363 }
Wolfgang Betz 67:93bec0baf1de 364 SpiritCalibrationVco(S_DISABLE);
Wolfgang Betz 67:93bec0baf1de 365
Wolfgang Betz 67:93bec0baf1de 366 /* Disable the reference divider if the XTAL is between 48 and 52 MHz */
Wolfgang Betz 67:93bec0baf1de 367 if(cRestore)
Wolfgang Betz 67:93bec0baf1de 368 {
Wolfgang Betz 67:93bec0baf1de 369 SpiritRadioSetRefDiv(S_DISABLE);
jmhong 84:45b9ff78a066 370 //180621 HJM : 여기(아래) 수정함
jmhong 84:45b9ff78a066 371 iRet = SpiritManagementSetFrequencyBase(nFreq);
jmhong 84:45b9ff78a066 372 if (RETURN_ERROR_NUMBER == iRet)
jmhong 84:45b9ff78a066 373 {
jmhong 84:45b9ff78a066 374 return RETURN_ERROR_NUMBER;
jmhong 84:45b9ff78a066 375 }
Wolfgang Betz 67:93bec0baf1de 376 }
Wolfgang Betz 67:93bec0baf1de 377
Wolfgang Betz 67:93bec0baf1de 378 /* Restore the VCO current */
Wolfgang Betz 67:93bec0baf1de 379 tmp = 0x11; SpiritSpiWriteRegisters(0xA1,1,&tmp);
Wolfgang Betz 67:93bec0baf1de 380
Wolfgang Betz 67:93bec0baf1de 381 SpiritCalibrationSetVcoCalDataTx(s_cVcoWordTx);
Wolfgang Betz 67:93bec0baf1de 382 SpiritCalibrationSetVcoCalDataRx(s_cVcoWordRx);
Wolfgang Betz 67:93bec0baf1de 383
Wolfgang Betz 67:93bec0baf1de 384 return 0;
Wolfgang Betz 67:93bec0baf1de 385 }
Wolfgang Betz 67:93bec0baf1de 386
Wolfgang Betz 67:93bec0baf1de 387
Wolfgang Betz 67:93bec0baf1de 388 void SpiritManagementWaCmdStrobeTx(void)
Wolfgang Betz 67:93bec0baf1de 389 {
Wolfgang Betz 67:93bec0baf1de 390 if(s_cCommunicationState != COMMUNICATION_STATE_TX)
Wolfgang Betz 67:93bec0baf1de 391 {
Wolfgang Betz 67:93bec0baf1de 392 //uint32_t xtal_frequency = SpiritRadioGetXtalFrequency();
Wolfgang Betz 67:93bec0baf1de 393
Wolfgang Betz 67:93bec0baf1de 394 /* To achive the max output power */
Wolfgang Betz 67:93bec0baf1de 395 if(s_nDesiredFrequency>=150000000 && s_nDesiredFrequency<=470000000)
Wolfgang Betz 67:93bec0baf1de 396 {
Wolfgang Betz 67:93bec0baf1de 397 /* Optimal setting for Tx mode only */
Wolfgang Betz 67:93bec0baf1de 398 SpiritRadioSetPACwc(LOAD_3_6_PF);
Wolfgang Betz 67:93bec0baf1de 399 }
Wolfgang Betz 67:93bec0baf1de 400 else
Wolfgang Betz 67:93bec0baf1de 401 {
Wolfgang Betz 67:93bec0baf1de 402 /* Optimal setting for Tx mode only */
Wolfgang Betz 67:93bec0baf1de 403 SpiritRadioSetPACwc(LOAD_0_PF);
Wolfgang Betz 67:93bec0baf1de 404 }
Wolfgang Betz 67:93bec0baf1de 405
Wolfgang Betz 67:93bec0baf1de 406 uint8_t tmp = 0x11; SpiritSpiWriteRegisters(0xa9, 1, &tmp); /* Enable VCO_L buffer */
Wolfgang Betz 67:93bec0baf1de 407 tmp = 0x20; SpiritSpiWriteRegisters(PM_CONFIG1_BASE, 1, &tmp); /* Set SMPS switching frequency */
Wolfgang Betz 67:93bec0baf1de 408
Wolfgang Betz 67:93bec0baf1de 409 s_cCommunicationState = COMMUNICATION_STATE_TX;
Wolfgang Betz 67:93bec0baf1de 410 }
Wolfgang Betz 67:93bec0baf1de 411 }
Wolfgang Betz 67:93bec0baf1de 412
Wolfgang Betz 67:93bec0baf1de 413
Wolfgang Betz 67:93bec0baf1de 414 void SpiritManagementWaCmdStrobeRx(void)
Wolfgang Betz 67:93bec0baf1de 415 {
Wolfgang Betz 67:93bec0baf1de 416 if(s_cCommunicationState != COMMUNICATION_STATE_RX)
Wolfgang Betz 67:93bec0baf1de 417 {
Wolfgang Betz 67:93bec0baf1de 418 uint8_t tmp = 0x98; SpiritSpiWriteRegisters(PM_CONFIG1_BASE, 1, &tmp); /* Set SMPS switching frequency */
Wolfgang Betz 67:93bec0baf1de 419 SpiritRadioSetPACwc(LOAD_0_PF); /* Set the correct CWC parameter */
Wolfgang Betz 67:93bec0baf1de 420
Wolfgang Betz 67:93bec0baf1de 421 s_cCommunicationState = COMMUNICATION_STATE_RX;
Wolfgang Betz 67:93bec0baf1de 422 }
Wolfgang Betz 67:93bec0baf1de 423 }
Wolfgang Betz 67:93bec0baf1de 424
Wolfgang Betz 67:93bec0baf1de 425 void SpiritManagementWaTRxFcMem(uint32_t nDesiredFreq)
Wolfgang Betz 67:93bec0baf1de 426 {
Wolfgang Betz 67:93bec0baf1de 427 s_cCommunicationState = COMMUNICATION_STATE_NONE;
Wolfgang Betz 67:93bec0baf1de 428 s_nDesiredFrequency = nDesiredFreq;
Wolfgang Betz 67:93bec0baf1de 429 }
Wolfgang Betz 67:93bec0baf1de 430
Wolfgang Betz 67:93bec0baf1de 431
Wolfgang Betz 67:93bec0baf1de 432 void SpiritManagementWaExtraCurrent(void)
Wolfgang Betz 67:93bec0baf1de 433 {
Wolfgang Betz 67:93bec0baf1de 434 uint8_t tmp= 0xCA;SpiritSpiWriteRegisters(0xB2, 1, &tmp);
Wolfgang Betz 67:93bec0baf1de 435 tmp= 0x04;SpiritSpiWriteRegisters(0xA8, 1, &tmp);
Wolfgang Betz 67:93bec0baf1de 436 /* just a read to loose some microsecs more */
Wolfgang Betz 67:93bec0baf1de 437 SpiritSpiReadRegisters(0xA8, 1, &tmp);
Wolfgang Betz 67:93bec0baf1de 438 tmp= 0x00;SpiritSpiWriteRegisters(0xA8, 1, &tmp);
Wolfgang Betz 67:93bec0baf1de 439 }
Wolfgang Betz 67:93bec0baf1de 440
Wolfgang Betz 67:93bec0baf1de 441 /**
Wolfgang Betz 67:93bec0baf1de 442 * @}
Wolfgang Betz 67:93bec0baf1de 443 */
Wolfgang Betz 67:93bec0baf1de 444
Wolfgang Betz 67:93bec0baf1de 445
Wolfgang Betz 67:93bec0baf1de 446
Wolfgang Betz 67:93bec0baf1de 447 /**
Wolfgang Betz 67:93bec0baf1de 448 * @}
Wolfgang Betz 67:93bec0baf1de 449 */
Wolfgang Betz 67:93bec0baf1de 450
Wolfgang Betz 67:93bec0baf1de 451
Wolfgang Betz 67:93bec0baf1de 452 /**
Wolfgang Betz 67:93bec0baf1de 453 * @}
Wolfgang Betz 67:93bec0baf1de 454 */
Wolfgang Betz 67:93bec0baf1de 455
Wolfgang Betz 67:93bec0baf1de 456 /**
Wolfgang Betz 67:93bec0baf1de 457 * @}
Wolfgang Betz 67:93bec0baf1de 458 */
Wolfgang Betz 67:93bec0baf1de 459
Wolfgang Betz 67:93bec0baf1de 460
Wolfgang Betz 67:93bec0baf1de 461 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/