센서보드 RF IRQ 테스트 중
Fork of stm-spirit1-rf-driver by
source/libs/spirit1/SPIRIT1_Library/Src/SPIRIT_Management.c@85:4ca74d007fe7, 2018-09-20 (annotated)
- 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?
User | Revision | Line number | New 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>© 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****/ |